使用fscanf读取线条

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

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语句?

使用fscanf读取线条

没有。

但我觉得这是一个好主意,因为……

没有。


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

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

然后,您可以使用sscanf() (不是首选)或者健全的函数(如strchr()strtok_r() (首选)来解析它。 同样值得的是(h) 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的类型是char (*)[N]如果s1是N个char的数组 - 并且不匹配的类型使scanf()调用未定义的行为。

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

如果除了一个额外项目之外的行格式相同,请记住scanf系列函数返回成功扫描的项目数。 因此,只需调用一次sscanf即可,并检查它是否返回89

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

并且不要使用带有scanf string类型(char数组)数据类型

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

原因:

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

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