【发布时间】:2018-05-22 02:25:31
【问题描述】:
我有这段代码来读取文件,然后打印每一行,但是当我运行它时,它一直在打印 '1 ; 0; ; 0; 0; 0' 无限。 输入文件中有这个:
1 ; Visitante ; 10 ; 19 ; 2 ; 3
2 ; 1 ; Funcionario ; 8 ; 0 ; 2
3 ; 2 ; Diretor ; 12 ; 19 ; 4
4 ; Visitante ; 8 ; 0 ; 3 ; 2
代码:
#include <stdio.h>
#include <stdlib.h>
void readInput() {
FILE * fp;
int id = 0, acompanhantes = 0, entrada = 0, saida = 0, servico = 0;
char tipo[256] = {};
if ((fp = fopen("input.txt", "r")) == NULL) {
printf("Erro a abrir o ficheiro, o programa vai terminar...\n");
exit(1);
}
while ((fscanf(fp,"%d ; %d ; %s ; %d ; %d ; %d\n", &id, &acompanhantes, tipo, &entrada, &saida, &servico)) != EOF) {
printf("%d ; %d ; %s ; %d ; %d ; %d\n", id, acompanhantes, tipo, entrada, saida, servico);
}
fclose(fp);
}
int main() {
readInput();
}
【问题讨论】:
-
我们应该假设
lerInput和readInput是同义词吗?不管怎样,看看你的台词。它们不是类型同义词,因此不能由同一组格式说明符普遍扫描这些行。int, 字符串, 4xint, 然后 2xint,string, 3xint, 扫描失败,输入无限转换失败。 -
fscanf()返回一个 int(匹配的项目数),因此它永远不会匹配 EOF,并且您的循环永远不会结束。 -
您的输入与 scanf 格式不匹配。
-
@rickdenhaan
EOFis 一个 int 并且fscanf在读取任何输入之前遇到文件结尾时确实返回EOF。 -
@Jocas 认为“特定格式”不匹配其中一些行,所以这是不可能的。如果您需要处理两种不同的格式,可以这样做,但需要通过
fgets进行行缓冲,然后多次调用sscanf而不是fscanf,测试是否完全成功一路走来。