[英]reading lines using 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()
(首選)這樣的strchr()
函數來解析它。 同樣值得的是,(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
。
並且不使用&
用string
類型(字符數組)的數據類型與scanf
scanf("%s",name); //use it without "&" sign
原因:
C中的“字符串”是字符緩沖區的地址。 您希望scanf填充緩沖區中的內存,該內存由變量指向。
相反,int是一塊內存,而不是一個地址。 為了使scanf填充該內存,您需要傳遞其地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.