码迷,mamicode.com
首页 > 系统相关 > 详细

linux c fgetc()

时间:2018-07-28 15:14:03      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:错误   问题   读数   stdio.h   man   fputc   ring   linu   argv   

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

一个文件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 == \n)
15             {
16                 line++;
17                 if(line==2)
18                 {
19                     fputc(3,fd);
20                     fputc(\n,fd);
21                 }
22             }
23         }
24 //    fflush(fp);
25 //    fflush(fd);
26     close(fp);
27     close(fd);
28     printf("re\n");
29     if((fp = fopen("text.txt","w")) == NULL)
30     {
31         printf("fp error\n");
32         return -1;
33     }
34     if((fd = fopen("text1.txt","r")) == NULL)
35     {
36         printf("fd errpr\n");
37         return -1;
38     }
39     while((a = (char)fgetc(fd)) > 0)
40     {
41         printf("enter\n");
42         fputc(a,fp);
43     }
44     printf("%d\n",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 \n 2 \n 4 \n 5 \n -1(这里负一代表文件末尾了,具体解释请  MAN  fgetc),在关闭IO流之后(未刷新),在打开IO流,缓冲区中的数据依然存在,此时在读取text1.txt中的数据,笔者猜测缓冲区的数据应该是这样的  1\n 2\n 4\n 5\n -1,因为之前读到  -1时并没有在往下读数据了,此时缓冲区的位置符仍然停留在-1处,在第二次读取时直接读的负一然后循环就不执行了,就无法向text.txt中赋值数据,又因为text.txt是写打开的,所以里面就会没有数据。

linux c fgetc()

标签:错误   问题   读数   stdio.h   man   fputc   ring   linu   argv   

原文地址:https://www.cnblogs.com/jiaan/p/9381749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!