Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分离fscanf错误检查以便我可以传递特定消息?_C_Error Handling_Scanf - Fatal编程技术网

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

分离fscanf错误检查以便我可以传递特定消息?,c,error-handling,scanf,C,Error Handling,Scanf,这里的C是全新的。程序应该在一行上读取一个由片段组成的文件,片段前后用“#”分隔。例如#碎片1##碎片2##碎片3# 我要检查的两个错误是,一个片段不超过1000个字符,并且该文件在片段的两侧都遵循正确的“#”格式。我并不真正了解fscanf语法是如何工作的,但我认为以下内容可以检查错误: char buffer[MAX_FRAG_LEN+1]; if (fscanf(fp, "#%1000[^#]#", buffer) == 1) { return strdup(buffer)

这里的C是全新的。程序应该在一行上读取一个由片段组成的文件,片段前后用“#”分隔。例如#碎片1##碎片2##碎片3#

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

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

然而,我想把错误分开,这样我就可以明确地传达出这两个错误中的哪一个。我如何单独进行检查?非常感谢

要使您的技术发挥作用,您应该手动检查缓冲区后面的下一个字符是否是
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所建议的那样。

可能更容易将整行读取到缓冲区中,然后通过数组检查您的条件或将其传递给strtok()您应该调用
ungect()
将字符放回,这样它将在下一次调用
fscanf()
@steveha时出现在输入流中。这一点很好,但仅适用于非EOF故障情况。谢谢