簡體   English   中英

從文本文件中讀取行到結構 C

[英]Reading lines from text file to structs C

我正在嘗試將列表中的行讀取到我的結構中,並且幾乎可以正常工作。 我不太確定問題是什么,但是當我調用結構時,文本文件的最后一行不會出現,而且我認為這些詞的位置不正確......

void loadFile(char fileName[], Song *arr, int nrOf) {

    FILE *input = fopen(fileName, "r");


    if (input == NULL) {
        printf("Error, the file could not load!");
    } else {

        fscanf(input, "%d", &nrOf);
        fscanf(input, "%*[^\n]\n", NULL);

        for (int i = 0; i < nrOf; i++) {
            fgets(arr[i].song, sizeof(arr[i].song), input);
            fgets(arr[i].artist, sizeof(arr[i].artist), input);
            fgets(arr[i].year, sizeof(arr[i].year), input);
        }
        for (int i = 0; i < nrOf; i++) {
            printf("%s", arr[i].song);
            printf("%s", arr[i].artist);
            printf("%s", arr[i].year);
        }
        rewind(input);
        printf("The file is now ready.\n");

    }

    fclose(input);

}

文本文件以第一行的數字開頭,用於跟蹤列表中有多少首歌曲。 因此,我嘗試這樣做:

fscanf(input, "%d", &nrOf);
fscanf(input, "%*[^\n]\n", NULL);

能夠在 nrOf 獲得數字后跳過第一行。

編輯:這是結構:

typedef struct Song {

char song[20];
char artist[20];
char year[5];

} Song;

這是文本文件:

4
Mr Tambourine Man
Bob Dylan
1965
Dead Ringer for Love
Meat Loaf
1981
Euphoria
Loreen
2012
Love Me Now
John Legend
2016

並且結構是動態分配的:

Song *arr;
arr = malloc(sizeof(Song));

最后一行不打印的原因有多種

主要原因是從未讀過最后一行

不應在文件打開失敗的任何執行路徑中調用fclose()

下一個語句是fclose()時不需要調用rewind() fclose()

由於對Song數組中的字段調用printf()是一個接一個的輸出,這會導致輸出到終端很長很長的單行,希望終端設置為在輸出這么多列后自動滾動,但這不能依賴。

輸出錯誤消息時,最好將其輸出到stderr ,而不是stdout 函數: perror()這樣做並且還輸出操作系統認為發生錯誤的原因。 (它通過引用errno來選擇要輸出的錯誤消息來做到這一點。)

以下是關鍵問題:

如果輸入文件每行包含一個歌曲信息,則字段year將包含一個尾隨換行符,或者該換行符將不會被讀取。 如果沒有讀取換行符,那么下一次嘗試輸入歌曲標題的fgets()調用只會收到一個換行符,然后所有后續字段(所有歌曲的)將逐漸遠離。

建議在讀完一個歌曲字段后,使用循環清除輸入行中的任何剩余字符,類似於:

int ch;
while( (ch = getchar( input )) && EOF != ch && '\n' != ch );

暫無
暫無

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

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