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 :

problème avec fopen()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 14
    Par défaut problème avec fopen()
    Bonjour j'ai besoin de votre aide pour un code utilisant fopen. Celui ne me retourne pas "impossible d'ouvrir le fichier" donc j'en ai déduit que le fichier a bien été ouvert. Cependant rien de ce que j'ai met dans ma condition else ne s'affiche, ca me laisse un curseur en attente. En ayant activé les erreurs avec "gcc -Wall -W -Werror" rien ne s'affiche et valgrind 0 erreurs.
    Voici mon code :
    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
    27
    28
    29
    30
    31
    int main(){
     
    	FILE* fichier = NULL; 
    	fichier = fopen("json_test_files/test.json", "r");
    	int size = 0;
     
     
    	/* si fichier est vide on arrête tout*/
    	if(!fichier){
    		printf("impossible d'ouvrir le fichier\n");
    		exit(1);
    	}
    	else{
    		printf("fdsfsfds"); // j'ai essayé de mettre n'importe quoi dans le else mais rien ne s'affiche
    		char r = fgetc(fichier);
    		/*on calcule la taille du fichier*/
    		while(r != EOF){
    			size++;
     
    		}
    		char *chaine = malloc((size) * sizeof(char));//j'alloue une chaine de taille "size" de char
     
    		/*tant que le fichier n'est pas fini, on le met dans chaine*/
    		while(fgets(chaine, size, fichier)){
    			analyseurLR(chaine);//fonction qui renvoie 0 si l'analyse a réussi, 1 sinon
    		}
    		free(chaine);
    	}
    	fclose(fichier);
    	return 0;
    }
    Merci d'avance pour vos réponses!!

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 14
    Par défaut
    j'ai essayé d'une deuxieme facon où je tape l'executable avec le nom du fichier dans la commande gcc (pas sur du (void)argc ) qui me fait le même résultat.
    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
    27
    28
    29
    30
    31
    32
    33
    34
    int main(int argc, char* argv[]){
     
    	(void)argc;
    	FILE* fichier = NULL; 
    	fichier = fopen(argv[0], "r");
    	int size = 0;
     
     
    	/* si fichier est vide on arrête tout*/
     
     
    	if(fichier){
    		printf("fdsfsfds"); // j'ai essayé de mettre n'importe quoi dans le else mais rien ne s'affiche
    		char r = fgetc(fichier);
    		/*on calcule la taille du fichier*/
    		while(r != EOF){
    			size++;
    		}
    		char *chaine = malloc((size) * sizeof(char));//j'alloue une chaine de taille "size" de char
     
    		/*tant que le fichier n'est pas fini, on le met dans chaine*/
    		while(fgets(chaine, size, fichier)){
    			analyseurLR(chaine);//fonction qui renvoie 0 si l'analyse a réussi, 1 sinon
    		}
    		free(chaine);
    	}
    	else{
    		printf("impossible d'ouvrir le fichier\n");
    			exit(1);
    	}
     
    	fclose(fichier);
    	return 0;
    }

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Si tu ne passes pas dans le if alors tu passes forcément dans le else.
    Par contre, il faut rewind le fichier après la boucle de fgetc, sinon tu es à la fin et les fgets suivants ne liront rien.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    - Ligne 5, l'argument passé à l'executable est le second de argv, il faut donc mettre [1].
    - Ligne 13, il n'y a pas de \n à la fin du printf donc il risque de ne jamais être visible. Mettre le \n ou forcer l'émission en appelant fflush(stdout);.
    - Ligne 14, r est déclaré comme un char mais fgetc() retourne un int car c'est soit un caractère soit EOF. Il fait définir r comme étant un int.
    - Ligne 16, le test risque d'être toujours faux (on compare l'int EOF à un char) et le programme bloque alors indéfiniment. Voir commentaire ligne 14.
    - Ligne 19, il faut allouer un char de plus pour stocker le caractère de fin de chaine (le problème se verra sur un fichier d'une seule ligne.)
    - Ligne 20, il faut faire un rewind(fichier) comme l'a expliqué Bousk.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    As-tu remarqué que r ne change jamais dans ta boucle ? Il semble que je sois le premier à le voir

    Sinon les autres erreurs dans ce code
    • ton printf() de debug n'est pas forcé de s'afficher au moment où il s'exécute car il ne contient pas de '\n'. Certes il s'affichera à un moment ou à un autre (au pire quand ton programme se termine) mais pas forcément quand tu le souhaites => termine ta string par un '\n' (et en plus ton debug sera plus propre avec des lignes bien franches)
    • tu utilises un char pour chercher EOF. Or EOF vaut 0xffff (soit un int). Et casté sur un char, 0xffff devient 0xff. Comment alors feras-tu la différence entre "0xff" (EOF casté) et "0xff" (caractère de valeur ascii 255, qui peut très bien se trouver dans ton fichier) ? Ce n'est pas pour rien si la fonction fgetc() retourne un int.
    • la fonction fgets() lit un caractère de moins que la taille demandée, pour garder une place de libre pour y stocker le '\0' qu'elle positionne elle-même. Il te faut donc demander "size+1" pour être sûr de tout lire (et donc allouer "size+1" char pour être sûr d'avoir la place pour tout y compris le '\0' qui viendra en plus)
    • la fonction fgets() s'arrête au premier '\n' rencontré (ce caractère symbolisant une fin de ligne, ce qui est alors marquant pour une fonction chargée de lire une ligne). Si tu veux lire un fichier à la "brute force" il te faut utiliser fread(). Et dans ce cas, il n'y aura pas de '\0' de positionné donc à moins de le mettre manuellement tu ne pourras pas traiter "chaine" comme une chaine (interdit d'y appliquer la moindre fonction "strxxx()")
    • une fois que tu es à la fin du fichier, tout comme quand tu es à la fin d'un livre, ben tu as alors tout lu et il n'y a plus rien à lire. Si tu veux le relire il te faut revenir au début

    Et sinon tu es sûr de vouloir lire argv[0] ?

    Bref contrairement à ton titre, le vrai problème ce n'est pas fopen() mais tout le reste. Tu aurais d'ailleurs dû t'en douter que si la fonction n'a pas renvoyé NULL c'est qu'elle a réussi mais si le reste ne suit pas, alors c'est que cela vient du reste. Et dernier détail, le (void)argc, lui, restera pour moi à jamais une énigme.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problème avec fopen
    Par morgan47 dans le forum Langage
    Réponses: 5
    Dernier message: 21/12/2006, 22h47
  2. problème avec fopen
    Par eoberlin dans le forum C++
    Réponses: 10
    Dernier message: 26/08/2006, 20h26
  3. Problème avec fopen
    Par Fonzy007 dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2006, 18h15
  4. [FTP] Problème avec fopen sur URL
    Par Biboune2008 dans le forum Langage
    Réponses: 14
    Dernier message: 22/06/2006, 17h00
  5. Problème avec fopen
    Par Binouce dans le forum C
    Réponses: 10
    Dernier message: 15/01/2006, 13h59

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