我刚刚开始学习C中的文件处理,并想知道我是否可以通过读取文件中的输入来执行数学计算,这里只是读取字符并在控制台上显示的代码:
SELECT id,exam,exam_res FROM exam INNER JOIN search_exam USING(exam)
numbers.txt包含(每个字符前面有一个空格):
int main(void)
{
FILE *p;
char a, b, c, ch;
p = fopen("numbers.txt", "a+");
while((ch = getc(p)) != EOF)
{
fscanf(p, "%c %c %c\n", &a, &b, &c);
printf("%c %c %c\n", a, b, c);
}
fclose(p);
return 0;
}
获得的输出是:
2 + 3
5 + 6
6 + 7
我无法理解为什么第一行输出符合预期但第二行和第三行缺少字符,即使在numbers.txt中的每个表达式后面都给出了新行。
答案 0 :(得分:6)
在while
循环
while((ch = getc(p)) != EOF)
尝试将fscanf()
语句作为while
循环的条件,并检查其返回值。根据 cplusplus.com :
成功时,该函数返回参数的项数 列表已成功填写。此计数可以匹配预期的数量 由于匹配失败,读数,项目或更少(甚至为零) 错误,或文件结尾的范围。
如果发生读取错误或达到文件结尾时 阅读,设置正确的指标(feof或ferror)。而且,如果有的话 在成功读取任何数据之前发生,返回EOF 。
因此,请尝试将您的while条件更改为以下任何人:
while (fscanf(p, " %c %c %c", &a, &b, &c) != EOF)
或
while (fscanf(p, " %c %c %c", &a, &b, &c) == 3)
答案 1 :(得分:6)
使用scanf
格式说明符中的空格,就像使用\n
一样,匹配任何数量的空格。消耗\n
和下一行的前导空格,导致getc
删除第一个数字而不是前导空格。
我完全跳过getc
,因为@BLUEPIXY建议:
while (fscanf(p, " %c %c %c", &a, &b, &c) == 3) {
printf("%c %c %c\n", a, b, c);
}