Як выкарыстоўваць fgets () і захоўваць кожную радок файла, выкарыстоўваючы масіў знакавых паказальнікаў?

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 <�моцны> не вылучае новую памяць . Такім чынам, у выпадку поспеху ВФ == радок - гэта права, ён вяртае тое, што вы прайшлі. Вы перазапісваць яго кожны раз.

спроба:

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

Вядома, вы павінны памятаць свабодныя (радкі [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) і <�а HREF = "http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html" отн = "NOFOLLOW"> GNU Readline бібліятэка ( GPL ліцэнзаваны) для інтэрактыўнага выкарыстання.

0
дададзена
eof = fgets(line, 101, cf)
while(eof!=NULL)
{
    puts(eof);
    eof=fgets(line,101,cf);
    free(eof);
}
0
дададзена