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 :

Ecriture impossible avec fopen r+ sous windows 7


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    611
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 611
    Par défaut Ecriture impossible avec fopen r+ sous windows 7
    Bonjour,

    j'essaye d'ouvrir un fichier en lecture + écriture sous windows 7 avec le code suivant :
    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
    35
    #include <stdio.h>
     
    int main( void )
    {
        char filename[] = "data";
        FILE *fp = NULL;
     
        if( (fp = fopen( filename, "w" )) )
        {
            fprintf( fp, "abcd" );
            fclose( fp );
        }
        if( (fp = fopen( filename, "r+" )) )
        {
            int c = 0;
     
            c = fgetc( fp );
            printf( "%c ", c );
     
            fputc( 'x', fp );
            fflush( fp );
     
            fseek( fp, -1, SEEK_CUR );
            c = fgetc( fp );
            printf( "%c ", c );
     
            rewind( fp );
            while( (c = fgetc( fp )) != EOF )
            {
                printf( "%c ", c );
            }
        }
     
        return 0;
    }
    Or, il m'affiche a d a b c d au lieu de a x a x c d.

    Si j'envoie l’exécutable chez une autre personne avec win7, même souci.
    J'utilise le compilo mingw4.8.1 tdm-2 (fourni avec codeblocks).


    J'ai donc plusieurs questions:
    — est ce que ce code donne la même chose chez tous les utilisateurs de Windows ? Le souci viendrait peut-être de mon compilo ?
    — cela pourrait être lié a la « sécurité » des dossiers de Win7? J'ai bien viré tous les lectures seules, etc. mais on ne sait jamais…
    — si je fais un exécutable fonctionnel du coup, ça marchera partout ?

    Merci d'avance.

    Edit:
    j'ai testé avec une autre version du compilo, ça ne marche pas non plus. Le souci viendrait donc de Windows ?

  2. #2
    Expert confirmé
    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
    Par défaut
    Il y a un comportement indéterminé sur ce code. Le mode + a des contraintes pour passer de la lecture à l'écriture ou de l'écriture à la lecture.
    However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek,fsetpos, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters endof-file.
    On doit donc avoir par exemple :
    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
        if( (fp = fopen( filename, "r+" )) )
        {
            int c = 0;
     
            c = fgetc( fp );
            printf( "%c ", c );
     
            fseek( fp, 0, SEEK_CUR );    // repositionnement
            fputc( 'x', fp );
            fflush( fp );                      // superflu à cause du repositionnement qui suit
     
            fseek( fp, -1, SEEK_CUR );  // repositionnement
            c = fgetc( fp );
            printf( "%c ", c );
     
            rewind( fp );
            while( (c = fgetc( fp )) != EOF )
            {
                printf( "%c ", c );
            }
        }

  3. #3
    Membre éclairé Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    611
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 611
    Par défaut
    Eh bien merci beaucoup, je commençais a ne plus comprendre ce qui se passait (car ce code fonctionnais très bien sous linux).
    Comme quoi on en apprend tous les jours.

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

Discussions similaires

  1. Problème avec la zlib sous windows
    Par F-fisher dans le forum SDL
    Réponses: 3
    Dernier message: 24/06/2008, 17h42
  2. Réponses: 0
    Dernier message: 19/08/2007, 15h41
  3. pagination avec requetes croisées sous windows
    Par ZashOne dans le forum Administration
    Réponses: 2
    Dernier message: 23/07/2007, 12h05
  4. [Free Pascal] Utiliser du code C avec Free Pascal sous Windows
    Par richard dans le forum Free Pascal
    Réponses: 4
    Dernier message: 17/02/2007, 15h26
  5. Réponses: 4
    Dernier message: 03/07/2006, 18h13

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