7

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

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 

我在用

    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);
       }
    }

如何检查文件中的行行是否包含8 个或 9 个元素,以便我可以相应地运行上述 else-if 语句?

4

4 回答 4

15

使用 fscanf 读取行

不。

但我认为这是个好主意,因为...

不。


阅读行是使用fgets()函数完成的(阅读有趣的手册):

char buf[LINE_MAX];
while (fgets(buf, sizeof buf, file) != NULL) {
    // process line here
}

然后,您可以使用(非首选)或像和(首选)这样的sscanf()健全函数来解析它。同样值得一提的是(docs)的返回值不是,而是成功读取的实体数。因此,解析字符串的惰性方法可能是:strchr()strtok_r()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
}

另请注意,您最好对转换说明符使用一些长度限制%s,以避免缓冲区溢出错误,如下所示:

char s1[100];
sscanf(buf, "%99s", s1);

同样,在扫描(进入)字符串时不应使用&address-of 运算符 - char 数组已经衰减为char *,这正是%s转换说明符所期望的 - 的类型&s1char (*)[N]ifs1是 N chars 的数组 - 并且不匹配的类型会scanf()导致调用未定义的行为。

于 2013-08-07T08:43:17.920 回答
3

用于fgets获取线,然后执行一次sscanf以检查 9 个元素,如果失败则sscanf再次使用以检查 8 个元素线。

如果除了一个额外的项目之外,行的格式相同,请记住scanf函数族返回成功扫描项目的数量。所以只调用一次就足够了sscanf,并检查它是否返回8or 9

于 2013-08-07T08:41:23.297 回答
0

您必须使用该fgets()函数,因为您swag的数组中的值当前设置为null.

于 2013-08-07T09:39:50.040 回答
0

并且不要使用&类型string(字符数组)数据类型scanf

scanf("%s",name); //use it without "&" sign

原因:

C 中的“字符串”是字符缓冲区的地址。您希望 scanf 填充变量指向的缓冲区中的内存。

相反,int 是一块内存,而不是地址。为了让 scanf 填充该内存,您需要传递其地址。

于 2017-05-28T16:43:11.513 回答