Skip to main content

How to read the content from the second line onwards on a .txt file on C

I need help to read the numbers of a .txt file and put them in an array. But only from the second line onwards. I'm stuck and don't know where to go from the code that i built.

Example of the .txt file:
10 20
45000000
48000000
56000000

#define MAX 50
int main (void){
    FILE *file;
    int primNum;
    int secNum;
    int listOfNumers[50];
    int numberOfLines = MAX;
    int i = 0;

    file = fopen("file.txt", "rt");

    if (file == NULL)
    {
        printf("Error\n");
        return 1;
    }

    fscanf(file, "%d %d\n", &primNum, &secNum);

    printf("\n1st Number: %d",primNum);
    printf("\n2nd Number: %d",secNum);

    printf("List of Numbers");

    for(i=0;i<numberOfLines;i++){
        //Count the number from the second line onwards
    }

    fclose(file);
    return 0;
}  
Answer

You just need a loop to keep reading ints from file and populate the listOfNumers array until reading an int fails.

Since you don't know how many ints there are in the file, you could also allocate the memory dynamically. Example:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE* file = fopen("file.txt", "rt");
    if(file == NULL) {
        perror("file.txt");
        return 1;
    }

    int primNum;
    int secNum;
    if(fscanf(file, "%d %d", &primNum, &secNum) != 2) {
        fprintf(stderr, "failed reading primNum and secNum\n");
        return 1;
    }

    unsigned numberOfLines = 0;

    // allocate space for one `int`
    int* listOfNumers = malloc((numberOfLines + 1) * sizeof *listOfNumers);
    // the above could just be:
    // int* listOfNumers = malloc(sizeof *listOfNumers);

    while(fscanf(file, "%d", listOfNumers + numberOfLines) == 1) {
        ++numberOfLines;
        // increase the allocated space by the sizeof 1 int
        int* np = realloc(listOfNumers, (numberOfLines + 1) * sizeof *np);
        if(np == NULL) break; // if allocating more space failed, break out
        listOfNumers = np;    // save the new pointer
    }
    fclose(file);

    puts("List of Numbers:");
    for(unsigned i = 0; i < numberOfLines; ++i) {
        printf("%d\n", listOfNumers[i]);
    }

    free(listOfNumers); // free the dynamically allocated space
}

Comments