分离fscanf错误检查以便我可以传递特定消息?
这里的C是全新的。程序应该在一行上读取一个由片段组成的文件,片段前后用“#”分隔。例如#碎片1##碎片2##碎片3# 我要检查的两个错误是,一个片段不超过1000个字符,并且该文件在片段的两侧都遵循正确的“#”格式。我并不真正了解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)
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故障情况。谢谢