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 :

Soucis de Fichier de sauvegarde


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut Soucis de Fichier de sauvegarde
    Bonjour a tous !

    Tout d'abord merci d'avoir ouvert ce post dans le but de me porter un peu d'aide ^^

    Je suis en train de programmer un logiciel de gestion de Base de donné sur des élèves.

    En début de mon main je récupère les information sur les élèves dans un fichier "Sauvegarde.txt"

    Tout se passe nickel, tout s'inscrit, s'enregistre ... mais voila le soucis ...

    Imaginons j'ai 4 ou 5 lignes d'élèves, elle sont lues, elles sont enregistrée, mais ensuite il croit qu'il y'a encore quelque lignes (3 ou 4 en general) remplie de "IIIIIIIIIIIIIIIIIIIIIII"

    Cela fait que ma base de donnée est corrompue avec des eleves s'appellant "IIIIIII IIIIII née le II/II/IIII ayant pour numero etudiant IIIIIIIIIII, et comme note II II II ...."

    Vous comprenez bien que tous ce qui s'inscrit dois bien etre enregistré apres :/ donc lors de la sauvegarde je me retrouve avec des lignes de I :/

    Voici mon code de lecture de 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    	//CHARGEMENT DE LA BASSE DE DONNEE
     
    		int n, ret=1;
    		/*déclaration du pointeur vers le fichier*/
    		FILE*entree = NULL;
    		/*ouverture du fichier en lecture -> "r"*/
    		entree = fopen("Sauvegarde.txt", "r");
    		/*boucle jusqu’a la fin de fichier "EOF" -> Enf Of File*/
    		if(entree!=NULL)
    		{
    			do
    			{
    				/*lecture ligne a ligne*/
    				ret = fscanf(entree, "%s %s %d %d %d %s %f %f %f\n", &Repertoire[Nb_eleve].nom, &Repertoire[Nb_eleve].prenom, &Repertoire[Nb_eleve].jour, &Repertoire[Nb_eleve].mois, &Repertoire[Nb_eleve].annee, &Repertoire[Nb_eleve].numeroetudiant, &Repertoire[Nb_eleve].note1, &Repertoire[Nb_eleve].note2, &Repertoire[Nb_eleve].note3);
    				Nb_eleve++;
    			}while(ret!=EOF);
    			printf("Le fichier a \x82t\x82 correctement charg\x82");
    		}
    		else
    		{
    			printf("Impossible d'ouvrir le fichier");
    		}
    		/*fermeture du fichier*/
    		fclose(entree);
     
    	//Fin de chargement
    J'espère que vos esprit magnifique trouverons une solution a mon problème qui m'énerve vraiment ...

    Bonne soirée a vous !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir, une question bete: est-ce que la variable nb.élèves vaut la bonne valeur à la fin de l'acquisition? Et comment alloues-tu les chaînes de caractère que tu envoies?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    Pour nb_eleve

    Justement non, car il croit qu'il a des lignes en trop donc il ajoute 3 ou 4 élèves en plus

    Pour mes chaines, elles sont dans une structure ou de base je leur alloue 50 emplacement

  4. #4
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    J'ai a peu pres rien compris a ton probleme, donne plus de detail sur ce qu'il se passe et ce qu'il devrait se passer (a part le fait que tu ne teste pas que Nb_eleve ne depasse pas la capacite du tableau, ton code est exact).
    Le probleme ne vient clairement pas de la lecture des donnees mais de l'ecriture visiblement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    En gros :

    Il ouvre le fichier

    il lit les lignes

    Vladimir poutine 17/19/1990 54684864E 17 15 12

    etc.... Disons 5 eleves

    et ensuite en lisant le fichier, il ajoute des lignes de IIIIIIIIIIIIIIIIIII

    En gros il voit dans le fichier ca :

    eleve1
    eleve2
    eleve3
    eleve4
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

    alors que moi en ouvrant le fichier j'ai ca :

    eleve1
    eleve2
    eleve3
    eleve4

    Donc voila j'espere que c'est mieux expliquer, et franchement je sais pas comment expliquer mieux que ca....

    de plus, le nb_eleve est un int, et il ne depasse pas la memoire car apres le programme se lance SANS SOUCIS... je peux l'utiliser normallement, juste que ma base de donné a des structure remplis de IIIIIIIIIIIIIII

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et en bloquant l'acquisition au nombre d'élèves?(si tu le connais à l'avance). As-tu toujours 3 notes? Est-ce que tu memsets les tableaux? Peut-etre est-ce l'écriture de la sauvegarde qui a un problème et écrit trop loin?

  7. #7
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Citation Envoyé par Blakphoenix Voir le message
    En gros :
    et ensuite en lisant le fichier, il ajoute des lignes de IIIIIIIIIIIIIIIIIII

    En gros il voit dans le fichier ca :

    eleve1
    eleve2
    eleve3
    eleve4
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    Non, tu pars du principe que c'est la lecture qui ne fonctionne pas or tu n'en as pas la preuve.

    Citation Envoyé par Blakphoenix Voir le message
    je peux l'utiliser normallement, juste que ma base de donné a des structure remplis de IIIIIIIIIIIIIII
    C'est cette hypothese la qui est la plus plausible. Montre le code qui ecrit.

    de plus, le nb_eleve est un int, et il ne depasse pas la memoire car apres le programme se lance SANS SOUCIS...
    Ce n'est pas parce que le programme tourne qu'il n'y a pas de probleme quand tu accedes a la memoire. man valgrind.

    Essaye aussi de changer le do{}while; par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while ((ret = fscanf(entree, "%s %s %d %d %d %s %f %f %f\n", &Repertoire[Nb_eleve].nom, &Repertoire[Nb_eleve].prenom, &Repertoire[Nb_eleve].jour, &Repertoire[Nb_eleve].mois, &Repertoire[Nb_eleve].annee, &Repertoire[Nb_eleve].numeroetudiant, &Repertoire[Nb_eleve].note1, &Repertoire[Nb_eleve].note2, &Repertoire[Nb_eleve].note3)) != EOF)
      {
        memset(&Repertoire[Nb_eleve], 0, sizeof(Repertoire[Nb_eleve]));
        Nb_eleve++;
      }
    Avec le do{}while; tu forcais l'incrementation de Nb_eleve meme si ret retournait EOF (fichier vide). De plus, l'initialisation a 0 de toute la structure est plus safe.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Pour commencer, il y a une erreur dans le fscanf, à priori ce n'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &Repertoire[Nb_eleve].nom, &Repertoire[Nb_eleve].prenom
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Repertoire[Nb_eleve].nom, Repertoire[Nb_eleve].prenom
    En outre plutôt que d'arrêter la lecture lorsque fscanf() retourne EOF, tu devrait l'arrêter lorsque le retour de fscanf() et différent du nombre de donnée à lire (9 ici), ce qui permettrait de gérer les erreurs de formatage de la chaîne.

    De plus attention à l'utilisation de fscanf avec le formatteur %s, tu t'exposes à des risque de débordement si la donnée lue est plus importante que la taille du tableau de destination.

    Sinon, peux-tu fournir la définition du type correspondant à Repertoire et le code de sauvegarde qui écris le fichier erroné (voire mieux un code minimal mais compilable qui reproduit le problème) ainsi qu'un fichier de test ?

Discussions similaires

  1. Soucis avec rsync sur sauvegarde de fichier par extensions
    Par ThierryForum dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/02/2013, 16h32
  2. Créer un fichier de sauvegarde d'une BDD access
    Par theking dans le forum Access
    Réponses: 4
    Dernier message: 05/07/2006, 14h04
  3. fichier de sauvegarde au format XML
    Par freecell31 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 22/05/2006, 00h26
  4. Fichier de sauvegarde c++
    Par Zapan dans le forum C++
    Réponses: 3
    Dernier message: 09/05/2006, 23h35
  5. Tache cron + fichier de sauvegarde
    Par 12_darte_12 dans le forum Administration système
    Réponses: 20
    Dernier message: 09/11/2005, 16h32

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