【问题标题】:C - Checking for errors in fileC - 检查文件中的错误
【发布时间】:2017-07-04 09:03:48
【问题描述】:

我正在尝试了解如何检查我的数据文件中的错误或错误类型。 这些错误是我故意犯的。

我的文件是这样的

姓名 HouseNr City Country number(运动次数)Sport1 Sport2 SportN

Carl Lincoln42 休斯顿美国 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

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

【问题讨论】:

  • 你的条件必须注意数字和换行,例如
  • 错误我的意思是,如果我在 Number 中输入 5,但我只有 2 个 SportName。
  • 文件中的数据是否基于行?然后一个好的开始是逐行读取,并分别解析每一行。
  • 如果您希望验证基于数据行,那么直接使用fscanf() 是错误的——它不关心换行符出现在哪里。对于可能存在错误的基于行的处理,它只是错误的工具。您需要使用fgets()(或者可能是POSIX 的getline())读取行,然后可能使用sscanf() 解析结果。
  • 查看How to use sscanf() in loops? 使用%n 确定运动次数的结束位置,然后使用该问题中的技巧依次阅读运动。

标签: c file input error-handling io


【解决方案1】:

作为@SomeProgrammerDudementioned in the comments,最好逐行读取文件并相应地解析每一行。

您可以使用%[ 格式说明符从文件中读取行。这可以通过使用%[^\n] 来实现,它告诉*scanf 扫描所有内容,直到\n(或EOF,以先到者为准)。当然,它不会扫描\n,并且如果要读取的第一个字符是\n%[^\n]失败,您将必须在每行之后摆脱换行符。这可以通过在%[^\n] 之后使用%*c 来实现。它告诉*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++;
}

未经测试的代码↑

【讨论】:

  • 太棒了,谢谢!我现在知道如何使用 sscanf 的力量了。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2012-11-06
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多