嗨,我有一个包含以下行的文件:
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语句?
答案 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
一次就可以了,并检查它是否会返回8
或9
。
答案 2 :(得分:0)
您必须使用fgets()
函数,因为您的数组中的swag
值目前设置为null
。
答案 3 :(得分:0)
并且不要将string
与scanf
类型(字符数组)数据类型一起使用scanf("%s",name); //use it without "&" sign
public Boolean isValid() { return this.isValid; }
<强>理由:强>
C中的“字符串”是字符缓冲区的地址。 您希望scanf填充缓冲区中的内存,该内容由变量指向。
相反,int是一块内存,而不是一个地址。为了使scanf填充该内存,您需要传递其地址。