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 :

probleme avec fread


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 17
    Points
    17
    Par défaut probleme avec fread
    salut à tous,

    j'ai un petit problème avec une fonction contenant un fread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     long DimDefine(char *filename){
    	FILE * entree;
    	char c;
      	long i = 0;
     
      	entree = fopen(filename, "r");  
      	while (fread (&c, sizeof(char), 1, entree), ! feof(entree)){
        		i++;
    	}
      	fclose(entree);
      	return i;
    }
    celle-ci prend un nom de fichier en entrée et compte les nombre de caracteres dans celui-ci. Mais bizarrement, j'ai une "segmentation fault" à l'execution de cette fonction.
    Lorsque j'affiche la variable "i", il est egal au nombre de caracteres du fichier juste avant l'erreur.
    J'ai beau chercher d'ou vient le probleme, rien y fait... Si vous voyez, n'hesitez pas!
    merci pour vos réponses

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entree = fopen(filename, "r");
    Il faudrait tout d'abord tester le retour de fopen ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread (&c, sizeof(char), 1, entree), ! feof(entree)
    J'avoue ne pas utiliser ce style de construction, et je préfère un opérateur booléen ...

    Lorsque j'affiche la variable "i", il est egal au nombre de caracteres du fichier juste avant l'erreur.
    Ca ne te met pas la puce à l'oreille ? Si tu affiche la variable i et qu'elle vaut le nombre de caractère que tu as dans ton fichier, ça veut donc dire que ça plante juste après, non ? Je te laisse conclure .

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En général on mémorise le retour de fread et on le compare avec le nombre d'entrées demandé.
    Tu utilise fread pour un seul caractères, autant faire un fgetc.
    feof indique simplement si le problème de lecture est du à une fin de fichier ou autre chose

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    autant pour moi, la fonction compte bien le nombre de caractere.
    par contre la variable sensée recuperer le résultat indique des chiffres louches.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    long nbcar = 0;
    nbcar = DimDefine(filename);
    pour un ficher de 77 caractères "i" = 77, "nbcar" = 1075229452...

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Euh perso j'ai repris exactement ce que tu as fais :

    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>
    #include <stdlib.h>
     
    long DimDefine(char *filename){ 
      FILE * entree; 
      char c; 
      long i = 0; 
     
      entree = fopen(filename, "r");  
      while (fread (&c, sizeof(char), 1, entree), ! feof(entree)){ 
        i++; 
      } 
      fclose(entree); 
      return i; 
    }
     
    int main ()
    {
      long taille = DimDefine("test.c");
     
      fprintf(stderr,"%ld\n",taille);
      return EXIT_SUCCESS;
    }
    Et chez moi le résultat donne ça :
    ./a.out
    382
    Je compare avec wc :
    wc -c test.c
    382 test.c
    S'il y a un problème il n'est pas dans ta fonction (hormis le fait, je le répète qu'il faudrait que tu testes le retour de fopen), il faut que tu montres un peu plus de code.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si c'est pour compter le nombre de caractères, (la longueur), fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned long len;
    FILE *f = fopen(monfic,"r");
    if (f == NULL)
      return 0; // ou autre chose !!
     
    fseek(f, SEEK_END, 0l);
    len = ftell(f);
    fclose(f);
    return len;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    j'ai testé avec ton code trap D... ça donne exactement le même souci... c'est superbizarre, surtout que c'est pas la premiere fois que j'utilise cette fonction...

    le .C ou je fais l'appel de la fonction:

    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>
    #include <math.h>
    #include "filework.h"
    #include "out.h"
    #include "vectcomp.h"
    #define LG 100
    char filename[LG];
     
     
    int main (int argc, char *argv[]){
    	int i = argc-1;
    	int z = 0;
    	long nbcar = 0;
     
     
    	printf("debut prog\n");
    	while (argv[i][z] != '\0'){
    		filename[z] = argv[i][z];
    		z++;
    	}
     
    	printf("Dimdefine\n");
    	nbcar = DimDefine(filename);
    }
    le fichier contenant la fonction Dimdefine:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "out.h"
    #include "filework.h"
     
    long DimDefine(char *filename){
    	FILE * entree;
    	char c;
      	long i = 0;
     
      	entree = fopen(filename, "r");  
      	while (fread (&c, sizeof(char), 1, entree), ! feof(entree)){
        		i++;
      	}
      	fclose(entree);
      	return i;
    }

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    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
     
    int main (int argc, char *argv[]){ 
       int i = argc-1; 
       int z = 0; 
       long nbcar = 0; 
     
     
       printf("debut prog\n"); 
       while (argv[i][z] != '\0'){ 
          filename[z] = argv[i][z]; 
          z++; 
       } 
     
       printf("Dimdefine\n"); 
       nbcar = DimDefine(filename); 
    }
    Tu ne testes pas le nombre d'argument que tu transmet à ton programme ?

    De plus, ta boucle while est un peu superflue, il existe des fonctions pour copier les chaines de caractère cf la famille strcpy ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par PRomu@ld
    Tu ne testes pas le nombre d'argument que tu transmet à ton programme ?
    .
    Non, mais je le ferai, promis

    Citation Envoyé par PRomu@ld
    De plus, ta boucle while est un peu superflue, il existe des fonctions pour copier les chaines de caractère cf la famille strcpy ...
    Je compte juste le nombre de caractères dans le fichier, je n'ai pas besoin de copier ce qu'il contient.

    Ne cherchez plus j'ai trouvé l'erreur : elle est plus loin dans mon programme (vulgaire débordement d'indice), quand au nbcar = 1045368... c'est simplement du à un printf("nbcar = %ld\n");

    merci pour vos réponses avisées et votre réactivité. C'est promis je voue embeterrai pls pour rien...

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Je compte juste le nombre de caractères dans le fichier, je n'ai pas besoin de copier ce qu'il contient.
    On ne parlait pas de la même chose, la boucle que je critiquais c'est celle qui te permet de récupérer le nom de ton fichier, c'est à dire celle de ton main !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par PRomu@ld
    On ne parlait pas de la même chose, la boucle que je critiquait c'est celle qui te permet de récupérer le nom de ton fichier, c'est à dire celle de ton main !
    Ok, je voyais pas ça comme ça. merçi du conseil.

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

Discussions similaires

  1. probleme avec fread
    Par supercyprien dans le forum Débuter
    Réponses: 1
    Dernier message: 21/06/2010, 00h30
  2. Probleme avec fread ou fwrite.. binaire pas lisible ?
    Par titimoi dans le forum Débuter
    Réponses: 16
    Dernier message: 16/01/2009, 13h14
  3. Réponses: 4
    Dernier message: 18/11/2007, 10h20
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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