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 :

Pb fprintf, fscanf pour un fichier .txt


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Pb fprintf, fscanf pour un fichier .txt
    Bonjour à tous, voilà mon petit bout de 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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
     
    {
        char car;
        FILE *in;
        in=fopen("essai.txt","r+");
        fprintf(in,"%c",'O');
        fprintf(in,"%c",'K');
        fscanf(in,"%c",&car);
        fclose(in);
        return 1;
    }
    Avant exécution mon fichier "essai.txt" contient "MARCHE PAS"
    Après il contient des caractères carrées et ininterprétable.

    Si je mets le fscanf en commentaire j'ai "OKRCHE PAS" au final (normal quoi).

    Donc je comprends pas, je croyais que les fprintf et fscanf décalaient le pointeur "in" juste après ce qu'ils écrivaient ou lisaient, donc normalement mon fscanf devrait scanner le 'R' de "MARCHE PAS".

    J'utilise le bloc note en mode ANSI et developpe avec Dev C++.

    Merci d'avance...

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Pb fprintf, fscanf pour un fichier .txt
    Citation Envoyé par GeekMéPaTrop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        char car;
        FILE *in;
        in=fopen("essai.txt","r+");
        fprintf(in,"%c",'O');
        fprintf(in,"%c",'K');
        fscanf(in,"%c",&car);
        fclose(in);
        return 1;
    }
    • fopen() peut echouer. Il fait tester la valeur retournée. Si c'est NULL, problème...
    • "r+" permet d'écrire par dessus un fichier existant.
      "r+" Open for reading and writing. The stream is positioned at the
      beginning of the file.
      C'est une manip assez dangereuse qui se termine souvent par la destruction du fichier. Tu veux faire quoi exactement ?

    Avant exécution mon fichier "essai.txt" contient "MARCHE PAS"
    Après il contient des caractères carrées et ininterprétable.

    Si je mets le fscanf en commentaire j'ai "OKRCHE PAS" au final (normal quoi).

    Donc je comprends pas, je croyais que les fprintf et fscanf décalaient le pointeur "in" juste après ce qu'ils écrivaient ou lisaient, donc normalement mon fscanf devrait scanner le 'R' de "MARCHE PAS".

    J'utilise le bloc note en mode ANSI et developpe avec Dev C++.
    Pourquoi le bloc note ? L'éditeur integré de Dev-C++ ne te plait pas ?

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Lorsque un fichier est ouvert en mode Update (r+) , un lecture ne peut directement suivre une écriture sans faire intervenir une commande de positionnement du pointeur (fseek, rewind...)
    ( et une écriture ne peut suivre une lecture sans faire intervenir une commande de positionnement du pointeur (fseek, rewind...) à moins, je crois d'être en fin de fichier.)

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Pour Emmanuel :
    - Dsl pour la non vérification du fopen(), c'était juste pour les tests, je savais que l'ouverture fonctionnait
    - j'utilise "r+" parceque je veux Lire et Ecrire dans un fichier existant
    - le but de mon programme est d'enlever les sauts de ligne et tous les accents d'un fichier txt (je suis contraint d'utiliser ce format).
    Donc je comptais faire un pointeur qui lis et un pointeur juste derrière qui rectifie dès qu'il y a un accent... mais je pense qu'avec les fonctions rewind, je vais m'en sortir sans utiliser 2 pointeurs...

    Pour diogene : merci beaucoup ! je comprends pas pourquoi on doit utiliser ce genre de fonctions (je croyais qu'on traitait juste d'un pointeur qui se balladait dans le fichier et avançait à coup de fprintf et fscanf, mais ça a l'air plus compliqué que cela)... je vais me renseigner...

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par GeekMéPaTrop
    Pour Emmanuel :
    - Dsl pour la non vérification du fopen(), c'était juste pour les tests, je savais que l'ouverture fonctionnait
    Pas chez moi, j'ai eu un beau crash...
    - j'utilise "r+" parceque je veux Lire et Ecrire dans un fichier existant
    en "r+" ou "w+", on ne peut rien 'enlever'. On ne peut que modifier l'existant.
    - le but de mon programme est d'enlever les sauts de ligne et tous les accents d'un fichier txt (je suis contraint d'utiliser ce format).
    En principe, pour ce genre de manips, on utilise 2 fichiers. Non seulement c'est plus simple, mais en plus on garde une trace de la version -1...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    En fait ce n'est qu'une partie du programme et le nom du fichier de départ doit être (ça serait mieux) le même que le fichier d'arrivée... donc je crois que je vais créer un 2ème fichier dans lequel j'incorpore toutes mes modifications et ensuite j'efface le premier et renomme le 2ème, ça doit être possible ça ?

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par GeekMéPaTrop
    En fait ce n'est qu'une partie du programme et le nom du fichier de départ doit être (ça serait mieux) le même que le fichier d'arrivée...
    Ce genre de détail ne doit pas influencer la réalisation.
    donc je crois que je vais créer un 2ème fichier dans lequel j'incorpore toutes mes modifications et ensuite j'efface le premier et renomme le 2ème, ça doit être possible ça ?
    Bien sûr et c'est une pratique courante :

    rename()
    remove()

    Exemple d'application :
    http://emmanuel-delahaye.developpez.com/clib.htm
    Module FIC
    Fonction FIC_backup()

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci bcp, on peut dire que le pb est résolu !

    Mais je ne comprends toujours pas pourquoi fprintf suivi de fscanf marchait. Le langage C est un langage de bas niveau (au sens proche de la machine) et donc on peut bien se représenter ce qui se passe dans les buffers... ou comment le C gère la mémoire, mais sur ce problème, je bloque -> ma représentation des fichiers seulement sous forme de pointeur doit être erroné...

    En tous cas merci à ceux qui m'ont aidé...

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par GeekMéPaTrop
    Mais je ne comprends toujours pas pourquoi fprintf suivi de fscanf marchait. Le langage C est un langage de bas niveau (au sens proche de la machine) et donc on peut bien se représenter ce qui se passe dans les buffers... ou comment le C gère la mémoire, mais sur ce problème, je bloque -> ma représentation des fichiers seulement sous forme de pointeur doit être erroné...
    Le langage C est le plus bas des langages de haut niveau, mais c'est un quand même un langage de haut niveau, surtout en ce qui concerne l'abstraction que sont les flux (comme par hasard, le seul 'objet' ayant une interface orientée objet).

    Ce qui se passe dans les flux ne concerne pas le programmeur. Il doit ce contenter de suivre ce qui est écrit dans la doc.

Discussions similaires

  1. [AC-2003] Récupérer champs d'une table pour nom fichier .txt à exporter
    Par jmpinault dans le forum Access
    Réponses: 1
    Dernier message: 30/10/2010, 11h51
  2. Proc pour écrire fichier txt
    Par castorameur dans le forum Développement
    Réponses: 2
    Dernier message: 29/03/2010, 19h09
  3. java Midlet pour les fichier .txt
    Par ramroum1986 dans le forum Java ME
    Réponses: 7
    Dernier message: 19/06/2009, 15h05
  4. Réponses: 1
    Dernier message: 15/04/2009, 11h25
  5. Pb Boucle VB6 pour parcourir fichier TXT en VB6
    Par C_Mila dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/02/2007, 12h22

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