Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] Lecture dans un fichier

<fstream>

Sujet résolu
Anonyme
    24 décembre 2006 à 17:10:43

    Bonjour à tous et Bon Noël!! ;)

    J'ai une petite question...(sinon je ne serai pas là :p )

    Je cherche à lire dans un fichier caractère par caractère. J'ai déjà été faire un tour sur le net, et je n'ai pas tout à fait trouvé mon bonheur. Je suis tombé sur cette page où est censé être l'information que je cherche, mais je n'ai pas du tout comprendre...

    Je n'ai finalement donc pas trouvé la fonction que je dois utiliser...

    Le caractère que je dois lire est un int.

    j'ai déjà un bout de code de la fonction que je vais utiliser. je vous la donne pour que vous compreniez mieux mon problème (ou vous rendre encore plus confus :-° ) Cette fonction marche jusque à là.


    /*
        FONCTIONNEMENT :

        1.on prend la première case
        2.enregistrement dans un fichier:
            2.1 liste des chiffres encore dispo pour la case en question *;
            2.2 nombre de chiffres réstants pour la ligne : x
                                                        (gardé en mémoire : nb_chi.)
        3.on prend un chiffre au hasard (n) (compris entre 1 et x).
        4.on fait une boucle pour prendre le nième chiffre du fichier (on obtient a)
        5.on place a dans la case donnée (soit la première, dans ce cas.).
        6.on passe à la case suivante.
        7.on réécrit le fichier en modifiant la liste de chiffre réstants et x *|**
        8.on refait les étapes 3 à 7 pour chaque case.


        * : les chiffres dispo doivent tenir compte de la ligne, la colone
        et du carré.
        ** : pour réécrire dans le fichier, on suprime tout d'abords :
                              on ferme le fichier et on le rouvre avec l'option "w+"
    */


    void nouv_grille(Grille* grille)
    {
        srand(time(NULL));

        /*  On ouvre le fichier chi_disp (chiffre disponible)

            Si le fichier ne peux pas être ouvert, c'est surment qu'il n'existe pas.
            On le crée donc. (tout est géré avec l'option "w+" de fopen :
                                   Le fichier est crée s'il le faut, et il est vidé.
        */


        fstream chi_disp;
        int nb_chi; // nombre chiffre
        int alea;
        int MIN = 1;

        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                chi_disp.open("chi_disp.sdk", fstream::in
                                                   | fstream::out | fstream::trunc);
                if (!chi_disp.is_open())
                {
                    cout << "le fichier chi_disp.sdk n'a pas pu être ouvert." <<
                               endl << "Le programme a quitté inopérement." << endl;
                    exit(EXIT_FAILURE);
                }
                /* Série de condition pour savoir si un chiffre est
                                                 encore dispo pour la case donnée */

                nb_chi = 0;
                for (int k = 1; k < 10; k++)
                {
                    if (grille->ligne[i].find(k) == string::npos
                                && grille->col[j].find(k) == string::npos
                                 && grille->carre[i/3][j/3].find(k) == string::npos)
                    {
                        chi_disp << k;
                        nb_chi++;
                    }
    //                cout << "i : " << i << " | j : " << j << " | k : " << k;
    //                cout << endl << "---" << endl;
    //                cout << "\t grille->ligne[i].find(k) : "
    //    << grille->ligne[i].find(k) << " | grille->col[j].find(k) : "
    //        << grille->col[j].find(k) << " | grille->carre[i/3][j/3].find(k) : "
    //                                   << grille->carre[i/3][j/3].find(k) << endl;
                }
                alea = (rand() % (nb_chi - MIN + 1)) + MIN;
    //            cout << "alea : " << alea << endl;
                int chi; //chiffre
                while (nb_chi > 0) // le dernier caractère lu est le bon   ; )
                {
                    // Lecture d'un caractère.
    //                chi_disp >> chi; /* ICI */ // ne marche pas, donne toujours 10
                    nb_chi--;
                }
    //            cout << chi << endl;
                chi_disp.close();
            }
        }

    //    cout << endl << "**********----------**********" << endl;
    //    for (int i = 0; i < 9; i++)
    //    {
    //        cout << "\t";
    //        for (int j = 0; j < 9; j ++)
    //        {
    //            cout << grille->cases[i][j] << " ";
    //        }
    //        cout << endl;
    //    }
    //    cout << "**********----------**********" << endl;

    }



    le commentaire dont les "//" sont tout à gauche sont seulement des ligne de tests.

    La structure Grille est une que j'ai crée moi même. Je vous la donne aussi :

    struct Grille
    {
        int cases[9][9];
        string ligne[9];
        string col[9];
        string carre[3][3];
    };
    /*
        Cette structure contient les informations sur la grille
        cases contient, pour chaque case, son contenu;
        ligne contient tous les chiffres de la ligne donnée
        col contient tous les chiffres de la colone donnée
        carre contient tous les chiffres du carré de 3 sur 3 donné.
    */




    Bon courage à ceux qui m'aideront! ;)

    Merci d'avance

    A bientôt

    Hiura
    • Partager sur Facebook
    • Partager sur Twitter
      24 décembre 2006 à 17:23:31

      ton fichier doit etre un ifstream
      et
      flux >> caractère;
      (pas <<)

      pour lire, où est le problème ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        24 décembre 2006 à 17:33:30

        Re bonjour!

        -->Kayl : merci d'avoir répondu mais :

        Quoi Qui Où Quand Comment Pourquoi??


        Pourrais-tu m'expliquer pourquoi je dois mettre ifstream, ce que c'est en gros? (Je l'ai vu passé pas mal de fois aujourd'hui mais pas vu d'expliquations dessus...)

        Ensuite pour les flux, ce que j'ai marqué c'est juste :


                        if (grille->ligne[i].find(k) == string::npos
                                    && grille->col[j].find(k) == string::npos
                                     && grille->carre[i/3][j/3].find(k) == string::npos)
                        {
                            chi_disp << k;
                            nb_chi++;
                        }



        Ici j'écris dans le fichier, je ne lis pas.


        Mais merci quand même! ;)

        A bientôt
        Hiura

        EDIT : Une légère erreur c'est placé dans mon code tout à l'heure, mais n'a aucun influance.

        je vais corriger l'erreur juste après ce post mais voici le bout de code corrigé avec une ameilioration qui me pose un problème!


                    int chi; //chiffre
                    while (nb_chi > 0) // le dernier caractère lu est le bon   ; )
                    {
                        // Lecture d'un caractère.
        //                chi_disp >> chi; /* ICI */ // ne marche pas, donne toujours 10
                        nb_chi--;
                    }
        //            cout << chi << endl;



        Si j'active la ligne commentaire (la dernière ligne) il me donne que des "10". Et je ne comprends pas pourquoi.

        Dans le fichier chi_disp.sdk, quand la ligne :

        //                chi_disp >> chi; /* ICI */ // ne marche pas, donne toujours 10
        est en commentaire, le fichier contient "123456789", ce qui est normal. Mais dès que "j'active" cette ligne, le fichier chi_disp.sdk ne contient plus rien du tout, se qui n'est pas normal...

        EDIT BIS : J'ai mis à jour le premier post...
        • Partager sur Facebook
        • Partager sur Twitter
          24 décembre 2006 à 18:29:09

          et avec un objet ofstream?(en génèral on(enfin moi en tous cas) utilise ifstream pour lire et ofstream pour écrire.)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 décembre 2006 à 18:37:13

            Re Re bonsoir!

            Donc si j'ai bien compris, if/ofstream sont utilisé pour : l'un, la lecure; l'autre, pour la lecture.

            Mais puis-je avoir une petite explication sur leu utilisation ? (ne serait-ce qu'un site...)

            Merci d'avance

            A bientôt

            Hiura
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 décembre 2006 à 23:42:39

              Bonsoir!

              Merci pour ces liens! Ils m'ont été très utils!!

              Par contre, là, mon algorithme ne fonctionne pas, les possibilitl de création de la grille sont apprement null... Bon je verrais ça en rentrant de vacances! Mais comme ça ne concerne plus trop le sujet de ce topic, je le mets comme résolu...

              Bonne Année à tous d'avance! :p

              A bientôt

              Hiura
              • Partager sur Facebook
              • Partager sur Twitter

              [C++] Lecture dans un fichier

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown