【发布时间】:2014-06-13 19:55:20
【问题描述】:
考虑下面的 C 代码,尽管非常混乱:
#include<stdio.h>
int main() {
char buf[3]; //a new, small buffer
FILE *fp = fopen("test.txt", "r"); //our test file, with the contents "123abc"
setvbuf(fp, buf, _IOFBF, 2); //we assign our small buffer as fp's buffer \
//in fully buffered mode
char character = fgetc(fp); // get the first character...
character = fgetc(fp); // and the next...
character = fgetc(fp); // and the next... (third character, '3')
buf[2] = '\0'; //add a terminating line for display
fputs(buf, stderr); //write our buffer to stderr, should show up immediately
}
编译和运行代码将打印“3a”作为我们自己指定的缓冲区 buf 的内容。我的问题是:这个缓冲区是如何被填满的? 调用 fgetc() 是否意味着多次调用,直到缓冲区填满然后停止(我们只调用了三个 fgetc,其中不应该包括现在'a')?第一个缓冲区是“12”,所以这是否意味着当进行另一个 fgetc() 调用并且指针引用缓冲区范围之外的内容时,是清除缓冲区然后用下一个数据块填充,还是简单地覆盖?我了解缓冲区大小取决于平台,因此我更关心通常情况下,读取模式下的 fopen()ed 流如何将字符拉入其缓冲区。
【问题讨论】:
-
“缓冲区是被清除然后用下一个数据块填充,还是直接被覆盖”——我不确定会有什么区别?