我通过传递一堆像这样的目录来运行我的程序:
./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?
答案 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. */