使用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
即可,并检查它是否返回8
或9
。
您必须使用fgets()
函数,因为您的数组中的swag
值当前设置为null
。
并且不要使用带有scanf
string
类型(char数组)数据类型
scanf("%s",name); //use it without "&" sign
原因:
C中的“字符串”是字符缓冲区的地址。 您希望scanf填充缓冲区中的内存,该内存由变量指向。
相反,int是一块内存,而不是一个地址。 为了使scanf填充该内存,您需要传递其地址。