我是C编程的初学者。我目前正在为考试做准备,但仍在参加课程。任务是从文本文件中读取内容,并计算其中的整数之和。该文件还包含字符。我已经尝试过将其作为一种解决方案,它几乎是正确的,但是有时它会增加一个整数很多次。
void calculate(char* file_name) {
FILE* file;
int sum = 0;
int number;
file = fopen(file_name, "r");
char c;
while ((c = fgetc(file)) != EOF) {
if (fscanf(file, "%d", &number)) {
printf("The number is %i\n ", number);
sum = suma + number;
}
}
fclose(file);
printf("The sum is %i\n", sum);
}
例如,文件中的文本为:
asdd12 ddd15 dddgh51hh3
3adb jk !!!*
此文件的总和应为84,但输出87。我的方法是完全错误的还是应该更改代码中的某些内容?
预先感谢您的帮助。
答案 0 :(得分:2)
...我应该只更改代码中的某些内容吗?
while((c=fgetc(file))!=EOF)
对c
无效,因此会丢失潜在的数字输入字符。
if( fscanf(file, "%d", &number))
是一个问题,由于fscanf()
返回非零值而导致文件结束时被愚弄,因此代码认为已读取数字。
请尝试使用3向分支。使用fscanf()
中的结果值来指导后续步骤。
int conversion_count;
do {
conversion_count = fscanf(file, "%d", &number);
if (conversion_count == 1) {
// scanf() found an `int`
printf("The number is %i\n ", number);
sum = sum + number;
} else if (conversion_count == 0) {
// scanf() failed to finf an `int`.
// Offending non-numeric input remains in `file`.
// Read non-numeric input character and quietly toss it.
fgetc(file); //
}
} while (conversion_count != EOF);
替代方法:健壮的代码将读取带有fgets()
和strtol()
的一行文本以查找整数。