从文本文件读取行到结构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()在文件无法打开的任何执行路径中调用

没有必要打电话rewind()时,下面的语句是fclose()

由于输出的printf()是对Song数组中各字段的调用,一个接一个地输出,这将导致很长很长的单行输出到终端。希望终端设置为在输出了这么多列后自动滚动,但是不能依靠。

输出错误消息时,最好将其输出到stderr,而不是stdout函数:perror()执行AND操作并输出OS认为发生错误的原因。(通过errno选择要输出的错误消息来完成此操作。)

以下是关键问题:

如果输入文件每行包含一个歌曲信息,则该字段year将包含结尾的换行符,或者将不会读取该换行符。如果未读取换行符,则fgets()试图输入歌曲标题的下一个呼叫将仅收到换行符,然后(所有歌曲中的)所有随后字段将逐渐远离。

阅读歌曲字段后提出建议,使用循环清除输入行中的所有剩余字符,类似于:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章