2016-04-10 78 views
0

輸入文件:記錄由製表符分隔

Joe Smith 10 Main St. 555-1212 

我讀從具有包含3個字段,名稱,住所和由製表符分隔電話號碼以上格式的文件記錄。

while (fscanf(fp, "%s%s%s", rec[size].name, rec[size].address, rec[size].phone_number) != EOF) 
{ 
    size++; 
} 

我必須包括第一個單詞的空格,忽略標籤並開始閱讀下一個字段。

+0

你的問題到底是什麼? –

+0

請注意,您應該檢查'while(fscanf(fp,...)== 3)',因爲這會告訴您是否存在文件中只剩下兩個字段的問題。另外請注意,'fscanf()'對於面向行的輸入的使用有限 - 它不關心換行符出現的位置,並且會對分佈在三行上的信息感到滿意。使用'fgets()'或'getline()'然後'sscanf()'來解析輸入行。 –

回答

1
char buffer[4096]; 
int n; 

while (fgets(buffer, sizeof(buffer), fp) != 0) 
{ 
    if ((n = sscanf(buffer, "%[^\t] %[^\t] %[^\t\n]", 
     rec[size].name, rec[size].address, rec[size].phone_number)) != 3) 
    { 
     if (n != EOF) 
      fprintf(stderr, "Error: faulty record without 3 fields at:\n%s", 
        buffer); 
     break; 
    } 
    size++; 
} 

請注意,這使用fgets()來讀取行。它檢查sscanf()是否讀取三個字段。你不應該得到n == EOF,但測試以防萬一。錯誤消息以標準錯誤報告,並且包含導致問題的行(fgets()加上sscanf()的主要優點之一在於您有爲重試或錯誤報告捕獲的行)。