Problème de lecture de fichier

melodia22 -  
 melodia22 -
Bonjour !

A chaque fois que j'essaie de lire un fichier ça ne fonctionne pas. Je ne reçois aucun message d'erreur mais ça me renvoie une réponse comme si mon fichier était vide (ce qui n'est pas le cas) et je comprends pas d'où vient le problème..

Je vous mets un exemple de code (aussi simple soit-il) :

#include<stdio.h>

int main (){

FILE *fp;
char c = fgetc(fp);

fp = fopen ("oui.txt", "r");

if (fp = NULL){
printf ("Erreur fopen\n");
return 1;
}

while (c != EOF){
printf("%c",c);
c = fgetc(fp);
}

return 0;
}

Merci !!


Configuration: Windows / Chrome 81.0.4044.138
A voir également:

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 583
 
bonjour, peux-tu utiliser les balises de code quand tu postes du code?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

l'opérateur de comparaison en C est
==

le simple
=
fait une assignation, pas une comparaison.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour melodia22,

Je me demande à quoi sert

char c = fgetc(fp); ?????

De plus moi je lirais d'abord dans le fichier, puis j'imprimerais à l'écran:
while (c != EOF) { 
    c = fgetc(fp); 
    printf("%c",c); 
} 
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 
Dans le code de melodia22
char c = fgetc(fp);
pourrait servir à capturer le premier caractère avant d'entrer dans la boucle telle qu'elle l'a écrite. Il est juste mal placé dans son code, puisqu'il ne faut lire dans le fichier qu'une fois qu'on l'a ouvert en lecture, bien évidemment.

Avec ton code :
  • tu ne sais pas ce que vaut
    c
    avant d'entrer dans la boucle à moins de l'initialiser
  • si tu entres dans la boucle, mais que
    fgetc()
    échoue (ce qu'elle fera après le dernier caractère), tu affiches une valeur de
    c
    qui vaut alors EOF
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour Dal,

C'est vrai que j'ai répondu " à la louche", en pointant les plus gros trucs

Evidemment il faut initialiser c avant, ca me paraissait évident

On arrange ça:
while((c = fgetc(fp)) != EOF)
     printf("%c",c); 
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 
@Phil_1857,
Ta proposition de boucle est très efficace par sa concision :-). C'est un style de programmation qui est rendu possible par la flexibilité du C, qui permet de faire ces pirouettes avec une affectation contenue dans l'argument testé par le
while()
dont la valeur évaluée est testée avec un opérateur conditionnel. Ce n'est pas pas forcément le plus simple à comprendre pour melodia22 qui confond déjà l'opérateur de comparaison et d'affectation. Il ne manquait pas tant que cela pour corriger son code...

@melodia22 ton code corrigé :
#include <stdio.h>
  
int main(void) {
    FILE *fp;
    char c;

    fp = fopen ("oui.txt", "r");

    if (fp == NULL){
        printf ("Erreur fopen\n");
        return 1;
    }

    c = fgetc(fp);
    while (c != EOF){
        printf("%c",c);
        c = fgetc(fp);
    }

    return 0;
}
  • la ligne 9 corrige l'opérateur de comparaison (erreur signalée par yg_be)
  • la ligne 14 est correctement placée après l'ouverture en lecture du fichier et avoir vérifié que l'ouverture est réussie


Dal
0
melodia22 > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
D’accord merci à tous pour vos réponses !!

À vrai dire j’ai suivi ce tutoriel : https://youtu.be/j1lHUmwnmA0 et je comprenais donc pas pourquoi ça ne marchait pas pour moi..

Je prends tout en note, et encore merci
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Oui, j'espère qu'elle apprécie tout ça à sa juste valeur …
0