【发布时间】:2017-12-06 23:21:58
【问题描述】:
我正在尝试从 txt 文件中读取一些字符串。 每行有一个5位数字,一个占51个字符(包括空格)的全名,2个城市名称,每个占11个字符,包括空格,以及一个数字。示例:
12345António Manuel Silva Mendes Frankfurt Varsovia 1
我现在可以扫描前 2 个字符串,但无法扫描城市名称,也无法扫描最后一个数字。
结构如下:
typedef struct bilhete{
int BI;
char nome[51];
char partida[11];
char chegada[11];
int data[2];
}BILHETE;
这是我读取文件的方式
while(!feof(fp)){
fscanf(fp,"%d%51[^\n]s%11c%11c%d\n", &bilhete.BI, bilhete.nome, bilhete.partida, bilhete.chegada, &bilhete.data);
我做错了什么?当我打印城市名称时,什么都没有出现!
【问题讨论】:
-
fscanf 返回什么?这是什么意思?
-
while(!feof(fp))是错误的。 stackoverflow.com/questions/5431941/… -
鉴于输入字段的大小,结构定义字符字段太短了 1 个字符。这是因为在为
scanf()系列函数调用 any 时,输入格式说明符%s和%[...]总是在输入末尾附加一个 NUL 字节。 -
对
fscanf()的调用在输入格式说明符%51[^\n]之后有一个虚假的's' 输入数据中不存在's',因此输入活动将在那里停止。如果您一直在检查来自fscanf()的返回值(在当前情况下应该是:5),它将返回 2。您似乎对 '%[]' 输入说明符有误解。这是一个“独立”说明符,因此不需要尾随“s”。 -
一般来说,永远不要在while循环中使用
feof()。对于当前场景,将其用于while语句:while( 5 == fscanf(fp,"%d %51[^\n] %11c %11c %d\n", &bilhete.BI, bilhete.nome, bilhete.partida, bilhete.chegada, &bilhete.data) )