흐름 기반 I/O 는 다음 과 같은 세 가지 버퍼 를 제공 합 니 다: 전체 버퍼, 줄 버퍼, 무 버퍼
스 트림 기반 I/O 는 다음 세 가지 버퍼 를 제공 합 니 다.
전체 버퍼: 버퍼 가 채 워 질 때 까지 시스템 I/O 함 수 를 호출 합 니 다.읽 기 동작 에 있어 읽 은 내용 의 바이트 수가 버퍼 크기 나 파일 이 끝 날 때 까지 실제 I/O 작업 을 하고 외부 파일 내용 을 버퍼 에 읽 습 니 다.쓰기 작업 에 있어 서 버퍼 가 채 워 질 때 까지 실제 I/O 작업 을 하고 버퍼 내용 을 외부 저장 파일 에 기록 합 니 다.디스크 파일 은 보통 모든 버퍼 입 니 다.
줄 버퍼: 줄 바 꿈 문자 '를 만 날 때 까지 시스템 I/O 라 이브 러 리 함 수 를 호출 합 니 다.읽 기 동작 에 있어 서 줄 바 꿈 문자 '를 만 나 서 I/O 작업 을 하고 읽 은 내용 을 버퍼 에 읽 습 니 다.쓰기 동작 에 있어 서 줄 바 꿈 문자 '를 만 나 서 I/O 작업 을 하고 버퍼 내용 을 외부 저장 소 에 기록 합 니 다.버퍼 의 크기 가 제한 되 어 있 기 때문에 버퍼 가 가득 찼 을 때 줄 바 꿈 문자 '를 만 나 지 않 아 도 실제 I/O 작업 을 합 니 다.표준 입력 stdin 과 표준 출력 stdout 은 기본적으로 줄 버퍼 입 니 다.
버퍼 없 음: 버퍼 가 없 으 면 데 이 터 를 외부 파일 과 장치 에 즉시 읽 거나 출력 합 니 다.표준 오류 stderr 는 버퍼 가 없습니다. 이렇게 하면 오류 알림 과 출력 이 사용자 에 게 신속하게 피드백 되 어 오 류 를 제거 할 수 있 습 니 다.
상기 3 가지 버퍼 는 각각 3 개의 매크로 로 정의 되 는데 그 정 의 는 표 21 - 1 과 같다.
표 21 - 1 버퍼 형식의 매크로 정의
버퍼 종류
정 하 다 의리 의 거대 하 다.
풀 버퍼
_IO_FULL_BUF
행 버퍼
_IO_LINE_BUF
버퍼 없 음
_IO_UNBUFFERED
위 표 에서 말 한 버퍼 형식 매크로 를 사용 할 때 파일 흐름 대상 의 버퍼 표지 와 이 매크로 를 '와' 작업 을 해 야 합 니 다. 결과 가 0 인지 여 부 를 판단 하면 이 버퍼 파일 흐름 의 버퍼 가 이 형식 에 속 하 는 지 알 수 있 습 니 다.파일 흐름 을 가 져 오 는 버퍼 형식 을 보 여 줍 니 다.이 프로그램 은 표준 출력, 표준 입력, 표준 오류 3 개의 파일 설명자 의 버퍼 형식, 버퍼 크기 등 정 보 를 출력 합 니 다.
(1) vi 편집기 에서 이 프로그램 을 다음 과 같이 편집 합 니 다.
프로그램 목록 21 - 1 buf. c 출력 버퍼 의 종류 와 버퍼 크기
#include <stdio.h>
int main(void)
{
printf("stdin is ");
if(stdin->_flags & _IO_UNBUFFERED)
printf("unbuffered
");
else if(stdin->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stdin->_IO_buf_end -
stdin->_IO_buf_base);
printf("discriptor is %d
", fileno(stdin));
printf("stdout is ");
if(stdout->_flags & _IO_UNBUFFERED)
printf("unbuffered
");
else if(stdout->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stdout->_IO_buf_end -
stdout->_IO_buf_base);
printf("discriptor is %d
", fileno(stdout));
printf("stderr is ");
if(stderr->_flags & _IO_UNBUFFERED)
printf("unbuffered
");
else if(stderr->_flags & _IO_LINE_BUF)
printf("line-buffered
");
else
printf("fully-buffered
");
printf("buffer size is %d
", stderr->_IO_buf_end -
stderr->_IO_buf_base);
printf("discriptor is %d
", fileno(stderr));
return 0;
}
(2) 셸 에서 이 프로그램 을 다음 과 같이 컴 파일 합 니 다.
$gcc buf.c -o buf
(3) 셸 에서 이 프로그램 을 다음 과 같이 실행 합 니 다.
$./buf
stdin is line-buffered
buffer size is 1024
discriptor is 0
stdout is line-buffered
buffer size is 1024
discriptor is 1
stderr is unbuffered
"buffer size is 0
discriptor is 2
(4) 재 설정 을 사용 한 후 이 프로그램 을 다음 과 같이 실행 합 니 다.
$./buf < in.txt 1> out.txt 2> err.txt
stdin is full-buffered
buffer size is 4096
discriptor is 0
stdout is full-buffered
buffer size is 4096
discriptor is 1
stderr is unbuffered
"buffer size is 0
discriptor is 2
설명: 이 를 통 해 알 수 있 듯 이 언제든지 표준 오류 가 발생 하면 버퍼 링 이 없다.
.이렇게 하면 오류 정 보 를 제때에 사용자 에 게 출력 하여 사용자 가 오 류 를 제거 하고 문 제 를 해결 하도록 보장 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 입출력 I/O스트림(stream) 자바에서 입출력을 수행하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다. 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.