linux c fgetc()

Posted 子都

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是写打开的,所以里面就会没有数据。

以上是关于linux c fgetc()的主要内容,如果未能解决你的问题,请参考以下文章

使用 fgetc 读取 gpio 的 linux sysfs

C 语言文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )

[linux][c/c++]代码片段01

[linux][c/c++]代码片段02

read()的Linux C

C语言 文件读写 fgetc 函数