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

我的C程序将只读取文件的第一行,c,file-io,fgets,C,File Io,Fgets,所以我试图读取要存储的图书信息,我通过我的char数组解析部分,并正确地存储信息,但我只能读取文件的第一行 我将其分为两部分(为此),input.c是处理实际获取和返回行的程序,catalog.c是打开文件的地方,是调用输入函数的程序。我没有访问我机器上getLine的权限 目录 void readInBooks(Catalog *cat, char const *filename) { FILE *fp = fopen(filename, "r"); if

所以我试图读取要存储的图书信息,我通过我的char数组解析部分,并正确地存储信息,但我只能读取文件的第一行

我将其分为两部分(为此),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 );
}
输入

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

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

76《哈克贝利·芬恩·吐温历险记》,马克8.7 111219《男性友谊——小说》;幽默故事;密苏里——小说;种族关系——虚构;教育家;芬恩,哈克贝利(虚构人物)——小说;逃亡奴隶——小说;密西西比河——小说;冒险故事;逃亡儿童——小说;男孩——小说

84弗兰肯斯坦;或者,现代的普罗米修斯·雪莱、玛丽·沃斯通克拉夫特12.6 74959怪物——小说;弗兰肯斯坦的怪物(虚构人物)——小说;哥特式小说(文学体裁);科幻小说弗兰肯斯坦,维克多(虚构人物)——小说;科学家——虚构;恐怖故事

1952年黄色墙纸吉尔曼,夏洛特·珀金斯7.2 6067精神病妇女--小说,女权主义小说,心理小说,已婚妇女--心理学--小说,性角色--小说

5200变形卡夫卡,弗兰兹13.8 22022心理小说,变形小说

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

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
中也存在一些问题,作为练习,我让您了解一下。提示:它会泄漏内存。

您可以使用
在(line!=NULL)
时检测EOF。不能将
strlen()
应用于
NULL
指针。除此之外,您还没有发布处理输入字符串的部分。顺便问一下,缓冲区是什么?您可以将其传递给
fgets()
,但不要使用它来分配内存。我提出的问题可以通过发布–完整的一个文件代码来解决,该文件代码演示了该问题。请阅读文件,文件的第一行长度是否小于10个字符?(假设
10
==10)但是……不要这样做。只需执行:
while((line=readline(fp))!=NULL){…
@WeatherVane我排除了处理部分,因为我不需要它们的帮助,它们工作得很好。至于BUFFER it=512,因为它被认为是MagicNumber。要复制它,你只需将行打印到stdout,但我的问题仍然是它只读取文件的第一行谢谢你的更正退出我可怕的while循环,不幸的是,我还不能完全测试它,而且在存储我从该行解析的信息方面似乎还有一些问题。同样,我也无法找到您在我的readLine函数中提到的任何泄漏,这也是一个问题。@JoshAvery第二个提示(几乎就是解决方案):如果
fgets
返回
NULL
,那么
line
会发生什么?它永远不会被释放,你是圣人。
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);
}