따라서 FILE 스트림은 입출력 버퍼를 모두 가질 수 있습니다. setvbuf
을 사용하여 출력 스트림을 조정할 수 있습니다 (입력 버퍼 크기 및 동작으로 재생할 수있는 방법을 알지 못합니다).기본 파일 입출력 버퍼링?
또한 기본적으로 버퍼는 BUFSIZ
(이것이 POSIX 또는 C 일 경우 확실하지 않음)입니다. stdin
/stdout
/stderr
의 의미가 무엇인지는 분명하지만 새로 열리는 파일의 기본값은 무엇입니까? 입력과 출력 모두를 위해 버퍼링됩니까? 아니면 그냥 하나?
버퍼링되면 출력이 블록 또는 회선 모드로 기본 설정됩니까?
편집 : Jonathan Leffler의 답변이 실제 프로그램에 어떻게 영향을 주 었는지 확인하기 위해 몇 가지 테스트를 수행했습니다. 만약 당신이 다음에 쓰기를 읽는 것 같습니다. write에 의해, 입력 버퍼의 미사용 부분이 완전히 드롭됩니다. 사실, 올바른 파일 오프셋을 유지하기 위해 수행되는 탐색이있을 것입니다.
/* input file contains "ABCDEFGHIJKLMNOPQRSTUVWXYZ" */
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *f = fopen("test.txt", "r+b");
char ch;
fread(&ch, 1, 1, f);
fwrite("test", 4, 1, f);
fclose(f);
return 0;
}
는 다음과 같은 시스템의 결과
호출 :read(3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n", 4096) = 27 // attempt to read 4096 chars, got 27
lseek(3, -26, SEEK_CUR) = 1 // at this point, I've done my write already, so forget the 26 chars I never asked for and seek to where I should be if we really just read one character...
write(3, "test", 4) = 4 // and write my test
close(3) = 0
이 내가 그들에게 표준 라이브러리가 될 수있는 방법으로 지금까지 매우 흥미로운 일이 될 것으로 명확하게 구현 세부 사항은 동안 나는이 간단한 테스트 프로그램을 사용 구현. 귀하의 통찰력있는 답변을 주신 Jonathan에게 감사드립니다.
BUFSIZ는 C 표준에 속하므로 POSIX에도 있습니다. –
정의되지 않은 동작 :'fread()'와'fwrite()'사이에서'fseek()'해야합니다. 그렇지 않으면, 구현이 만족스럽지 않을 수 있습니다. –