我正在编写一个程序来读取约 30,000 个文件中的单词,但在第 4092 次迭代后我无法再读取新文件。我什至尝试在循环结束时包含一个 free(filePointer),但在尝试打开第 4092 个文件后我的文件指针仍然为 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;
}