How to use fgets() and store every line of a file using an array of char pointers?

14,248

The function fgets doesn't allocate new memory. So in case of success eof == line - that's right, it returns what you passed. You are overwriting it every time.

Try:

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

Of course you must remember to free(lines[i]).

Share:
14,248
limitcracker
Author by

limitcracker

I am interested in Networking, Operating Systems and Information Systems. I like to say that I "know" C, Java, Python and PHP.

Updated on June 04, 2022

Comments

  • limitcracker
    limitcracker almost 2 years

    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.

    Lets say that the file is called file.txt and has two(2) lines with text.

      first sentence
      second sentence
    

    The code I wrote is the following:

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

    The output I get is:

    second sentence
    second sentence
    

    But I want to get:

    first sentence
    second sentence
    

    What I am doing wrong here?

    -Thanks for your help :-)