[英]Reading and Writing to Files in C
我是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的初学者,请尽量保持解释清晰简单。谢谢!
对于第一个问题,问题是循环逻辑不正确。 在每次迭代时,都会存储先前的读取数据,读取下一个数据,然后返回到循环的顶部。 这样做的问题是下一次迭代之前不会存储下一个数据。 但是在读完最后一个数据项之后(以及在将其存储到数组中之前), feof
检查始终为false
。 请参阅此问题,了解为什么将feof
视为循环条件几乎总是错误的。
下面是一个示例,说明如何重构代码以按预期读取所有项目:
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. */
}
问题是在文件中最后一个数字后面没有任何内容,因此,在读取文件中的最后一个数字后,feof(file)为true。 然后退出。
最简单的解决方法就是改变它
while(fscanf (file, "%f", &voltage) == 1) {
并删除其他fscanf调用。
这是有效的,因为fscanf()调用将在能够读取数字时返回1,否则返回0或EOF(这是负数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.