Home > Software design >  Stop reading .txt file on empty/blank line
Stop reading .txt file on empty/blank line

Time:07-04

I have done a code (below) to read the numbers from a .txt file. The first two numbers are to be put on a int variable, the numbers from the second line onwards are to be put on an array of strings. But I have a problem, if there is a blank/empty line at the end of the file some symbols are added on the array.

Example of the file with error:

10 20
45000000
48000000
56000000
-empty/blank line-

Code:

#include <stdio.h>
#include <conio.h>

#define MAX 100

int main(void) {
    FILE *file;
    int primNum;
    int secNum;
    int counter = 0;

    //Count number of lines
    int numberOfLines = 0;
    char ch;
    file = fopen("file.txt", "rt");
    if (file == NULL) {
        printf("Error\n");
        return 1;
    }
    for (ch = getc(file); ch != EOF; ch = getc(file)) {
        if (ch == '\n')
            numberOfLines  ;
    }
    numberOfLines  ;
    fclose(file);
    rewind(file);
    printf("Total number of lines are: %d\n", numberOfLines);

    //Continue
    file = fopen("file.txt", "rt");
    char listOfNumbers[numberOfLines][MAX];
    if (file == NULL) {
        printf("Error\n");
        return 1;
    }
    int i = 0;
    while (counter < numberOfLines) {
        if (counter == 0) {
            fscanf(file, "%d %d\n", &primNum, &secNum);
        } else {
            fscanf(file, "%s\n", listOfNumbers[i]);
            i  ;
        }
        counter  ;
    }

    //Testing Results
    printf("\n1st Number: %d", primNum);
    printf("\n2nd Number: %d", secNum);
    printf("\n\nList of Numbers on Array:");
    for (i = 0; i < numberOfLines - 1; i  ) {
        printf("\n%s", listOfNumbers[i]);
    }

    fclose(file);
    return 0;
}

It returns:

Total number of lines are: 5
1st Number: 10
2nd Number: 20

List of Numbers on Array:
45000000
48000000
56000000
←┤¼v'0@

The line counter correctly says it's 5 lines (counting the empty/blank one), but I need it to ignore it and still be able to put all of the numbers from the second line onwards on the array. I'm stuck with this problem and don't know how to solve it.

CodePudding user response:

You use fscanf() to read the contents of the file, fscanf() ignores white space and newlines. You should use the same calls to count the number of items and to actually read them after rewinding the stream pointer. Note that you call to rewind(file) after you close the file has undefined behavior.

Also note that ch must be defined as int to handle EOF reliably.

Here is a modified version:

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

#define MAX 100

int main() {
    FILE *file = fopen("file.txt", "r");
    if (file == NULL) {
        fprintf(stderr, "Cannot open file.txt: %s\n", strerror(errno));
        return 1;
    }
    // read the 2 numbers
    int primNum, secNum;
    if (fscanf(file, "%d %d\n", &primNum, &secNum) != 2) {
        fprintf(stderr, "invalid file format\n");
        fclose(file);
        return 1;
    }
    // count the number of items that can be read
    char line[100];
    int counter;
    for (counter = 0; fscanf(file, "           
  • Related