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

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

1

2

4

5

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

1

2

3

4

5

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

 #include<stdio.h>
#include<string.h> int main(int argc, const char *argv[])
{
FILE *fp,*fd;
fp = fopen("text.txt","r");
fd = fopen("text1.txt","w");
char a;
int line=;
while((a=(char)fgetc(fp)) > )
{
fputc(a,fd);
if(a == '\n')
{
line++;
if(line==)
{
fputc('',fd);
fputc('\n',fd);
}
}
}
// fflush(fp);
// fflush(fd);
close(fp);
close(fd);
printf("re\n");
if((fp = fopen("text.txt","w")) == NULL)
{
printf("fp error\n");
return -;
}
if((fd = fopen("text1.txt","r")) == NULL)
{
printf("fd errpr\n");
return -;
}
while((a = (char)fgetc(fd)) > )
{
printf("enter\n");
fputc(a,fp);
}
printf("%d\n",a);
close(fp);
close(fd);
return ;
}

这样编译运行,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是写打开的,所以里面就会没有数据。

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

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

linux c fgetc()的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. Linux C 文件输入输出函数 fopen()、getc()/fgetc()、putc()/fputc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解

      fopen(打开文件) 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参 ...

  3. linux文件文件夹递归监控

    引言 今年(2016)年初来到A公司了,刚入职的时候比较缺前端fe,就过来顶了三个月,这段时间学到了好多前端开发的知识,这些都是题外话了.期间接触了一个很好用的前端自动化部署工具 -- fis,其中有 ...

  4. Linux C 收藏

    某招聘要求:熟悉高性能分布式网络服务端设计开发,熟悉epoll.多线程.异步IO.事件驱动等服务端技术: <UNIX环境高级编程(第3版)>apue.h等源码文件的编译安装 <UNI ...

  5. linux c/c++

    string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...

  6. Linux命令学习总结:dos2unix - unix2dos

    命令简介: dos2unix是将Windows格式文件转换为Unix.Linux格式的实用命令.Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2 ...

  7. Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()

    函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...

  8. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  9. linux应用程序开发-文件编程-库函数

    ---恢复内容开始--- c库函数文件操作独立于具体的系统平台,可移植性较好. 库函数-创建和打开 FILE*fopen(const char*filename,const char*mode) mo ...

随机推荐

  1. Python:一些小知识

    小知识点总结 一.Python2与Python3 的区别 1.Python2中可以加括号输出,也可不加输出     Python3中必须加 2.python2 中有xrange(生成器)也有range ...

  2. caffe整体框架的学习的博客,这个博客山寨了一个caffe框架

    http://www.cnblogs.com/neopenx/default.html?page=1 这个博主很牛逼,写的东西也很好,多学学,无论是对框架,还是对自己学习c++帮助都非常大

  3. Angular 引用库

    <!doctype html> <html ng-app> <head> <script src="http://code.angularjs.or ...

  4. Webpack2入门

    webpack 2 将在其文档完成之后正式发布.但这并不意味着不可以开始使用它,如果你知道怎么配置的话. 什么是 Webpack? 简单来说,Webpack 就是一个针对 JavaScript 代码的 ...

  5. 【洛谷P1978】 集合

    集合 题目链接 显然,我们是要把数据先排序的, 然后从大到小枚举每个数,看是否能选上, 能选就选,不能拉倒 若能,二分查找a[i]/k,若查找成功,ans++ 将a[i]/k标记为不能选择 最后输出答 ...

  6. 【luogu P3368 树状数组2】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3368 #include<iostream> #include<cstdio> #in ...

  7. java循环作业0912

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? double a = 0.08; double h =0; int i=0; for(i=1;h&l ...

  8. C语言输出格式

    1 一般格式    printf(格式控制,输出表列)    例如:printf("i=%d,ch=%c\n",i,ch);    说明:    (1)“格式控制”是用双撇号括起来 ...

  9. 开发工具--Eclipse使用及常见问题解决

    怎么查询Eclipse版本号: 方法一: 方法二: Eclipse安装目录下面找到readme文件夹,里边有个网页打开就可以看到当前版本; Eclipse汉化改为英文: Eclipse Mybatis ...

  10. oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )

    Oracle支持两种类型的聚簇:索引聚簇和哈希聚簇 一.索引聚簇表的原理 聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中 聚簇还表示把相关的数据存储在同一个块上.利用聚簇,一个块可 ...