c - 从文本文件读取行到结构 C

标签 c list file text struct

我正在尝试将列表中的行读取到我的结构中,并且它几乎可以工作。我不太确定问题是什么,但是当我调用结构时,文本文件的最后一行不会显示,而且我认为这些单词放置得不正确......

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()这样做并且还输出操作系统认为发生错误的原因。 (它通过引用errno来选择要输出的错误消息来实现此目的。)

以下是关键问题:

如果输入文件每行包含一首歌曲信息,则字段 year将包含尾随换行符或换行符将不会被读取。如果未读取换行符,则下一次调用 fgets()尝试输入歌曲标题只会收到换行符,然后所有后续字段(所有歌曲)将逐渐远离。

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

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

关于c - 从文本文件读取行到结构 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793268/

相关文章:

java - 如何更新优先级队列中的位置

java - 检查 List<Object> 是否包含属性

c++ - 如何打开 .a 文件

c# - 将文件保存到 MyDocuments + App 文件夹

c - 处理一元运算符的后缀算法的中缀

c - 如何使用 gdb 查找 .exe 文件中的段错误

python - 将 Python 字典转换为列表 [复杂]

java - 如何从 arrayList 中删除重复元素但对它们的参数求和?

python - 乘以归一化值 - 如何取单词的加权平均值

c - 无限期地扩展内部 for 循环调用