我已经阅读了很多关于此的问题,并且使用它们我改变了我的代码并创建了我认为可行的代码。
我认为这是我对C的理解,这使我在这里失败,因为我无法看到我出错的地方。
我没有编译错误,但是当我运行时,我收到了' FileReader.exe已停止工作'从命令提示符。
我的代码是:
void storeFile(){
int i = 0;
char allWords [45440][25];
FILE *fp = fopen("fileToOpen.txt", "r");
while (i <= 45440){
char buffer[25];
fgets(buffer, 25, fp);
printf("The word read into buffer is : %s",buffer);
strcpy(allWords[i], buffer);
printf("The word in allWords[%d] is : %s", i, allWords[i]);
//allWords[i][strlen(allWords[i])-1] = '\0';
i = i + 1;
}
fclose(fp);
}
文件中有45440行,并且长度不超过25个字符的单词。我试图将每个单词读入名为buffer的char数组中,然后将该缓冲区存储在名为allWords的char数组数组中。
我试图让这部分工作,然后我重构将数组返回到main方法(我觉得它不是一种有趣的体验)。
答案 0 :(得分:5)
您正尝试在自动存储中分配超过一兆字节(45440 * 25)的数据。在许多体系结构中,这会导致堆栈溢出,之后您的文件读取代码甚至可以运行。
您可以通过静态分配allWords
来解决此问题,例如
static char allWords [45440][25];
或动态,像这样:
char (*allWords)[25] = malloc(45440 * sizeof(*allWords));
请注意,在buffer
的调用中使用fgets
不是必需的,因为可以使用allWords[i]
代替strcpy
:
fgets(allWords[i], sizeof(*allWords)-1, fp);
另请注意,有关文件大小的假设是不必要的:您可以继续调用fgets
,直到它返回NULL
;这表示已到达文件末尾,因此您可以使用break
退出循环。