どのようにfgets()を使用し、charポインタの配列を使ってファイルのすべての行を格納するのですか?

I wrote the program below in order to read every line of the file and then store each line in a array of char pointers for later use (like sorting only the pointers not the real strings). But the problem is that it keeps storing the same line.

このファイルは file.txt と呼ばれ、テキストを含む2行があります。

  first sentence
  second sentence

私が書いたコードは次のとおりです:

#include 
#include 
#include 
#include 
#include 

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

私はここで間違っていますか?

-ご協力いただきありがとうございます :-)

2

3 答え

関数 fgets は新しいメモリを割り当てません。成功した場合、 eof == line - それはあなたが渡したものを返します。あなたは毎回それを上書きしています。

試してください:

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

もちろん、 free(lines [i])を覚えておく必要があります。

2
追加された

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 )をインタラクティブに使用するためにライセンスされています。

0
追加された
eof = fgets(line, 101, cf)
while(eof!=NULL)
{
    puts(eof);
    eof=fgets(line,101,cf);
    free(eof);
}
0
追加された