我是C的新手。这是我写的第一个涉及读写文件的程序。到目前为止,我能够读取文件,执行我需要的操作,但我遇到了两件事情。
无论文件是什么,它都会在阅读时省略最后一行。例如,如果文件包含:
3
5
6
它只会读取 3 和 5 。但如果我在底部留下一个空/空行,它将会读取所有三行。任何想法为什么会这样?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
FILE * file = fopen ("bacon.txt", "r");
float voltage = 0, voltageArray[100], voltageToMilli = 0,voltageToMicro = 0, voltageToKilo = 0, voltageToMega = 0;
int i = 1, j = 0;
fscanf (file, "%f", &voltage);
while (!feof (file)) {
printf("Line # %d\n", i);
printf ("The voltage is: %f\n", voltage);
voltageArray[j] = voltage;
fscanf (file, "%f", &voltage);
printf("The voltage in Element %d is: %f Volts",j,voltageArray[j]);
voltageToMilli = voltageArray[j] * 1000;
voltageToMicro = voltageArray[j] * 1000000;
voltageToKilo = voltageArray[j] * 0.001;
voltageToMega = voltageArray[j] *0.000001;
printf("\nThe voltage is %f Volts, which is: %f milliVolts, %f microVolts, %f kiloVolts, %f megaVolts",voltageArray[j],voltageToMilli,voltageToMicro,voltageToKilo,voltageToMega);
printf("\n\n");
i++;
j++;
}
fclose (file);
return (0);
}
因为我是C的初学者,请尽量使解释清楚简单。谢谢!
答案 0 :(得分:2)
对于第一个问题,问题是循环逻辑不正确。在每次迭代时,都会存储之前的读取数据,读取下一个数据,然后返回到循环的顶部。这样做的问题是下一次迭代之前不会存储下一个数据。但在读完最后一个数据项之后(以及在将其存储到数组中之前),feof
检查始终为false
。有关检查feof
作为循环条件几乎总是错误的原因,请参阅this question。
以下是如何重构代码以按预期读取所有项目的示例:
int rval;
while ((rval = fscanf(file, "%f", &voltage)) != EOF) {
if (rval != 1) {
printf("Unexpected input\n");
exit(-1);
}
voltageArray[j] = voltage;
/* Do the rest of your processing here. */
}
答案 1 :(得分:1)
问题是文件中的最后一个数字后面没有任何内容, 所以,在读完文件中的最后一个数字后,feof(file)为真。 然后退出。
最简单的修复是将其更改为此
while(fscanf (file, "%f", &voltage) == 1) {
并删除其他fscanf调用。
这是有效的,因为fscanf()调用将在能够时返回1 读取数字0或EOF(负数) 否则。