当前位置 博文首页 > yangqisheng的专栏:fgetc库函数使用
fgetc函数从文件流里取出下一个字节并把它作为一个字符返回。当它到达文件尾部或者出现错误时,它返回EOF。怎么区分这两种情况呢?用ferror或feof来判断。(这段话来自经典书籍Linux程序设计)。
int c;
while((c = fgetc(fp)) != EOF)
fputc(c, out);
if(!feof(fp)) // ferror(fp), 这里判断
{
printf("Error\n");
}
while(!feof(fp))
{
c = fgetc(fp);
fputc(c, out);
}
这个就有问题了。如果fgetc读完最后一个字符后,feof(fp)依然返回0(没有结束)。只有再fgetc(fp)一次后,feof(fp)才为非零。这样的话,对于后面这段代码,最后一次while循环时,fgetc取出来的是-1(EOF)。这个我试验了。所以对于第一段代码,一定要注意后面的判断;第二段代码是错误的。
fgetc/fputc函数处理时,由于FILE结构内部带有缓冲,等这个缓冲满时才真正调用系统调用写到文件。那么如果我想验证这个内部缓冲有多大,用什么办法好呢?我刚才实验了个办法:一个线程调用fputc往里写,另外一个通过read读取,看第一次read成功时,读出多少字符。这个想法有个假设:一个线程不断的fputc往文件写,一旦填满内部缓冲,就要写到文件,这时另外一个阻塞在read那里的线程马上读出数据返回。但是这个假设不一定成了。从试验结果看这个办法不行。实验结果:nread = read(fd, buf, sizeof(buf); nread始终等于buf的size。还有没有其它办法呢?在网上没有找个好办法。回头好好想想。
刚才想到个办法:用strace工具查看系统调用次数。从文件中fgetc字符。当读取个数<=4096时,只有1次read系统调用,而读取4097个字符时,有2次read系统调用。由此可断定我的系统中FILE内部缓冲是4096字节。
cs上一篇:多学多思:C语言文件操作函数大全下一篇:没有了
最新 更多<<
yangqisheng的专栏:fgetc库函数使用 多学多思:C语言文件操作函数大全 dangzhangjing97的博客:fopen函数的详解与fclose函数的详解 m0_51723227的博客:数据结构之队列 zhouqiyuan1233的博客:MarkDown 语法 zhouqiyuan1233的博客:常用 Windows Dos 命令 zhouqiyuan1233的博客:Java 开发环境搭建 zhouqiyuan1233的博客:卸载电脑中的 jdk zhouqiyuan1233的博客:第一个 JAVA 程序 zhouqiyuan1233的博客:安装 idea zhouqiyuan1233的博客:Java方法详解 zhouqiyuan1233的博客:实现JDK一键安装并自动配置环境变量 zhouqiyuan1233的博客:Java数组 zhouqiyuan1233的博客:Java面向对象编程 zhouqiyuan1233的博客:Java异常处理 zhouqiyuan1233的博客:一篇文章搞懂 JAVA GUI编程 zhouqiyuan1233的博客:Java实现消息自动发送(附带源码) zhouqiyuan1233的博客:使用支付宝开放平台沙盒环境调用支付宝支 zhouqiyuan1233的博客:使用PHP实现网易云音乐数据的获取 zhouqiyuan1233的博客:Vue基础语法 zhouqiyuan1233的博客:Vue-cli项目环境搭建和使用 zhouqiyuan1233的博客:Vue+ElementUI一个简单登录界面 木木木 的博客:Qt开发之路37---QT creator中Debug、Profile、Re 木木木 的博客:Qt开发之路38---Qt Creator修改ui文件编译无效问 木木木 的博客:Qt开发之路39---Qt pro项目检测编译器版本(64位 LY的博客:TENSORFLOW 使用colab 学习MNSIT 案例 LY的博客:机器学习SVC分类预测三个月后的股价 LY的博客:微软AI面试题解答,2道入门级别 LY的博客:map和reduce LY的博客:使用腾讯ai搭建人机交互play