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 :

Fonction de lecture/écriture des fichiers de sauvegarde


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut Fonction de lecture/écriture des fichiers de sauvegarde
    Salut!

    Pour un logiciel que je suis en train de concevoir, j'aimerais disposer d'une fonction qui lirait ou écrirait dans mes fichiers de sauvegarde enregistrés au format .txt

    Je crois que cette fonction ne marche pas bien. Le programme qui l'utilise a tendance à se crasher au moment de l'utiliser environ 130 fois.
    Je maîtrise encore assez mal la lecture/écriture de fichiers texte... =)

    Voici le code source actuel, et j'aimerais lire vos suggestions si vous en avez.

    (EDIT: Nouvelle version un peu plus bas)
    Sauvegarde.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef SAUVEGARDE_H_INCLUDED
    #define SAUVEGARDE_H_INCLUDED
     
    #include <string.h>
     
    using namespace std;
     
    string Sauvegarde(int a, int b, string c);
     
    #endif // SAUVEGARDE_H_INCLUDED
    Sauvegarde.cpp:
    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
    #include <iostream>
    #include <fstream>
    #include <string.h>
     
    #include "Sauvegarde.h"
     
    using namespace std;
     
    string Sauvegarde(int a, int b, string c)
    {   // a est le numéro du fichier utilisé
        // b est la ligne de sauvegarde utilisée
        // c est le contenu à écrire ou à retourner
     
        // Déclaration des variables
        int x; // Compteur de lignes pour la lecture des fichiers
        x=0; // Initialisation
     
        char* y; // Nom du fichier à lire ou à écrire
     
        switch(a) // Ceci permet d'orienter la fonction vers un des fichiers qui contient des données intéressantes, en-fonction des arguments donnés.
        {   case 1:     y="Donnees/Fichier_1.txt";  break; // Fichier 1
            case 2:     y="Donnees/Fichier_2.txt";  break; // Fichier 2
            case 3:     y="Donnees/Fichier_3.txt";  break; // Fichier 3
            case 4:     y="Donnees/Fichier_4.txt";  break; // Fichier 4
     
            case 101:   y="Donnees/Pacman_1.txt";   break; // Pacman 1
            case 102:   y="Donnees/Pacman_2.txt";   break; // Pacman 2
            case 103:   y="Donnees/Pacman_3.txt";   break; // Pacman 3
            case 104:   y="Donnees/Pacman_4.txt";   break; // Pacman 4
            case 105:   y="Donnees/Pacman_5.txt";   break; // Pacman 5
            case 106:   y="Donnees/Pacman_6.txt";   break; // Pacman 6
            case 107:   y="Donnees/Pacman_7.txt";   break; // Pacman 7
            case 108:   y="Donnees/Pacman_8.txt";   break; // Pacman 8
            case 109:   y="Donnees/Pacman_9.txt";   break; // Pacman 9
            case 110:   y="Donnees/Pacman_10.txt";  break; // Pacman 10
            case 111:   y="Donnees/Pacman_11.txt";  break; // Pacman 11
            case 112:   y="Donnees/Pacman_12.txt";  break; // Pacman 12
            case 113:   y="Donnees/Pacman_13.txt";  break; // Pacman 13
            case 114:   y="Donnees/Pacman_14.txt";  break; // Pacman 14
            case 115:   y="Donnees/Pacman_15.txt";  break; // Pacman 15
            case 116:   y="Donnees/Pacman_16.txt";  break; // Pacman 16
     
            case 201:   y="Donnees/Chargement_1.txt";   break; // Chargement 1
        }
     
        if (c == "") // Lecture seule dans la mémoire
        {   ifstream fichier(y);  // Ouvrir le fichier en lecture
     
            while (x <= b)
            {   getline(fichier, c);
                x++;
            }
     
            fichier.close();
        }
     
        else // Ecriture dans la mémoire
        {   ofstream fichier(y);  // Ouvrir le fichier en écriture
     
            fichier.close();
        }
     
        return c;
    }
    Si c'est nécessaire, vous pouvez poser toutes les questions! =D

  2. #2
    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
    Je vois un très grand nombre de façons de faire crasher ce simple code, à savoir toutes les valeurs possibles de a qui ne sont pas dans le switch.

    Pour le reste.. tu utilises toujours pas de debugger ? Me semble que c'est pas la première fois qu'on te le conseille. Il est bien plus productif, pour tout le monde, et intéressant de se rendre compte de ses erreurs avec cet outil, et les corriger dans 90% des cas, surtout qu'elles sont le plus souvent simples quand on débute.

    Enfin, pourquoi faire simple quand on peut faire compliqué me parait un bon moto pour ce code.
    L'écriture dans un fichier : http://www.cplusplus.com/reference/o...perator%3C%3C/ d'ailleurs tu n'écris rien, tu ne fais qu'écraser le contenu du fichier là.
    Le choix du fichier n'a rien à faire dans la fonction de sauvegarde amha.
    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.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut
    Salut!

    Concernant le debugger, je sais le faire fonctionner, mais une fois que j'ai un "résultat", il faut encore un dictionnaire pour comprendre ce que ça veut dire.
    Pour l'instant, j'utilise les flux de sortie (cout << "etape 1" << endl;...) pour trouver la ligne qui pose problème, et après je cherche ce qui peut ne pas aller.

    J'ai oublié de le dire, mais effectivement, l'écriture n'est pas encore implémentée.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut
    Information supplémentaire: c'est bien ce sous-programme qui fait crasher ma machine.

    Ceci utilise "Sauvegarde", et ça se plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                if (chargementTexture[etapeChargement].NUMERO != numero) // Passer le chargement si ça ne ferait aucun changement
                {   chargementTexture[etapeChargement].TEXTURE.loadFromFile(Sauvegarde(200+numero, etapeChargement, "")); // Charger la texture
     
                    chargementTexture[etapeChargement].NUMERO=numero; // Actualiser le numéro de chargement
     
                    cout << etapeChargement << endl;
                }
    Ceci n'utilise pas "Sauvegarde", et ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                if (chargementTexture[etapeChargement].NUMERO != numero) // Passer le chargement si ça ne ferait aucun changement
                {   chargementTexture[etapeChargement].TEXTURE.loadFromFile("Donnees/Chargement_1.txt"); // Charger la texture
     
                    chargementTexture[etapeChargement].NUMERO=numero; // Actualiser le numéro de chargement
     
                    cout << etapeChargement << endl;
                }
    Je vais réécrire Sauvegarde en supprimant un argument: dorénavant, le programme devra l'appeler en donnant directement le nom (chemin compris) du fichier texte à utiliser. Je vous réécrirai après avoir testé ça...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut Nouvelle version de Sauvegarde()
    OK, alors j'ai modifié le code et il est sûrement un peu moins instable comme ça. je vous montre:

    LectureSauvegarde.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef LECTURESAUVEGARDE_H_INCLUDED
    #define LECTURESAUVEGARDE_H_INCLUDED
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    string LectureSauvegarde(string fichier, int ligne);
     
    #endif // LECTURESAUVEGARDE_H_INCLUDED
    LectureSauvegarde.cpp:
    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
    #include "LectureSauvegarde.h"
     
    using namespace std;
     
    string LectureSauvegarde(string fichier, int ligne)
    {   ifstream fluxEcriture(fichier, ios::in); // Ouvrir le fichier en lecture
     
        string contenu("");
     
        if(fluxEcriture)
        {
            for (int index(0); index <= ligne; index++) // Lire les lignes une-par-une
            {   getline(fluxEcriture, contenu);
            }
     
            fluxEcriture.close();
        }
        else
        {   cerr << "Impossible d'ouvrir le fichier !" << endl;
        }
     
        return contenu;
    }
    Le problème, maintenant, c'est que lorsque je l'exécute, il s'interrompt sur un message d'erreur).

    D'abord, une image est chargée correctement (en tout cas, il n'y a aucun message d'erreur.
    Ensuite, au moment de charger la deuxième image, tout part en couilles. Voici les messages d'erreur:
    Au moment d'appeler "Texture.LoadFromFile()", le message est "Failed to load image "nom (correct) de l'image". Reason : Out of memory"
    Alors le programme passe outre (apparemment), et essaie de charger la suivante. Le message est alors: "terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
    (double saut de ligne)
    This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information."

    Voilà. Vous connaissez ça?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Points : 33
    Points
    33
    Par défaut
    Salut!
    J'ai trouvé ce qui n'allait pas... en tout cas, j'ai trouvé un moyen de ne plus rencontrer les mêmes erreurs.

    En fait, je chargeais 127 images dans l'ordre décroissant, en décrémentant l'index (et en sortant de la boucle quand il valait zéro), et ça se plantait.
    Maintenant, je charge les 127 images dans l'ordre croissant, en incrémentant l'index (et en sortant de la boucle quand il valait "tailleChargement"), et maintenant ça se plante plus.
    Je ne comprends pas pourquoi ça ne marchait pas, mais bon... =D

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2015, 18h11
  2. Lecture/écriture des fichiers typés avec Delphi pour .NET
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/02/2013, 12h20
  3. Lecture/écriture des informations/tags "Avancé" d'un fichier.
    Par B@rberousse dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 03/07/2007, 14h51
  4. écriture/lecture dans des fichiers
    Par rafale001 dans le forum C
    Réponses: 14
    Dernier message: 02/03/2007, 16h59

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