嗨,我有一个文件,其中包含以下行:
wwa weweweof ewewe wdw:
1 11 ms <1 ms <1 ms 174.78.134.1
2 11 ms <1 ms <1 ms 174.78.134.1
3 5 ms <1 ms <1 ms x58trxd00.abcd.edu.com [143.71.290.42]
4 11 ms <1 ms <1 ms 174.78.134.1
Run Code Online (Sandbox Code Playgroud)
我在用
if(linecount == 8)
while( fscanf(fp, "%d %s %s %s %s %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8) != EOF ){
printf("%s",ch);
}
else if (linecount == 9){
while( fscanf(fp, "%d %s %s %s %s %s %s %s",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9) != EOF ){
printf("%s",ch);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何检查文件中的行行是否包含8或9个元素,以便我可以相应地运行上述else-if语句?
小智 11
使用fscanf读取线条
没有.
但我觉得这是一个好主意,因为......
没有.
阅读行是使用该fgets()功能完成的(阅读有趣的手册):
char buf[LINE_MAX];
while (fgets(buf, sizeof buf, file) != NULL) {
// process line here
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用sscanf()(不是首选)或类似strchr()和strtok_r()(首选)的理智函数来解析它.还值得不(H)是ING的返回值scanf()(文档)是不是 EOF,但成功读取实体的数量.因此,解析字符串的惰性方法可能是:
if (sscanf(buf, "%s %s %s %s %s %s %s %s %s", s1, s2, ...) < 9) {
// there weren't 9 items to convert, so try to read 8 of them only
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您最好使用%s转换说明符的一些长度限制,以避免缓冲区溢出错误,如下所示:
char s1[100];
sscanf(buf, "%99s", s1);
Run Code Online (Sandbox Code Playgroud)
同样,你不应该使用&扫描(入)的字符串时,地址运算符-字符数组已经衰变为char *,而这正是该怎样%s转换符预期-类型的&s1是char (*)[N],如果s1是N阵列char秒-和不匹配类型会scanf()调用未定义的行为.