分离fscanf错误检查,以便我可以传递特定的消息?

时间:2012-07-10 01:07:05

标签: c error-handling scanf

这里是C的全新。该程序应该在一行中读取片段文件,在它们之前和之后用“#”分隔。例如#fragment1 ## fragment2 ## fragment3#

我要检查的两个错误是片段不超过1000个字符,并且该文件在片段的任一侧遵循正确的格式“#”。我真的不知道fscanf语法是如何工作的,但我认为以下内容会检查错误:

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]#", buffer) == 1) {
    return strdup(buffer);
  } else {
    fprintf(stderr, "Error! Incorrect format.\n");
  }

但是,我想分开错误,以便我可以专门发送一条消息,告知它是哪一个。我如何单独进行检查?非常感谢!

1 个答案:

答案 0 :(得分:1)

为了使您的技术有效,您应该在'#'返回后手动检查缓冲区后面的下一个字符是fscanf。这允许您区分太长的字符串错误和丢失的"##"错误。

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]", buffer) == 1) {
    int c = fgetc(fp);
    if (c == '#') return strdup(buffer);
    if (c != EOF) {
      ungetc(c, fp);
      fprintf(stderr, "Error! More than 1000 characters.\n");
    } else {
      fprintf(stderr, "Error! Last fragment did not end with '#'.\n");
    }
  } else {
    fprintf(stderr, "Error! Fragment did not start with '#'.\n");
  }

但是,使用fscanf进行解析通常很棘手。如果输入采用完全意外的格式,则可能难以正确地从中恢复。因此,通过在单个缓冲区中读取整行来处理错误通常更容易,然后根据Duck的建议解析该行。