linux c fgetc()
今天练习代码的时候碰见这样一个问题:
一个文件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()的更多相关文章
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- 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字符串包含欲打开的文件路径及文件名,参 ...
- linux文件文件夹递归监控
引言 今年(2016)年初来到A公司了,刚入职的时候比较缺前端fe,就过来顶了三个月,这段时间学到了好多前端开发的知识,这些都是题外话了.期间接触了一个很好用的前端自动化部署工具 -- fis,其中有 ...
- Linux C 收藏
某招聘要求:熟悉高性能分布式网络服务端设计开发,熟悉epoll.多线程.异步IO.事件驱动等服务端技术: <UNIX环境高级编程(第3版)>apue.h等源码文件的编译安装 <UNI ...
- linux c/c++
string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...
- Linux命令学习总结:dos2unix - unix2dos
命令简介: dos2unix是将Windows格式文件转换为Unix.Linux格式的实用命令.Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2 ...
- Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()
函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...
- Linux下的C编程实战
Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...
- linux应用程序开发-文件编程-库函数
---恢复内容开始--- c库函数文件操作独立于具体的系统平台,可移植性较好. 库函数-创建和打开 FILE*fopen(const char*filename,const char*mode) mo ...
随机推荐
- 安卓Socket开发注意事项
如果要在安卓app里用到Socket通信,要满足: 1.在写代码的activity里import进Socket相关的包,这个很easy,如果你不知道要import什么包,也可以先不指定,可 ...
- 【转载】#440 - A Class Can Implement More than One Interface
It's possible for a class to implement more than one interface. For example, a Cow class might imple ...
- React.js 中文文档
转自http://react-china.org/t/react-js/398的jsgeeker 中文文档地址 http://reactjs.cn GitHub地址 https://github.co ...
- UnitySendMessage
SendMessage查找的方法是在自身当中去查找 SendMessageUpwards查找的方法是在自身和父类中去查找,如果父类还有父类,继续查找,知道找到根节点为止. BroadcastMessa ...
- P2382 化学分子式
luogu的oier化学一定都很好 这个题是让我们模拟计算化学方程式的过程. 和时间复杂度类似的题目. 我们可以根据括号,将求解分成若干个步骤. 从外部看,需要将一对括号看做一个整体.然后进行计算. ...
- Zookeeper watch参照表
Watcher 设置是开发中最常见的,需要搞清楚watcher的一些基本特征,对于exists.getdata.getchild对于节点的不同操 作会收到不同的 watcher信息.对父节点的变更以及 ...
- visual assist x vs2012不智能提示
今天装了visual assist x,但是在vs2012里不智能提示,在哪里看了看.找到了开关. 我英文不好.... 默认的话是不选中的.
- Ajax,Json数据格式
同步和异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随 意做其他事 ...
- 推荐几个Mac/Linux下比较好用的工具
1.Tmux,连接开发机可以让在任务在开发机一直执行,不用nohup &这种了也相对稳定,还有session可以记录当时的状态. 常用命令: tmux new -s name 指定名字开启一个 ...
- android 多线程 异步消息处理 服务 学习笔记 (六)
三种多线程编程方法 1 class Mythread extends Thread{ @Override public void run(){} } new Mythread().start() 2 ...