阅读损坏的文件,分段错误

时间:2015-11-04 20:26:30

标签: 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打开?它被破坏了吗?有没有办法可以在我的解析函数中返回错误代码而不是seg faulting?

1 个答案:

答案 0 :(得分:1)

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. */