fgetc库函数使用

来源:互联网 发布:阿里云工程师的待遇 编辑:程序博客网 时间:2024/04/29 05:41

fgetc函数从文件流里取出下一个字节并把它作为一个字符返回。当它到达文件尾部或者出现错误时,它返回EOF。怎么区分这两种情况呢?用ferror或feof来判断。(这段话来自经典书籍Linux程序设计)。

int c;while((c = fgetc(fp)) != EOF)    fputc(c, out);if(!feof(fp)) // ferror(fp), 这里判断{    printf("Error\n");}



如果有人这么写:

while(!feof(fp)){    c = fgetc(fp);    fputc(c, out);}

这个就有问题了。如果fgetc读完最后一个字符后,feof(fp)依然返回0(没有结束)。只有再fgetc(fp)一次后,feof(fp)才为非零。这样的话,对于后面这段代码,最后一次while循环时,fgetc取出来的是-1(EOF)。这个我试验了。所以对于第一段代码,一定要注意后面的判断;第二段代码是错误的。


fgetc/fputc函数处理时,由于FILE结构内部带有缓冲,等这个缓冲满时才真正调用系统调用写到文件。那么如果我想验证这个内部缓冲有多大,用什么办法好呢?我刚才实验了个办法:一个线程调用fputc往里写,另外一个通过read读取,看第一次read成功时,读出多少字符。这个想法有个假设:一个线程不断的fputc往文件写,一旦填满内部缓冲,就要写到文件,这时另外一个阻塞在read那里的线程马上读出数据返回。但是这个假设不一定成了。从试验结果看这个办法不行。实验结果:nread = read(fd, buf, sizeof(buf); nread始终等于buf的size。还有没有其它办法呢?在网上没有找个好办法。回头好好想想。


刚才想到个办法:用strace工具查看系统调用次数。从文件中fgetc字符。当读取个数<=4096时,只有1次read系统调用,而读取4097个字符时,有2次read系统调用。由此可断定我的系统中FILE内部缓冲是4096字节。