iofgets.c没有这样的文件或目录

时间:2015-02-14 18:08:25

标签: c file-io fgets

我需要使用许多文件来查找其中的一些信息(它们由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的值是它正在读取的文件的最后一行的值。那么,为什么如果它识别出真正存在的文件,它是否在文件末尾给出了这个错误?除此之外,我无法理解接下来的几件事:

  1. 如果我读取文件1,文件2会得到错误但如果不是文件2我在文件1之后读取文件3,它也会给我同样的错误。
  2. 如果不是从文件1开始,而是从文件2开始,文件2是正常的,但错误在文件3中。
  3. 我没有阅读所有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;
    }
    

0 个答案:

没有答案