我需要使用许多文件来查找其中的一些信息(它们由3列数字组成)。因为我还需要在子目录中查找文件,所以我使用的是ftw函数。到目前为止,我的目录结构是:
-TOP -Sub 1 -200 files -Sub 2 -200 files ... -Sub 6 -200 files
在这种情况下,我的程序运行得很好。今天我尝试使用所有800个文件而不是200个文件的目录。当它查找第一个子目录时,一切都很顺利但是当程序读取下一个时它失败了。它给了我错误:
编程接收信号SIGSEGV,分段故障。 _IO_fgets(buf =十六进制数," x的值,y的值为z \ n",n = 8196,fp = 0x0)在iofgets.c:50 50 iofgets.c没有这样的文件要么 。目录
是x,y和z的值是它正在读取的文件的最后一行的值。那么,为什么如果它识别出真正存在的文件,它是否在文件末尾给出了这个错误?除此之外,我无法理解接下来的几件事:
我没有阅读所有800个文件。我从一个确定的值读取(从代码开始)。如果我更改了这个值,我会在之前或之后的文件中收到错误,但在读取~360个左右的文件之后会出现错误。
我在lubuntu 13.10上运行它。用gcc 5.1编译。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <ftw.h>
int MAX_BUFFER = 8192;
int lookfor(const char* file, const struct stat* ptr, int flags){
char look[MAX_BUFFER];
struct stat structure;
stat(strdup(file), &structure);
if (S_ISDIR(structure.st_mode)){
strcpy(look, file);
File *filee;
char lookk[MAX_BUFFER], buffer[MAX_BUFFER];
//[BLA BLA BLA BLA]
struct dirent **namelist;
int n = scandir(look, &namelist,0,versionsort);
int i, ii;
int start = 177;
for (i=0; i<n; i++){
//[BLA BLA BLA BLA]
if (ii> start){
sprintf(lookk, "%s/%s", look, namelist[i]->d_name);
filee = fopen(lookk,"r");
double x,y,z;
while(fgets(buffer, MAX_BUFFER, filee) != NULL){
sscanf(buffer, "%le%le%le", &x, &y, &z);
//BLA BLA
}
start++;
}
//BLA BLA BLA
}
}
return 0;
}
int main( int argc, char *argv[]){
ftw(argv[1], lookfor, FTW_D); //arg1 is the name of top dir.
return 1;
}