C - 检查文件中的错误

时间:2017-02-15 15:43:34

标签: c file input error-handling io

我试图了解如何检查数据文件中的错误或错误。 错误是由我故意做出的。

  

我的文件看起来像这样

     

名称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

我该如何解决这个问题?更改一些代码(请,一些建议)或更改我存储数据的方式?

1 个答案:

答案 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++;
}

未经测试的代码↑