我的 C 程序只会读取文件的第一行

My C program will only read the first line of my file

所以我正在尝试读取要存储的书籍信息,我有部分可以解析我的字符数组并正确存储信息,但我只能读取文件的第一行。

我把它分成两部分(为此),input.c 是处理实际获取和返回行的部分,catalog.c 是打开文件的地方,也是调用输入的地方功能。而且我无法在我的机器上访问 getLine。

目录

void readInBooks(Catalog *cat, char const *filename)
{
    FILE *fp = fopen(filename, "r");
    if (!fp)
    {
        fprintf(stderr, "Invalid file: %s\n", filename);
        exit( 21 );
    }

    // This is has been updated to the correct working version!
    char *line;
    
    // Thank you Jabberwocky!!
    while ((line = readLine(fp)) != NULL) {

        // This is where all of the parsing goes
        printf("Line: %s", line);
    }
    fclose( fp );
}

输入

char *readLine( FILE *fp )
{
    char *line;
    line = malloc(sizeof(char) * 512);

    if (fgets(line, BUFFER, fp) == NULL) {
        return NULL;
    } else {
        return line;
    }
}

这里是我试图读入的文本文件,可能值得注意的是这个程序应该能够一个接一个地处理多个文件输入。此外,每本书及其所有信息都在其自己的行上,每行以换行符“\n”结尾。 (直接从文本文件中复制,这正是我所看到的,对此感到抱歉)

11 觉醒演员,克里斯汀 8.7 26389 恐怖

76 哈克贝利芬恩吐温历险记,马克 8.7 111219 男性友谊 -- 小说;幽默故事;密苏里 -- 小说;种族关系 -- 小说;成长小说;芬恩,哈克贝利 (虚构人物) -- 小说;逃亡奴隶-- 小说;密西西比河 -- 小说;冒险故事;逃亡 children -- 小说;男孩 -- 小说

84 弗兰肯斯坦; Or, The Modern Prometheus Shelley, Mary Wollstonecraft 12.6 74959 Monsters -- Fiction;Frankenstein's monster (Fictitious character) -- Fiction;Gothic fiction (Literary genre);Science fiction;Frankenstein, Victor (Fictitious character) -- 小说;科学家 --小说;恐怖故事

1952 The Yellow Wallpaper Gilman, Charlotte Perkins 7.2 6067 精神病女性 -- 小说,女权主义小说,心理小说,已婚妇女 -- 心理学 -- 小说,性别角色 -- 小说

5200 Metamorphosis Kafka, Franz 13.8 22022 心理小说,Metamorphosis -- Fiction

为了进一步帮助澄清我的问题,当我打电话时:

line = readLine(fp);

然后打印它打印出来的那一行:

11 觉醒演员,克里斯汀 8.7 26389 恐怖

多次,因为它一遍又一遍地读取文件的第一行。

正如 Jabberwocky 所说,由于输入中某处的内存泄漏,它会出现段错误

您的代码过于复杂且错误。

你可能想要这个:

void readInBooks(Catalog *cat, char const *filename)
{
    FILE *fp = fopen(filename, "r");
    if (!fp)
    {
        fprintf(stderr, "Can't open file: %s\n", filename);
        exit( BAD_INPUT );
    }

    char *line;
    while ((line = readline(fp)) != NULL)
    {
       printf("Line: %s", line);
    }

    fclose(fp);
}

不过其他地方可能还有更多问题。

readline中也有一些问题,我让你找出来作为练习。提示:它会泄漏内存。