簡體   English   中英

使用fscanf讀取線條

[英]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即可,並檢查它是否返回89

您必須使用fgets()函數,因為您的數組中的swag值當前設置為null

並且不使用&string類型(字符數組)的數據類型與scanf

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

原因:

C中的“字符串”是字符緩沖區的地址。 您希望scanf填充緩沖區中的內存,該內存由變量指向。

相反,int是一塊內存,而不是一個地址。 為了使scanf填充該內存,您需要傳遞其地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM