我试图了解如何检查数据文件中的错误或错误。 错误是由我故意做出的。
我的文件看起来像这样
名称HouseNr城市国家/地区编号(运动多少) Sport1 Sport2 SportN
Carl Lincoln42 Houston USA 2篮球足球
while(fscanf(fData, "%s %s %s %s %d", (person + i)->name,
(person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country,
&(sport + i)->sportCount) == 5)
{
for (j = 0; j < (person + i)->sportCount; j++)
{
fscanf(fData, "%s", (person + i)->sportName[j]);
}
i++;
}
现在我不了解的是,我应该如何检查该档案中的错误。
我们假设number
的值高于SportN
的值。
这意味着它会将其他人的详细信息扫描为 SportName
我该如何解决这个问题?更改一些代码(请,一些建议)或更改我存储数据的方式?
答案 0 :(得分:2)
作为@SomeProgrammerDude mentioned in the comments,最好逐行读取文件并相应地解析每一行。
您可以使用%[
格式说明符从文件中读取行。这可以通过使用%[^\n]
来实现,*scanf
告诉\n
扫描所有内容,直到\n
(或EOF,以先到者为准)。当然,如果要读取的第一个字符是%[^\n]
,则不会<{1}} 扫描\n
会失败em>,你必须在每一行之后摆脱换行符。这可以通过在%*c
之后使用%[^\n]
来实现。它告诉*scanf
阅读并丢弃一个角色。
现在您已经阅读了该行,是时候解析它了。可以使用sscanf
函数以及%n
格式说明符的帮助。
char line[1000];
int i = 0;
while(fscanf(fData, "%[^\n]%*c", line) == 1)
{
int offset;
if(sscanf(line, "%s %s %s %s %d%n", (person + i)->name,
(person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country,
&(sport + i)->sportCount, &offset) != 5)
{
fprintf(stderr, "Invalid line '%s'\n", line);
i++;
continue; /* Move on to next line */
}
bool valid = true;
for(int j = 0; j < (sport + i)->sportCount; j++)
if(sscanf(line + offset, "%s%n", (person + i)->sportName[j], &offset) != 1)
{
valid = false;
break;
}
char dummy[100];
if(sscanf(line + offset, "%s", dummy) == 1)
valid = false;
if(valid)
printf("Good input for line '%s'\n", line);
else
fprintf(stderr, "Invalid number of items in '%s'\n", line);
i++;
}
未经测试的代码↑