如何使用fgets()并使用char指针数组存储文件的每一行?

时间:2011-10-27 19:00:19

标签: file pointers fgets arrays

我编写了下面的程序,以便读取文件的每一行,然后将每一行存储在一个char指针数组中供以后使用(比如只排序指针而不是真正的字符串)。 但问题是它一直存储相同的行。

假设该文件名为 file.txt ,并且有两(2)行文本。

  first sentence
  second sentence

我写的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>

int main(){
    FILE *cf;
    cf = fopen("file.txt", "r");
    char line[101];
    char *lines[2];
    char *eof;

    int i=0;
    while((eof = fgets(line, 101, cf)) != NULL){
        lines[i] = eof;
        i++;
    }

    printf("%s\n", lines[0]);
    printf("%s\n", lines[1]);

    system("pause");
    return 0;
}

我得到的输出是:

second sentence
second sentence

但我想得到:

first sentence
second sentence

我在这里做错了什么?

- 感谢您的帮助: - )

3 个答案:

答案 0 :(得分:2)

函数fgets 不会分配新内存。因此,如果成功eof == line - 那是正确的,它会返回您传递的内容。你每次都要覆盖它。

尝试:

while((eof = fgets(line, 101, cf)) != NULL){
    lines[i] = strdup(eof);
    i++;
}

当然,您必须记得free(lines[i])

答案 1 :(得分:0)

您应该使用getline(3),例如

char* myline = NULL;
size_t mylinesize = 0;
ssize_t mylinelen = 0;
while ((mylinelen = getline(&myline, &mylinesize, cf)) >= 0) {  
    lines[i++] = strdup(myline);
}
free (myline); 
myline = NULL;

您应该考虑使用readline(3)GNU readline库(GPL许可)进行交互式使用。

答案 2 :(得分:0)

eof = fgets(line, 101, cf)
while(eof!=NULL)
{
    puts(eof);
    eof=fgets(line,101,cf);
    free(eof);
}