【发布时间】:2019-12-22 04:50:56
【问题描述】:
当我尝试使用fscanf() 读取我的结构的文件信息时遇到问题。它只是读取字符串的第一行,循环永远不会结束。我该如何解决这个问题?
结构
typedef struct {
int id;
char name[80];
char nameStadium[80];
int numberPlacesStadium;
float funds;
float monthlyExpenses;
int active;
} Team;
我用这段代码来阅读
void showAll(void)
{
FILE* file;
Team team;
file = fopen("file.txt", "rt");
if (file == NULL)
{
printf("!!!Cant open file!!!\n");
return;
}
rewind(file);
printf("\n\n=== TEAMS ======\n");
printf("%s\t%s\n", "ID", "NAME");
while (fscanf(file, "%6d %s %s %6d %f %f %03d\n", &team.id, team.name, team.nameStadium, &team.numberPlacesStadium, &team.funds, &team.monthlyExpenses, &team.active) != EOF)
{
if (team.active != 0)
{
printf("%d\t%s\n", team.id, team.name);
}
}
fclose(file);
}
我不明白为什么fscanf() 只得到第一个单词而不是完整的字符串
有人知道怎么解决吗?
【问题讨论】:
-
1) 不与
EOF比较,与预期成功比较while (fscanf(file, "%6d %s %s %6d %f %f %03d\n", ....) == 7)2) 发布样本 file.txt。更好的是minimal reproducible example 3)%03d是有问题的。试试%3d。 4) 名称/体育场是否包含空格? -
您的问题标题指出“fscanf 只读取第一个单词”,但后来在文本中说“它只读取第一行”,那么 fscanf 在第一个单词或第一行之后停止工作了吗?如果它在尝试将
team.name读取为字符串 (%s) 时在第一个单词之后停止,那么这篇文章 (stackoverflow.com/questions/1247989/…) 可能会有所帮助。无论如何,正如@chux - Reinstate Monica 已经评论的那样,示例输入很有帮助。 -
char *path="file.txt"; if( (file = fopen(path, "r")) == NULL ) { perror(path); ...}。错误消息很重要。他们应该告诉你失败的原因并被写入正确的流中。 -
%s扫描格式在第一个空格处停止,而在打印格式中,它会打印整个字符串——空格、换行符等等。因此,您可以使用与生成数据相同的格式打印无法回读的数据。你怎么知道哪些词属于体育场名称?您能否使用扫描集(例如%79[^0-9])将输入控制到第一位数字(假设体育场名称不包含数字,这可能不安全)。人们使用分隔符(除了空格)是有原因的——这就是一个例子。