我正在使用带有fscanf的for循环将一个文件中的5列输入到structs数组中。每个struct有5个变量:1个字符串和4个int,第一个fscanf读取字符串名称并将其存储为a的一部分将其他4个输入整数构造成所述结构(全部到结构的不同变量)。正常输入它工作正常。但是当一个字符输入到整数列中的一个时,scanf为其中的0和该结构的其余值放置并使用char,好像它是一个新结构,即它跳过它之后的所有内容并使用不需要的char作为名称将行的其余值作为输入。 我的问题是,是否有一种方法可以忽略该输入生成的不需要的结构,或者只是简单地防止识别出char并且特定的scanf被滑落? 我已经尝试使用fgets而不是扫描,但它不起作用,我也不能使用0来排序不需要的值,因为0可以作为正常值输入。 我理解,理想情况下看一下代码会有所帮助,但我不愿意为了plaigirism的原因发布它,因为这是针对大学的,我不喜欢那些plaigirism会议。 如果问题没有得到很好的解释,请提前致谢并对不起。 :)
答案 0 :(得分:1)
您需要检查fscanf()
的返回值以确保它成功,如果失败则不会修改超出失败的说明符的参数
char name[100];
int value1;
int value2;
int value3;
int value4;
if (fscanf(file, "%99s%d%d%d%d", name, &value1, &value2, &value3, &value4) == 5)
success();
else
failure();
当然,由success()
和failure()
实际执行的操作取决于您,但这样可以防止未定义的行为。
答案 1 :(得分:1)
键是“输入5列”,表示文本的行。使用fscanf()
很难与行同步,特别是如果您想以其他方式解释文本。最好单独处理阅读和解析。
char buf[100];
while (fgets(buf, sizeof buf, istream)) {
char s[sizeof buf];
s[0] = 0;
int i[4] = { 0,0,0,0 }; // default values
// c is the count of scanned variables
int c = sscanf(buf, "%s%d%d%d%d", s, &i[0], &i[1], &i[2], &i[3]);
printf("%d: %s %d %d %d %d\n", c, s, i[0], i[1], i[2], i[3]);
}
“但是当一个字符输入其中一个整数列时,scanf将其设为0”可能是假的。您看到的是之前的值。
答案 2 :(得分:0)
简短的回答是,fscanf
是这项工作的错误工具。
我猜这是你想要阅读的那种文件:
abc 1 2 3 4
def 5 6 7 8
ghi 9 10 11 12
因此,即使您使用fscanf
获取完美代码来读取此数据,由于fscanf
的工作方式,您的代码也会非常愉快地阅读这些垃圾般的外观文件,创建相同的三个记录:
abc 1 2 3 4 def
5 6 7 8 ghi 9
10 11 12
阅读格式化文本行的更好方法是使用fgets
一次读取一行,然后将每一行分解为其字段。
我,我总是使用一个名为getargs
的函数,该函数在argc
和argv
中将一行划分为以空格分隔的“单词”,就像main()
收到的一样。遗憾的是getargs
不是标准的。但是你可以使用these class notes中描述的版本。
您可以使用标准库函数strtok
执行大致相同的操作。 (不幸的是我无法告诉你如何去做,因为我从不使用strtok
。)
最后,您可以使用sscanf
,正如chux已经建议的那样。你说你试过这个并且它“没有用”,但是如果你给我们一些更多的细节,我们或许可以帮助你让它运作起来。