Hoe fgets () te gebruiken en elke regel van een bestand op te slaan met behulp van een array van char pointers?

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.

Laten we zeggen dat het bestand file.txt heet en twee (2) regels met tekst heeft.

  first sentence
  second sentence

De code die ik schreef is de volgende:

#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;
}

De uitvoer die ik krijg is:

second sentence
second sentence

Maar ik wil krijgen:

first sentence
second sentence

Wat doe ik hier verkeerd?

-Bedankt voor je hulp :-)

2

3 antwoord

De functie fgets wijst geen nieuw geheugen toe . Dus in het geval van succes eof == line - dat klopt, het geeft terug wat je gepasseerd hebt. Je overschrijft het elke keer.

Proberen:

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

Natuurlijk moet je onthouden om gratis (lijnen [i]) .

2
toegevoegd

U moet getline (3) , bijv

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;

en je zou moeten overwegen om readline (3) en de GNU readline bibliotheek ( GPL met licentie) voor interactief gebruik.

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