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 ...
随机推荐
- oracle模糊搜索避免使用like,替换为instr()
oracle中instr()函数用法 instr(name,'张三')>0 相当于 name like '%张三%' instr(name,'张三')=1 相当于 name like ' ...
- March 2 2017 Week 9 Thursday
The first duty of love is to listen. 爱的首要责任是倾听. Yesterday, I read an article that says a successful ...
- 如何查找Fiori UI上某个字段对应的后台存储表的名称
今天微信群里有朋友问到这个问题. 如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成. 比如我想知道下图"Sales Unit"这个字段的值到底保存在哪 ...
- python入门12 列表list
列表使用率较高,方法也多. 列表的定义 #coding:utf-8 #/usr/bin/python """ 2018-11-10 dinghanhua 列表 " ...
- pymongo 常用操作函数
pymongo 是 mongodb 的 python Driver Editor. 记录下学习过程中感觉以后会常用多一些部分,以做参考. 1. 连接数据库 要使用pymongo最先应该做的事就是先连上 ...
- Asp.net网站优化【转】
阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不 ...
- POSIX 线程详解(经典必看)
http://www.cnblogs.com/sunminmin/p/4479952.html 总共三部分: 第一部分:POSIX 线程详解 ...
- 从零开始Vue项目实战(一)-准备篇
从前参与过一个react项目的代码编写,大神搭建的框架,我主要负责业务逻辑代码编写,现在回想起来似乎又什么都不会,现在为了巩固前端知识,决定用Vue来做这个项目的移动端网站,我本人Vue是从零开始的, ...
- python:常用模块二
1,hashlib模块---摘要算法 import hashlib md5 = hashlib.md5() md5.update('how to use md5 in python hashlib?' ...
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...