【问题标题】:using fgets() to extract lines from a file not working使用 fgets() 从不工作的文件中提取行
【发布时间】:2018-03-16 23:24:35
【问题描述】:

我正在尝试开发一个函数来读取文本文件的每一行并将它们存储在字符串数组中(char**),但 fgets() 似乎不起作用,它总是返回一个空字符。

这里是函数

 char** getLines(FILE* fp){

    char** lines;
    int numberOfLines; //number of lines int the file
    char ch; //aux var
    int i; //counter

    while(!feof(fp)){
        ch = fgetc(fp);
        if( ch == '\n'){
            numberOfLines++;
        }
    }

    lines = malloc(numberOfLines*sizeof(char*));

    if (lines==NULL){
        fprintf(stderr,"Error, malloc failed");
        exit(1);
    }

    for(i = 0; i<numberOfLines; i++){
        lines[i] = malloc(MAX_LENGTH*sizeof(char)); //MAX_LENGTH = 128
    }

    i=0;
    while(fgets(lines[i], MAX_LENGTH,fp)){
        printf("Line %d: %s \n",i,lines[i]);
        i++;
    }

    return lines;

}

该函数永远不会进入 while 循环,因此它不会打印任何内容 我也在使用一个非常简单的输入文件:

test line 1
test line 2
test line 3
test line 4

希望你能帮助我, 提前谢谢你。

【问题讨论】:

  • 我读的是MAX_LENGHT而不是MAX_LENGTH吗?
  • C 或 C++ - 选择一个。你的代码看起来像 C。
  • 我建议你花一些时间阅读Why is “while ( !feof (file) )” always wrong? 还要注意fgetc 返回一个int
  • 至于你的问题,检查行数后想想文件指针在哪里。要是有办法让rewind文件指针重新开始就好了……
  • 您在致电fgets 之前阅读了整个文件。所以当然它不是在读任何东西。没有什么可读的了。您应该修复您的代码以在读取行时根据需要动态增长行数组,并且只尝试读取一次文件。

标签: c fgets


【解决方案1】:

在进入 while 循环之前,你已经在文件的末尾了。

看这里http://en.cppreference.com/w/cpp/io/c/rewind

将文件位置指示器移动到给定文件流的开头。该函数等价于 std::fseek(stream, 0, SEEK_SET);除了文件结束和错误指示器被清除。该函数会删除以前调用 ungetc 的任何效果。

检查这是否有效:

char** getLines(FILE* fp){
    /* ...... */
    i=0;
    rewind(fp); // Rewind here
    while(fgets(lines[i], MAX_LENGTH,fp)){
        printf("Line %d: %s \n", i, lines[i]); // Also use the index as first parameter
        i++;
    }

    return lines;

}

【讨论】:

  • 好的,我知道了,非常感谢,你知道我怎样才能重新回到文件的开头吗?
  • 非常感谢,它成功了,但是现在当我尝试打印该行时出现分段错误
  • Rewinding 是一种懒惰的做法,它会阻止它处理不支持 seek 的流,例如套接字(包括管道)、控制台输入等。正确的做法这是为了在您阅读越来越多的行时动态调整您的数组。
  • @SimonSchneider 实际上,没有必要重复整个代码(只是让发现倒带部分变得更加困难......)。最好只给出之前和之后的一些提示(例如,只在之前和之后立即留下循环,或者只在它们的标题后面加上评论(/* ... */)。
  • @TomKarzes 没错,但看起来没有必要在这里做得更好。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2015-09-06
  • 2019-05-10
  • 2020-08-19
  • 1970-01-01
  • 2021-12-27
  • 2017-08-29
相关资源
最近更新 更多