使用fscanf读取线条

KAK*_*KAK 4 c scanf std

嗨,我有一个文件,其中包含以下行:

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转换符预期-类型的&s1char (*)[N],如果s1是N阵列char秒-和不匹配类型会scanf()调用未定义的行为.