c - 读取损坏的文件,段错误

标签 c linux bash

我通过传递一堆这样的目录来运行我的程序:

./myprogram *

每个目录都是一组单独的文件,我正在解析这些文件以获取数据,然后将这些文件创建到电子表格中。每个目录都是电子表格的不同行。我只想将可靠数据放入电子表格中,因此如果缺少某个条目,我会将其删除。它似乎在大多数目录上运行良好,但在某些目录上,我在我的一个解析函数中遇到了段错误。

我注意到每个导致段错误的文件都无法用 gedit 打开。它给出了这个错误:

gedit 无法检测字符编码。 请检查您是否在尝试打开二进制文件。 从菜单中选择一个字符编码,然后重试。

但是,我可以使用 cat 或 tail 命令显示文件。

导致段错误的具体函数是下面的 fscanf 函数,我用它一次读取一行。 (增加缓冲区的大小没有帮助)

 char *line = malloc(1000*sizeof(char));
 char *garbage = malloc(1000*sizeof(char));
 while(!feof(infile) )
 {
     fscanf(infile,"%[^\n]%[\n]",line,garbage);
     //parse the line
 }

有谁知道为什么文件可能无法用 gedit 打开?它损坏了吗?有没有一种方法可以在我的解析函数中返回错误代码而不是段错误?

最佳答案

您在 fscanf() 中发生缓冲区溢出。这可能导致程序写入数组末尾,覆盖某处的指针,然后崩溃。

您的选择是:

使用 fgets() 将一行读入输入缓冲区,并在必要时使用 sscanf() 解析它,可能是你想要的,或者

告诉 fscanf() 缓冲区的大小,例如fscanf(infile, "%999[^\n]%*[\n]", line );

此外,您几乎不需要 while (!feof(infile))。这将在读取过去 文件结尾时停止。

所以你真的应该把它改成:

static const size_t LINE_LEN = 1000;
while (fgets( line, LINE_LEN, infile ))
  /* Do stuff with line. */

或者

while ( 1 == fscanf( infile, " %999[^\n]%*[\n]", line ) )
  /* Do stuff with line. */

关于c - 读取损坏的文件,段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33531355/

相关文章:

c - OpenMPI 阻塞接收数组无法正常工作(在某些情况下程序不会停止)

c - 需要有关 C 语言基本程序的帮助

c++ - 如何在C中定义函数指针数组

linux - 多次 ssh 登录/注销

c - 通过 BASH 在 C 中指定命令行参数

linux - shell getopts参数收集问题

c - gethostbyname() 未知错误

linux - 限制硬盘驱动器访问

linux - bash脚本从文件中读取数字

Linux 低延迟 tcp 流