2017-02-15 64 views
1

我想了解如何檢查數據文件中的錯誤或錯誤類型。 錯誤是由我故意製造的。C - 檢查文件中的錯誤

我的文件看起來像這樣

名稱HouseNr市國家數(多少體育)SPORT1 SPORT2 SportN

卡爾Lincoln42休斯敦美國2籃球足球

while(fscanf(fData, "%s %s %s %s %d", (person + i)->name, 
    (person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country, 
    &(sport + i)->sportCount) == 5) 
{ 
    for (j = 0; j < (person + i)->sportCount; j++) 
    { 
     fscanf(fData, "%s", (person + i)->sportName[j]); 
    } 
    i++; 
} 

現在我不明白的是,應該怎麼做我檢查該文件中的錯誤。我們假設number的值高於SportN的值。

這意味着它掃描其他人的細節SportName

我應該如何解決呢?更改一些代碼(請提供一些建議)或更改我存儲數據的方式?

+0

你的條件必須照顧號和新的生產線,例如 – LPs

+0

通過錯誤,我的意思是,如果我在數類型5,但我只有2個SportNames。 – Karl

+3

文件*行中的數據是基於*的嗎?然後一個好的開始是逐行閱讀,並分別解析每一行。 –

回答

2

由於@SomeProgrammerDudementioned in the comments,所以逐行讀取文件並相應地解析每一行會更好。

您可以使用%[格式說明符來讀取文件中的行。這可以通過使用%[^\n]告知*scanf掃描一切,直到\n(或EOF,以先到者爲準)。當然,它確實\n掃描和%[^\n]失敗,如果要讀取的第一個字符是\n,你就必須在每行之後擺脫換行符。這可以通過在%[^\n]之後使用%*c來實現。它告訴*scanf讀取和放棄一個字符。

現在您已經閱讀了該行,解析它的時間。可以使用sscanf函數以及%n格式說明符的幫助。

char line[1000]; 
int i = 0; 
while(fscanf(fData, "%[^\n]%*c", line) == 1) 
{ 
    int offset; 
    if(sscanf(line, "%s %s %s %s %d%n", (person + i)->name, 
    (person + i)->adr.houseNr, (person + i)->adr.city, (huvi + i)->adr.country, 
    &(sport + i)->sportCount, &offset) != 5) 
    { 
     fprintf(stderr, "Invalid line '%s'\n", line); 
     i++; 
     continue; /* Move on to next line */ 
    } 
    bool valid = true; 
    for(int j = 0; j < (sport + i)->sportCount; j++) 
     if(sscanf(line + offset, "%s%n", (person + i)->sportName[j], &offset) != 1) 
     { 
      valid = false; 
      break; 
     } 
    char dummy[100]; 
    if(sscanf(line + offset, "%s", dummy) == 1) 
     valid = false; 

    if(valid) 
     printf("Good input for line '%s'\n", line); 
    else 
     fprintf(stderr, "Invalid number of items in '%s'\n", line); 
    i++; 
} 

未經測試的代碼↑

+0

太棒了,謝謝!我現在知道如何使用sscanf的力量。 – Karl