起因

执行一个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] = '\0'; // trim '\n'
printf("line is: %s!\n", 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?

别再用"while (!feof(file))"来逐行读取txt文件了!的更多相关文章

  1. python 逐行读取txt文件

    逐行读取txt文件 path = r'D:\123456\1.txt'with open(path, 'r', encoding='utf-8') as f:    for line in f:   ...

  2. 3.C++逐行读取txt文件数据,利用getline -windows编程

      引言:今天学会了getline的用法,顺手编写一个逐行读取txt文件的程序.关于getline的用法可以看我之前的博客:2.C++标准库函数:getline函数 定界流输入截取函数 -zobol的 ...

  3. php逐行读取txt文件写入数组的方法

    使用说明: 采用fopen 方法,逐行读取数据,并使用feof($fp)  判断是否文件截止,最后通过filter() 方法,去除空白行,得到所需数据 $file = fopen("user ...

  4. php逐行读取.txt文件内容,并解析每行内容

    // 读取nlp text 并存到mongodb public function readNLP(&$errorCode,&$errorMessage) { try{ // $_SER ...

  5. 逐行读取txt文件并存入到数组中

    get_file_contents_on_line.php $file = fopen("log.txt", "r"); $user=array(); $i=0 ...

  6. 逐行读取txt文件

    header("Content-type:text/html; charset=utf-8"); $handle = fopen('test.php', 'r') or die(' ...

  7. 逐行读取txt文件,使用Linq与StreamReader的Readline方法

    List<string[]> list = File.ReadLines("YourFile.txt") .Select(r => r.TrimEnd('#')) ...

  8. JAVA逐行读取TXT文件

    package help; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; imp ...

  9. 逐行读取txt文件,分割,写入txt。。。上传,下载

    s = [] f  = open('querylist.txt','r') #由于我使用的pycharm已经设置完了路径,因此我直接写了文件名 for lines in f:     ls = lin ...

随机推荐

  1. Tomcat连接 ideal

    一.为了建立Servlet,我们需要先将Tomact连接到ideal! <%-- Created by IntelliJ IDEA. User: Administrator Date: 2019 ...

  2. OperationCenter Docker容器启动脚本

    docker rm -f OperationCenter rm -f /root/webapps/logs/* image_name="harbor.gfstack.geo/geostack ...

  3. linux 安装所有软件可以使用这个网站搜索RPM包

    #很方便很实用  强烈推荐 https://pkgs.org/

  4. 第六十四天 JS基础操作

    一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...

  5. 满汉全席[2-SAT]

    题面 对不起我又写了一个板题qvq 和洛谷那道模板题没区别...两样菜至少做一样即可 不过注意define和函数的区别!!! #include <cmath> #include <c ...

  6. 帝国cms打开慢

    发现有个站(http://www.953239.com/)打开很慢,改了php版本后,快了一倍

  7. 【linux】linux系统中常见配置文件说明

    1.配置文件/proc/sys/fs/file-nr 里文件里显示三个数字 [root@localhost logs]# cat /proc/sys/fs/file-nr 已分配文件句柄的数目 已使用 ...

  8. pm2自动部署

    配置pm2自动部署前,请确保已经能够ssh免密登录服务器. 一.创建ecosystem.json { "apps" : [{ "name" : "HT ...

  9. GWAS条件分析(conditional analysis)

    一.为什么要做GWAS的条件分析(conditional analysis) 我们做GWAS的时候,经常扫出一堆显著的信号,假设rs121是我们扫出来与某表型最显著相关的位点(P=1.351e-36) ...

  10. txt文件按行处理工具类(可以截取小说、分析日志等)【我】

    txt文件按行处理工具类(可以分析日志.截取小说等) package file; import java.io.BufferedReader; import java.io.BufferedWrite ...