0
int main() {
    FILE *matrix_r;
    matrix_r=fopen("matrix.txt","r");
    double x;char c;
    while(feof(matrix_r)){
        fscanf(matrix_r,"%lf%c",&x,&c);
        printf("%lf%c",x,c);
    }
    fclose(matrix_r);

    return 0;
}

Trying to read float values from the file but getting segmentation fault core dumped error. matrix.txt stores a matrix of floats.

contents of matrix.txt are below.

0.000000,876.671546,448.879717,1349.827396
876.671546,0.000000,1319.195209,964.193445
448.879717,1319.195209,0.000000,1741.628261
1349.827396,964.193445,1741.628261,0.000000
  • 4
    Welcome to SO. You do not check whether you got a valid `FILE*`. If you run your program from wrong directoy you may not find the file and then try to use a `NULL` pointer with `feof` and `fscanf`. You should also always check the return value of `fscanf` and other IO functions. – Gerhardh Jan 30 '23 at 10:42
  • Did you run your program in a debugger? It should tell you where you get the segmentation fault and then you can inspect what values are stored in the involved variables. – Gerhardh Jan 30 '23 at 10:43
  • 1
    `while(feof(matrix_r))` would usually be `while(!feof(matrix_r))` but even that is wrong. Use the value returned by `fscanf` to control the loop. `while(fscanf(matrix_r, %lf%c", &x, &c) == 2)` – Weather Vane Jan 30 '23 at 10:45
  • 1
    If the intention was `while(!feof(matrix_r))`: https://stackoverflow.com/questions/5431941/why-is-while-feoffile-always-wrong. – wohlstad Jan 30 '23 at 10:46
  • Note that [`while (!feof(file))` is always wrong!](https://stackoverflow.com/q/5431941/15168) – Jonathan Leffler Jan 30 '23 at 14:05

2 Answers2

2

fopen() failed and feof(NULL) caused the segfault. If fopen() was successful then feof() would return false and the loop wouldn't run but your program wouldn't segfault.

Check the return value of fopen() & fscanf(). You only need to call feof() if you need to find out why fscanf() failed to read 2 items.

#include <stdio.h>

int main() {
    FILE *matrix_r = fopen("matrix.txt", "r");
    if(!matrix_r) {
        perror("fopen");
        return 1;
    }
    for(;;) {
        double x;
        char c;
        int rv = fscanf(matrix_r, "%lf%c", &x, &c);
        if(rv != 2)
            break;
        printf("%lf%c", x, c);
    }
    fclose(matrix_r);
}

Here is the output:

0.000000,876.671546,448.879717,1349.827396
876.671546,0.000000,1319.195209,964.193445
448.879717,1319.195209,0.000000,1741.628261
1349.827396,964.193445,1741.628261,0.000000
Allan Wind
  • 23,068
  • 5
  • 28
  • 38
1
  1. You do not check if fopen was successful. Calls to feof or fscanf if the file pointer is NULL invoke Undefined Behaviour

  2. while(feof(matrix_r)){

while(!feof(...))) is always wrong (Why is “while( !feof(file) )” always wrong?), but your one has no logical sense at all (as you want to scanf if it is the end of the file).

0___________
  • 60,014
  • 4
  • 34
  • 74