我正在使用fscanf从c中的文件中读取。我只是想知道我是否正确检查了所有错误条件,这是最强大的方法,我不会错过任何东西。
FILE* fp;
char filename[] = "untitled";
int count;
char item1[1025];
char item2[1025];
fp = fopen(filename, "r");
if (fp == NULL) {
perror("fopen");
return -1;
}
count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
if (ferror(fp)) {
perror("fscanf");
}
else {
fprintf(stderr, "Error: fscanf matching failuren");
}
return -1;
}
else if (count == 0) {
fprintf(stderr, "Error: fscanf early matching failuren");
return -1;
}
else if (count != 2) {
fprintf(stderr, "Error: fscanf matched less items than expectedn");
return -1;
}
if (fclose(fp) == EOF) {
perror("fclose");
return -1;
}
感谢您的宝贵时间。
注释后编辑:
count = fscanf(fp, "%1024s%1024s", item1, item2);
if (count == EOF) {
if (ferror(fp)) {
perror("fscanf");
}
else {
fprintf(stderr, "Error: fscanf reached end of file, no matching characters, no matching failuren");
}
return -1;
}
else if (count != 2) {
fprintf(stderr, "Error: fscanf successfully matched and assigned %i input items, 2 expectedn", count);
return -1;
}
scanf
在"matching failure"时不返回EOF
。它仅在"输入失败"(EOF,读取错误或编码错误)时返回EOF
,并且仅当输入失败发生在任何成功的转换和赋值之前。因此,如果返回值为EOF
,则ferror
或feof
必须返回非零。
else if (count == 0) {
fprintf(stderr, "Error: fscanf early matching failuren");
return -1;
}
else if (count != 2) {
fprintf(stderr, "Error: fscanf matched less items than expectedn");
return -1;
}
经受不住可用性的考验。这些情况无法通过错误消息进行区分;如果必须向用户报告这两个选项,那么为什么不
if (count != NMATCHES)
fprintf(stderr, "Error: wanted %d items, found %dn", NMATCHES, count);
-
你的fscanf只工作,当你使用相同的%1024s%1024s的fprintf,否则我不认为你可以得到字符串在两个字符变量
-
你限制你的代码采取1K的大小,你不应该使用值的硬编码,如果你的字符串大小超过1K(极端情况下),你会怎么做,所以你必须限制你的字符串大小在文件小于1K,你不能期望每次,除非你有写入数据到同一个文件的控制。