Defecțiune de segmentare atunci când se utilizează fopen() (Programare, C, Fopen)

Christian Lindemann a intrebat.

Nu sunt sigur de ce se întâmplă acest lucru, dar primesc un „Segmentation fault (core dumped)” din acest cod foarte simplu. Aveți vreo idee de ce? Trebuie să folosesc un șir de caractere pentru a-i spune lui fopen() ce fișier să deschidă.

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

int main(void) {
    char *small = "small.ppm";
    FILE * fp;
    char word[5];
    fp = fopen(small, "r");
    fscanf(fp, "%s", word);
    printf("%s
", word);

    return 0;
}

Comentarii

  • fp este probabil NULL (nu ați verificat dacă fopen reușit). Cât de mare este cuvântul pe care încercați să îl citiți? –  > Por abelenky.
  • Prima linie este doar o linie scurtă de 2 caractere care spune „P3”, care este tot ceea ce încerc să citesc în acest caz. Fișierul small.ppm în sine are 10 linii de cod care conțin în mare parte valori RGB pentru o imagine foarte mică. –  > Por Christian Lindemann.
2 răspunsuri
Stargateur

Codul tău ar putea invoca un comportament nedefinit, înlocuiește cu:

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

int main(void) {
    char *small = "small.ppm";
    FILE * fp = fopen(small, "r");
    if (fp == NULL) {
        perror("fopen()");
        return EXIT_FAILURE;
    }
    char word[5];
    if (fscanf(fp, "%4s", word) != 1) {
        fprintf(stderr, "Error parsing
");
        return EXIT_FAILURE;
    }
    printf("%s
", word);
}

Comentarii

  • @ChristianLindemann ei bine, ai problema ta, programul tău nu are acces la fișierul tău, deci nu-l poate deschide. încearcă. chmod +r small.ppm în consolă. –  > Por Stargateur.
  • Un pic mai multe explicații cu privire la ceea ce ai schimbat ar crește mult valoarea acestui răspuns. –  > Por Kami Kaze.
  • @Kami Cred că este destul de ușor de explicat ce s-a schimbat, presupunând că ai petrecut mai mult de o oră citind „cum să scrii C”. –  > Por Kcvin.
  • @Kcvin Aș paria că o bună parte din studenții care au programare C nu o înțeleg complet după 2 semestre. Cred doar că un răspuns bun trebuie să conțină mai mult decât codul fix. –  > Por Kami Kaze.
  • @KamiKaze „Error checking/handling” este un element fundamental pe care studenții la programare ar trebui să îl învețe în orice curs 101. –  > Por Kcvin.
Schwern

Dacă fișierul nu există fp va fi NULL și astfel fscanf(fp, ...) va fi segfault.

Este important să verificați dacă toate operațiunile cu fișiere au succes. Modelul obișnuit este ceva de genul…

FILE *fp = fopen(filename, "r");
if( fp == NULL ) {
    fprintf(stderr, "Couldn't open %s: %s
", filename, strerror(errno));
    exit(1);
}

Tags:,