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

Time:07-03

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

CodePudding user response:

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
}

CodePudding user response:

There are a few ways to approach this, if you know the size of the first line, you should be able to use fseek to move the position of the file than use get line to get each line of the file.

int fseek(FILE *stream, long offset, int whence);

whence can be:

  • SEEK_SET : the Beginning
  • SEEK_CUR : the current position
  • SEEK_END : the End

The other option would to encapsulate the entire file read in a while loop:

char *line = NULL;
size_t linecap = 0;
ssize_t linelen;
int counter = 0;

while((linelen = getline(&line, &linecap, file)) != -1){
    if counter == 0{
        sscanf(line, "%d %d\n", &primNum, &secNum);
    }else{
        //Process your line
    }
    counter  ; //This would give you your total line length
}
  • Related