• linux c fgetc()


    今天练习代码的时候碰见这样一个问题: 

    一个文件test.txt,文件内容为

    1

    2

    4

    5

    在程序中读写这个文件,修改其内容,添加一行,将文件内容变成:

    1

    2

    3

    4

    5

    楼主的错误代码是这样的:

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 int main(int argc, const char *argv[])
     5 {
     6     FILE *fp,*fd;
     7     fp = fopen("text.txt","r");
     8     fd = fopen("text1.txt","w");
     9     char a;
    10     int line=0;
    11     while((a=(char)fgetc(fp)) > 0)
    12         {
    13             fputc(a,fd);
    14             if(a == '
    ')
    15             {
    16                 line++;
    17                 if(line==2)
    18                 {
    19                     fputc('3',fd);
    20                     fputc('
    ',fd);
    21                 }
    22             }
    23         }
    24 //    fflush(fp);
    25 //    fflush(fd);
    26     close(fp);
    27     close(fd);
    28     printf("re
    ");
    29     if((fp = fopen("text.txt","w")) == NULL)
    30     {
    31         printf("fp error
    ");
    32         return -1;
    33     }
    34     if((fd = fopen("text1.txt","r")) == NULL)
    35     {
    36         printf("fd errpr
    ");
    37         return -1;
    38     }
    39     while((a = (char)fgetc(fd)) > 0)
    40     {
    41         printf("enter
    ");
    42         fputc(a,fp);
    43     }
    44     printf("%d
    ",a);
    45     close(fp);
    46     close(fd);
    47     return 0;
    48 }

    这样编译运行,text1.txt 中 的内容是 1 2 3 4 5

    但是text.txt 中会没内容。笔者烦恼了一会,之后想起来,标准IO是带缓冲区的,应该是缓冲区这里出毛病了,在程序中加了刷新缓冲区,程序就正常了。(就是将上述程序中的两个注释去掉就可以了。)

    原因如下:采用标准IO打开文件采用的是全缓冲区,等到程序结束 或者 缓冲区满 或者 手动刷新才会将缓冲区中的内容取出。

    在第一次打开并读取完text.txt时,缓冲区的内容是这样  1 2 4 5 -1(这里负一代表文件末尾了,具体解释请  MAN  fgetc),在关闭IO流之后(未刷新),在打开IO流,缓冲区中的数据依然存在,此时在读取text1.txt中的数据,笔者猜测缓冲区的数据应该是这样的  1 2 4 5 -1,因为之前读到  -1时并没有在往下读数据了,此时缓冲区的位置符仍然停留在-1处,在第二次读取时直接读的负一然后循环就不执行了,就无法向text.txt中赋值数据,又因为text.txt是写打开的,所以里面就会没有数据。

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    找到问题了,因为标准IO有缓冲区,实际上在程序运行时,并没有将数据写入TEXT1.TXT   也就是说其中并没有内容。之所以最后在text1.txt中看到了数据,是因为程序结束了,缓冲区中的数据才写入了text1.txt。

  • 相关阅读:
    Nginx 性能优化有这篇就够了!
    Zabbix Web API Get方法整合
    MySQL利用binlog恢复误操作数据(python脚本)
    Tomcat7 1000并发量配置以及配置优化
    MySQL中 如何查询表名中包含某字段的表
    python异步编程之asyncio(百万并发)
    微信支付开发(7) 刷卡支付
    <Android 基础(二十)> CoordinatorLayout Behavior
    实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作
    我和滴滴打车司机的那些事
  • 原文地址:https://www.cnblogs.com/jiaan/p/9381749.html
Copyright © 2020-2023  润新知