在C中按顺序打开4092个文件

时间:2013-02-21 12:12:54

标签: c file pointers memory-management

我正在编写一个程序来读取~30,000个文件中的单词,但是在第4092次迭代后我再也无法读取新文件了。我甚至尝试在循环结束时包含一个free(filePointer),但在尝试打开4092nd文件后,我的文件指针仍为NULL。任何想法或建议将不胜感激。

int main(int argc, char *argv[]) {


  hashTable *bigramHT = create_table(100000000);
  hashTable *tokenHT = create_table(100000000);
  int numTokens = 0;
  /* file pointer */
  FILE *fp = NULL;
  /* directory pointer */
  DIR *dirp = NULL;
  /* pointer to directory struct */
  struct dirent *entry = NULL;

  /* check if directory exists and can be opened */
  if((dirp = opendir(argv[1])) == NULL){
    return 1;
  }

  /* allocate memory for the filename paths (using maximum possible length) */
  char *path;
  path = (char*)malloc((get_longest_filename(dirp) + strlen(argv[1])) * sizeof(char));
  if(path == NULL){
    return 1;
  }

  /* create buffers for 'window' to read in word pairs and initialize to \0 */
  char buffer1[1024];
  char buffer2[1024];
  char wordPair[sizeof(buffer1) + sizeof(buffer2) + 1];
  memset(wordPair, '\0', sizeof(wordPair));
  memset(buffer1, '\0', sizeof(buffer1));
  memset(buffer2, '\0', sizeof(buffer2));

  int iterations = 0;
  rewinddir(dirp); //make sure directory is at start position
  /* loop through directory */
  while((entry = readdir(dirp)) != NULL){  
     /* make sure filename is not a directory itself */
    if(is_dir(entry->d_name) == NULL){
      iterations++;
      /* attempt to open file */
      if((fp = fopen(strcat(strcat(strcat(path, argv[1]),"/"), entry->d_name), "r")) == NULL){
    printf("file not found: %s after %d iterations\n", entry->d_name, iterations);
    break;
    //return 1;
      }
      //printf("file: %s\n", entry->d_name);
      while((fgets(buffer1, sizeof(buffer1), fp)) != NULL){
    numTokens++;
    //puts(remove_newline(buffer1));

    if(insert(tokenHT, remove_newline(buffer1)) != 0){
      return 1;
    }

    if(buffer2[0] != '\0'){
      /* merge words into one string */
      strcat(strcat(strcpy(wordPair, remove_newline(buffer2)), " "), remove_newline(buffer1));
      //printf("%s\n", wordPair);
      /* insert new string into hash table */

      if(insert(bigramHT, wordPair) != 0){
        return 1;
      }

    }
    /* shift window */
    strcpy(buffer2, buffer1);
      }
      strcpy(path, "");
      memset(buffer2, '\0', sizeof(buffer2));
    }
  }

   printf("Total number of tokens = %d\n", numTokens);
  //print(tokenHT);
  //print(bigramHT);
  delete_table(bigramHT);
  delete_table(tokenHT);
  closedir(dirp);
  free(path);;

  return 0;
} 

1 个答案:

答案 0 :(得分:6)

你没有fclose(fp);所以你的文件句柄用完了。

相关问题