将文件读入结构有时会无缘无故停止
Reading file into a struct sometimes stops for no reason
我有以下代码:
int main() {
FILE *fp = fopen("inventory.txt", "r");
if (fp == NULL) {
printf("File Error");
return 1;
}
while (1) {
char *componentType = malloc(200);
char *stockCode = malloc(20);
int numberOfItems = 0;
int price = 0;
char *additionalInformation = malloc(20);
int fileRead = fscanf(fp, "%[^,], %[^,], %i, %i, %[^,\r\n]", componentType, stockCode, &numberOfItems, &price,
additionalInformation);
if (fileRead == EOF) {
printf("End of file!\n");
break;
}
printf("%s Read Record!\n", stockCode);
free(componentType);
free(stockCode);
free(additionalInformation);
}
printf("DONE!");
fclose(fp);
}
文件如下所示:
resistor, RES_1R0, 41, 1, 1R0
resistor, RES_10R, 467, 1, 10R
resistor, RES_100R, 334, 1, 100R
resistor, RES_1K0, 500, 1, 1K0
resistor, RES_10K, 169, 1, 10K
resistor, RES_100K, 724, 1, 100K
resistor, RES_1M0, 478, 1, 1M0
diode, BY126, 118, 12
diode, BY127, 45, 12
transistor, AC125, 13, 35, PNP
transistor, AC126, 40, 37, PNP
....
然而,当我 运行 代码时,它有时会像这样完成:
RES_1R0 Read Record!
RES_10R Read Record!
...
CF12 Read Record!
CF13 Read Record!
Done!
但有时它会无缘无故地停止,就像这样:
RES_1R0 Read Record!
RES_10R Read Record!
...
D12 Read Record!
D13 Read
每次还是returns0.
问题是什么?
fscanf() returns 在文件末尾读取的字符数或零,而 fgetc(fp) returns 到达文件末尾时的一个字符或 EOF。
您正在混合两种 eof 检测方法。
自从我第一次问这个问题以来,这个问题现在已经发生了很大的变化(即首先我认为这是一个内存/结构问题,然后它变成了一个编译器问题,最后我发现它是一个 IDE 问题),因此我决定完全创建一个新问题:.
这个具体问题的答案是,这是 CLion IDE 的问题。要解决此问题,请使用终端编译和 运行 代码,输出工作正常。
感谢@Dominik Gebhar 和@Jonathan Leffler 的帮助!!!
我有以下代码:
int main() {
FILE *fp = fopen("inventory.txt", "r");
if (fp == NULL) {
printf("File Error");
return 1;
}
while (1) {
char *componentType = malloc(200);
char *stockCode = malloc(20);
int numberOfItems = 0;
int price = 0;
char *additionalInformation = malloc(20);
int fileRead = fscanf(fp, "%[^,], %[^,], %i, %i, %[^,\r\n]", componentType, stockCode, &numberOfItems, &price,
additionalInformation);
if (fileRead == EOF) {
printf("End of file!\n");
break;
}
printf("%s Read Record!\n", stockCode);
free(componentType);
free(stockCode);
free(additionalInformation);
}
printf("DONE!");
fclose(fp);
}
文件如下所示:
resistor, RES_1R0, 41, 1, 1R0
resistor, RES_10R, 467, 1, 10R
resistor, RES_100R, 334, 1, 100R
resistor, RES_1K0, 500, 1, 1K0
resistor, RES_10K, 169, 1, 10K
resistor, RES_100K, 724, 1, 100K
resistor, RES_1M0, 478, 1, 1M0
diode, BY126, 118, 12
diode, BY127, 45, 12
transistor, AC125, 13, 35, PNP
transistor, AC126, 40, 37, PNP
....
然而,当我 运行 代码时,它有时会像这样完成:
RES_1R0 Read Record!
RES_10R Read Record!
...
CF12 Read Record!
CF13 Read Record!
Done!
但有时它会无缘无故地停止,就像这样:
RES_1R0 Read Record!
RES_10R Read Record!
...
D12 Read Record!
D13 Read
每次还是returns0.
问题是什么?
fscanf() returns 在文件末尾读取的字符数或零,而 fgetc(fp) returns 到达文件末尾时的一个字符或 EOF。
您正在混合两种 eof 检测方法。
自从我第一次问这个问题以来,这个问题现在已经发生了很大的变化(即首先我认为这是一个内存/结构问题,然后它变成了一个编译器问题,最后我发现它是一个 IDE 问题),因此我决定完全创建一个新问题:
这个具体问题的答案是,这是 CLion IDE 的问题。要解决此问题,请使用终端编译和 运行 代码,输出工作正常。
感谢@Dominik Gebhar 和@Jonathan Leffler 的帮助!!!