zoukankan      html  css  js  c++  java
  • 别再用"while (!feof(file))"来逐行读取txt文件了!

    起因

    执行一个C/C++程序出现segment fault。它逐行读取文本文件,每一行是一个图片名字,然后读图、处理图像,etc。
    发现最后一次读取的文件名不存在(空的)。

    正确的逐行读取txt文件

    这是正确的写法:

    #include <stdio.h>
    #include <string.h>
    
    int main(){
        FILE* fp = fopen("/home/zz/images/face.txt", "r");
    
        char line[1024];
    
        void* ret;
        while(1) {
            memset(line, 0, sizeof(line));
            ret = fgets(line, sizeof(line), fp);
            if(ret==NULL) break;
            line[strlen(line)-1] = ''; // trim '
    '
            printf("line is: %s!
    ", line);
        }
    
        fclose(fp);
    
        return 0;
    }
    

    使用while (!feof(file))来逐行读取txt是错误

    简单说就是,如果用while (!feof(file)),那么会比文件内容多一行。至于读取到什么,看你的buffer有没有每次做memset,如果有那么读取到空的;如果没有,读取到上一次的。

    原理上,feof()操作是主动去查看文件流指针file是否到达了EOF。执行这个判断时并没有“进行下一次读取”。因此,即便已经读取完了文件最后一行,因为feof()不会把文件流指针file前移,因此得到的判断仍然是“现在不是EOF”。进而执行下一行的读取(不正确的读取)。

    其实文件系统也好,并发也好,我们应该直接去读取,然后判断读取后的返回值是否为EOF或别的;而不是先去查询当前是否为EOF,然后再读取。

    参考

    Why is “while (!feof(file))” always wrong?

  • 相关阅读:
    基于VIP的keepalived高可用架构
    高性能Nginx最佳实践
    Ubuntu安装Nginx
    Synchronized总结及底层原理分析#网易微专业# #Java#
    springboot Restful开发
    Volatile详解
    IOC知识点详细汇总
    python 一个函数让你决定你的二维码
    用python批量生成简单的xml文档
    基于tensorflow搭建一个神经网络
  • 原文地址:https://www.cnblogs.com/zjutzz/p/10394207.html
Copyright © 2011-2022 走看看