当前位置 博文首页 > yangqisheng的专栏:fgetc库函数使用

    yangqisheng的专栏:fgetc库函数使用

    作者:[db:作者] 时间:2021-08-09 22:23

    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字节。

    
    
    
    
    
    
    
    
    
    
    
    
    cs
    下一篇:没有了