使用fscanf读取线条

时间:2013-08-07 08:37:16

标签: c std scanf

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

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 个答案:

答案 0 :(得分:11)

  

使用fscanf读取行

  

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


使用fgets()函数(read the funny manual)完成阅读行:

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

然后,您可以使用sscanf()(不是首选)或理智的函数(例如strchr()strtok_r()(首选)来解析它。同样值得一提的是,scanf()docs)的返回值 不是 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的内容转换说明符期望 - 如果&s1是N char (*)[N]的数组,则s1的类型为char - 不匹配的类型使scanf()调用未定义的行为

答案 1 :(得分:2)

使用fgets获取该行,然后执行一个sscanf检查9个元素,如果失败则再次使用sscanf检查8个元素行。< / p>

如果行的格式除了一个额外的项目之外是相等的,那么请记住scanf系列函数返回成功扫描的项目数。因此,只需拨打sscanf一次就可以了,并检查它是否会返回89

答案 2 :(得分:0)

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

答案 3 :(得分:0)

并且不要将stringscanf类型(字符数组)数据类型一起使用scanf("%s",name); //use it without "&" sign

public Boolean isValid() { return this.isValid; }

<强>理由:

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

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