使用fgets()从文件中提取行不起作用

我正在尝试开发一个函数来读取文本文件的每一行,并将它们存储在一个字符串数组中(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

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

回答(1)

2 years ago

在进入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;

}