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 :

Modification de fichier, bug


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 20
    Points
    20
    Par défaut Modification de fichier, bug
    Bonjour à tous

    J'ai un petit bug que j'ai réussi à résoudre de maniéré étrange. J'aimerais donc votre avis sur la situation.

    J'ai fichier que j'ouvre en mode rb+:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repF=fopen("reponse.dat","rb+");
    Et je stocke dans ce fichier des instances de ma structure Reponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Reponse reponse;
    reponse.phrase="blabla";
    reponse.occurences=777;
    fseek(repF,0,SEEK_END);	
    fwrite(&reponse,sizeof(Reponse),1,repF);
    Et un moment dans mon code je modifie toutes les réponses qui sont dans le fichier:
    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
    Reponse reponse;
     
    fseek(file,0,SEEK_END);
    int taille=ftell(repF);
     
    fseek(repF,0,SEEK_SET);
    while(ftell(repF)<taille) 
    {
    	fread(&reponse,sizeof(Reponse),1,repF);
    	reponse.occurences=0;
     
    	fseek(repF,-sizeof(Reponse),SEEK_CUR);
    	fwrite(&reponse,sizeof(Reponse),1,repF);
     
    	int sauv=ftell(repF); // Voici les 2 lignes qui empêchent le bug
    	fseek(repF,sauv,SEEK_SET); //
    }
    Et si je ne mets pas c'est deux lignes:
    int sauv=ftell(repF); // Voici les 2 lignes qui empêchent le bug
    fseek(repF,sauv,SEEK_SET); //
    ben les deux premières réponses du fichier sont correctement modifiés mais toutes les suivantes sont remplacé par la 2eme réponse.

    Vous avez un soupçon d'idée ?
    Merci d'avance et bonnes fêtes

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    J'ai trouvé : http://www.cplusplus.com/reference/c.../cstdio/fseek/
    On streams open for update (read+write), a call to fseek allows to switch between reading and writing.
    Donc je vais faire un simple fseek(repF,0,SEEK_CUR); ^^

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    When using fseek on text files with offset values other than zero or values retrieved with ftell, bear in mind that on some platforms some format transformations occur with text files which can lead to unexpected repositioning.
    Ou cette ligne là plutôt ? Ce que je trouve quand même un peu étonnant mais bon...

    Tu te sers comment de ta nouvelle ligne ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    "on text files" ça me concerne pas alors parce que je suis mode binaire.

    Ben à la fin de ma boucle je fais un fseek(repF,0,SEEK_CUR);
    Ça marche très bien, étrange mais au moins c'est clair dans la doc.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ah oui tu as ouvert en mode b pardon !

    C'est assez étonnant ton truc quand même... Si j'ai le temps la semaine prochaine, j'essayerai le code histoire de comprendre...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 20
    Points
    20
    Par défaut
    Tiens si tu veux j'avais fait un code minimaliste de la situation ^^
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct Reponse
    {
    	int id;
    	char phrase[255];
    	int humeur;
    	int apparition;
    	int occurences;
    }Reponse;
     
    int tailleFichier(FILE *file);
    void afficherRep(FILE *repF);
     
    int main(int argc, char *argv[])
    {
    	FILE *repF;
    	//repF=fopen("reponse","rb+");
    	//if (repF==NULL)
    		repF=fopen("reponse","wb+");
     
     
    	int sauv;
    	Reponse reponse;
     
    	//Enregistrement de 4 reponses
    	sscanf("phrase1","%s",(reponse.phrase));
    	reponse.humeur=11;
    	reponse.id=1;
    	fseek(repF,0,SEEK_END);	
    	fwrite(&reponse,sizeof(Reponse),1,repF);
     
    	sscanf("phrase2","%s",(reponse.phrase));
    	reponse.humeur=22;
    	reponse.id=2;
    	fseek(repF,0,SEEK_END);	
    	fwrite(&reponse,sizeof(Reponse),1,repF);
     
    	sscanf("phrase3","%s",(reponse.phrase));
    	reponse.humeur=33;
    	reponse.id=3;
    	fseek(repF,0,SEEK_END);	
    	fwrite(&reponse,sizeof(Reponse),1,repF);
     
    	sscanf("phrase4","%s",(reponse.phrase));
    	reponse.humeur=44;
    	reponse.id=4;
    	fseek(repF,0,SEEK_END);	
    	fwrite(&reponse,sizeof(Reponse),1,repF);
     
    	afficherRep(repF);
     
    	int taille=tailleFichier(repF);
    	fseek(repF,0,SEEK_SET);
    	while(!feof(repF))
    	{
    		printf("0 %d - %d \n",sizeof(Reponse),ftell(repF));
    		fread(&reponse,sizeof(Reponse),1,repF);
    		reponse.humeur=100+reponse.id; //modification
    		printf("1 %d - %d \n",reponse.id,ftell(repF));
    		// Enregistrement
    		fseek(repF,-sizeof(Reponse),SEEK_CUR);
    		fwrite(&reponse,sizeof(Reponse),1,repF);
    		printf("2 %d - %d \n",reponse.humeur,ftell(repF));
     
    		printf("Bouclage\n");
    		fseek(repF,0,SEEK_CUR);
    	}
     
    	afficherRep(repF);
     
    	return 0;
    }
     
     
    int tailleFichier(FILE *file)
    {
    	fseek(file,0,SEEK_END);
    	int taille=ftell(file);
    	return taille;
    }
     
    void afficherRep(FILE *repF)
    {
    	Reponse rep;
    	int taille=tailleFichier(repF);
    	fseek(repF,0,SEEK_SET);
    	while(ftell(repF)!=taille) 
    	{
    		fread(&rep,sizeof(Reponse),1,repF);
    		printf("%d - %s - %d \n",rep.id,rep.phrase,rep.humeur);		
    	}
    }

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    J'ai du mal à comprendre pourquoi multiplier les fseek, l'écriture avec fwrite ne décalle-t-elle pas automatiquement le seek ?
    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.

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

Discussions similaires

  1. Bug modification des fichiers gpx
    Par trukker dans le forum IGN API Géoportail
    Réponses: 24
    Dernier message: 20/10/2011, 10h28
  2. [JAR]Modification de fichier dans un jar
    Par vberetti dans le forum Général Java
    Réponses: 14
    Dernier message: 13/06/2005, 17h56
  3. [langage] [Fichier]problème modification de fichier
    Par Melchisedec dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2004, 23h01
  4. [ICS FtpClient] Date modif de fichier et listage de dossier
    Par Ingham dans le forum Composants VCL
    Réponses: 8
    Dernier message: 13/06/2004, 19h54
  5. modification de fichier EOF
    Par scorbo dans le forum C
    Réponses: 9
    Dernier message: 28/11/2003, 11h35

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