IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction fread [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Par défaut Fonction fread
    Bonsoir à tous,

    Je ne comprends pas pourquoi le code suivant ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <stdio.h>
     
    main()
    {
        char td[300];
        int nbc, nbt, i, j, k;
        char nomFichier[21];
     
        FILE *fichier;
     
        printf("nom du fichier à lister : ");
        scanf("%20s", nomFichier);
     
        fichier = fopen(nomFichier, "r");
     
        for (j = 0; j < 30; j++) {
        nbc = fread(td[j], sizeof(char), 30, fichier);
        nbt = nbc + nbt;
        }
        for (k = 0; k = nbt; k++)
        printf("%c", td[k]);
     
        printf("n");
        fclose(fichier);
    }
    J'obtiens l'alerte de compilation suivante :
    warning: passing argument 1 of ‘fread’ makes pointer from integer without a cast

    Et à l'exécution j'obtiens l'erreur suivante :
    Segmentation fault: 11

    Pourtant, lorsque je change le programme de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <stdio.h>
     
    main()
    {
        char td[300];
        int nbc, nbt, i, j, k;
        char nomFichier[21];
     
        FILE *fichier;
     
        printf("nom du fichier à lister : ");
        scanf("%20s", nomFichier);
     
        fichier = fopen(nomFichier, "r");
        nbc = fread(td, sizeof(char), 30, fichier);
        for (i = 0; i < nbc; i++)
        printf("%c", td[i]);
     
        printf("n");
        fclose(fichier);
        printf("%d", nbc);
     
    }
    ça fonctionne correctement.
    Donc pourquoi fread(td, sizeof(char), 30, fichier) ne renvoie pas d'erreur alors que fread(td[i], sizeof(char), 30, fichier) en renvoie une ?

    Merci pour votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Met les balises code et indente ton code pour plus de lisibilité.

    Ensuite, après un fopen ou un fread, il faudrait peut être faire des tests.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    file = fopen...
    if(file == NULL)
    {
          fprintf(stderr, "blabla\n");
          exit(0)/return NULL/return 1/etc...
    }
     
    nb = fread....
    if(nb < 0)
    {
           fprintf(stderr, "blabla\n");
           exit(0)/return NULL/return 1/etc...
    }

    fread demande un pointeur (void *)
    td est char [100]. td est donc un pointeur qui pointe sur la première case d'un tableau de char.
    td[i] est un char. td[i] est donc qu'un caractère/octet.
    Lorsque tu va mettre td, la fonction récupèrera le contenu de td qui est l'adresse de la première case.
    Par contre, quand tu va mettre td[i], la fonction va considérer que le (i+1)ième caractère est l'adresse, tu va donc pointer sur n'importe quoi.
    D'où ton segfault.

    Tu dois mettre &td[i] ou (td + i) si tu veux que cela marche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction fread
    Par algoverage dans le forum Débuter
    Réponses: 3
    Dernier message: 15/01/2012, 11h08
  2. Réponses: 6
    Dernier message: 30/12/2011, 22h14
  3. Probleme sur les fichiers (fonction fread)
    Par anoir dsr dans le forum C
    Réponses: 7
    Dernier message: 27/01/2011, 14h31
  4. parametrage fonction fread
    Par sone47 dans le forum C
    Réponses: 3
    Dernier message: 05/03/2007, 15h22
  5. Les fonctions fread et fwrite
    Par Sara83 dans le forum MATLAB
    Réponses: 1
    Dernier message: 16/10/2006, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo