Lire un fichier caractère par caractère.

Résolu/Fermé
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014 - Modifié par Naraka77 le 8/12/2012 à 21:00
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014 - 10 déc. 2012 à 18:01
Bonjour à tous,

Je viens vous voir une nouvelle fois pour une question, cette fois sur les fichiers textes et leur contenu.

Voilà, je dispose d'un fichier texte (ou de configuration) qui me donne mes deux états de jeu (le premier étant l'état initial et le seconde l'état final).
Mon fichier texte est comme ceci :
AEC
FBH
GDI

ABC
DEF
GHI

Je voudrais récupérer les 9 premièrs caractères dans un premier temps ! (je me débrouillerai pour les mettre dans un tableau par la suite pour en faire un tableau 3x3)

Voici mon code :
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int nb_ligne = 0, nb_colonne = 0; 
    int curseur; 
    char caractere; 
    string ligne; 

        ifstream fichier("Taquin_soluble.txt",  ios::binary);  // on ouvre en lecture 
        if(fichier) 
        { 
            fichier.get(caractere); 
            cout << caractere << endl; 
            while(getline(fichier, ligne)) 
            { 

                fichier.get(caractere); 
                cout << caractere << endl; 
            } 

                fichier.close(); 
        } 
        else 
                cerr << "Impossible d'ouvrir le fichier !" << endl; 

        return 0; 
}


Le problème de ce code, est qu'il ne m'affiche que la première lettre de chaque ligne... Et je ne sais vraiment pas comment faire...

Édit :
J'ai un peu changé mon code, j'obtiens quelque chose de mieux, mais ce n'est pas encore ça...
Je pars du principe qu'a chaque fois, nous allons incrémenté le curseur de 1 lorsque nous récupérons un caractère :
int main()
{
    int nb_ligne = 0, nb_colonne = 0;
    int curseur;
    char caractere;
    char *plateau_temp = NULL;
    int l = 3, col = 3, i = 0;
    string ligne;
    plateau_temp = new char[l*col];

        ifstream fichier("Taquin_soluble.txt",  ios::binary);
        if(fichier)
        {
            fichier.get(caractere);
            cout << caractere;
            do
            {
                fichier.get(caractere);
                //cout << caractere;
                plateau_temp[i] = caractere;
                curseur = fichier.tellg();
                i++;
            }while((int)fichier.tellg() != 13);

            for (i=0;i<l*col;i++)cout << plateau_temp[i];


                fichier.close();
        }
        else
                cerr << "Impossible d'ouvrir le fichier !" << endl;

        return 0;
}


Le problème de ce code, c'est que je ne gère que le cas ou il y a 3 caractères (colonnes) et 3 lignes....
Lorsque je fais un affichage dans mon
while(...)
j'obtiens bien tous les caractères que je veux, mais si je fais un affiche a la sortie de la boucle, il ne me reste que caractères sur les 9 normalement présent...


J'espère que vous allez pouvoir m'aider !

Merci d'avance

A voir également:

3 réponses

ReganDryke Messages postés 13 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 22 février 2013 6
Modifié par ReganDryke le 8/12/2012 à 22:06
Pourquoi est ce que tu n'utilise pas getline ?

Avec un code du genre :
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ifstream fichier ("Taquin_soluble.txt",  ios::in); // ios::in pour la lecture, tu n'as pas besoin de binary car tu lis un fichier texte et pas un fichier binaire 
    string ligne; 
    while (!fichier.eof()) //eof est le flag de fin de fichier il se met a 1 quand tu as atteint la fin du fichier. 
    { 
        getline(fichier,ligne); // tu recupere une ligne de ton fichier sous la forme d'un string
        // Un petit for pour parcourir ta ligne; 
        for(int i=0;i<ligne.length();i++) 
        { 
            //ligne[i] te renverra le caractère placer a la i ème position.
            cout<< "Caractere numero " <<i<<" : "<<ligne[i]<<endl; 
        } 
    } 
} 

2
ReganDryke Messages postés 13 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 22 février 2013 6
9 déc. 2012 à 12:17
Il suffit de trouver un moyen de sortir plus tot de ton while. Donc de le rendre faux quand ta ligne est vide. Le moyen le plus simple a comprendre consiste a utiliser un booleen et l'operateur ET.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream fichier ("Taquin_soluble.txt",  ios::in); // ios::in pour la lecture, tu n'as pas besoin de binary car tu lis un fichier texte et pas un fichier binaire
    string ligne;
    bool ligneVide=false; // Ce booleen vas te permettre de sortir plus tot de ta condition.
    while (!fichier.eof() && !ligneVide)
    //eof est le flag de fin de fichier il se met a 1 quand tu as atteint la fin du fichier.
    // Il suffit d'utiliser l'operateur ET ainsi que ton booleen pour que tu reste dans ta fonction seulement quand eof ET ligneVide sont faux.
    {
        getline(fichier,ligne);
        // tu recupere une ligne de ton fichier sous la forme d'un string
        // Tu teste si ta string est vide.
        if (ligne == "")
        {
            ligneVide=true;
        }
        // Un petit for pour parcourir ta ligne;
        for(int i=0;i<ligne.length();i++)
        {
            //ligne[i] te renverra le caractère placer a la i ème position.
            cout<< "Caractere numero " <<i<<" : "<<ligne[i]<<endl;
        }
    }
}
2
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014
9 déc. 2012 à 15:01
Merci infiniment Regan, merci beaucoup du temps que tu m'as accordé et de ton aide !

Ca marche impeccablement :)
0
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014
10 déc. 2012 à 16:23
Je me retourne un dernière fois vers vous (je l'espère...) pour vous demander si il est possible de passer un fichier en argument ?

Car je voudrais, maintenant que mon jeu est créé et marche correctement, pouvoir détecter l'état final (soit la deuxième partie de mon fichier) et elle aussi la placer dans un tableau !

Ou alors, j'aimerais savoir si il est possible de prendre la lecture d'un fichier en cours de route ? (c'est a dire, que avant je me suis arrêter a l'espace, je voudrais dans une autre fonction, recommencer a cet espace en question...)

Voila par exemple ma première fonction qui permet de créer mon état 1 (le début du jeu) :
char **creer_plateau(int nb_ligne, int nb_colonne){
    int i = 0, j = 0, curseur = 0, k = 0;
    string ligne;
    bool ligneVide=false; // Ce booleen vas permettre de sortir plus tot de ta condition.
    char **plateau = new char*[nb_ligne];
    char plateau_temp[nb_ligne*nb_colonne];

    for (i = 0; i < nb_ligne; i++) plateau[i] = new char[nb_colonne];

    ifstream fichier ("Taquin_soluble.txt",  ios::in);

    while (!fichier.eof() && !ligneVide)
    //eof est le flag de fin de fichier il se met a 1 quand on atteint la fin du fichier.
    // Il suffit d'utiliser l'operateur ET ainsi que le booleen pour que rester dans ta fonction seulement quand eof ET ligneVide sont faux.
    {
        getline(fichier,ligne);
        // on recupere une ligne de ton fichier sous la forme d'un string
        // on teste si la string est vide.
        if (ligne == "")
        {
            ligneVide=true;
        }
        for(int i=0;i<ligne.length();i++)
        {
            //ligne[i] te renverra le caractère placer a la i ème position.
            plateau_temp[k] = ligne[i];
            k++;
        }
    }
    k = 0;
    for(i = 0; i < nb_ligne; i++){
        for(j = 0; j < nb_colonne; j++){
                plateau[i][j] = plateau_temp[k];
                k++;
            }
        }

    return (plateau);
}


J'aimerais donc faire la même fonction, mais pour l'état deux ^^.
J'avais pensé a prendre la valeur où se trouvait mon curseur, et l'envoyer comme paramètre a l'autre fonction, afin qu'elle puisse reprendre a cet endroit, mais cela ne marche pas...

J'espère que vous allez pouvoir, une nouvelle fois, m'aider !

Merci d'avance.
0
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014
10 déc. 2012 à 18:01
En essayant certain truc, voici mon meilleur résultat (mais ce n'est pas encore ça ^^')

while (!fichier.eof())
    {

        getline(fichier,ligne);
        // On recupere une ligne de ton fichier sous la forme d'un string
        // On teste si la string est vide.
        if (ligne == "")
        {
            ligneVide=true;
        }
        if(ligneVide == true)
        {
            getline(fichier,ligne2);
        }
        for(int i=0;i<ligne2.length();i++)
        {
            //ligne2[i] renverra le caractère placer a la i ème position.
            plateau_temp[k] = ligne2[i];
            k++;
        }
    }
    k = 0;
    for(i = 0; i < nb_ligne; i++){
        for(j = 0; j < nb_colonne; j++){
                plateau_model[i][j] = plateau_temp[k];
                k++;
            }
        }




J'obtiens un tableau du type :
ABC
GH.
GH.

Au lieu de :
ABC
DEF
GH.

Je ne vois pas comment régler ceci.. !
0
Naraka77 Messages postés 10 Date d'inscription jeudi 15 novembre 2012 Statut Membre Dernière intervention 9 janvier 2014
Modifié par Naraka77 le 9/12/2012 à 10:38
Je n'y avais pas pensé !

Merci en tout cas, ça marche super bien !

Je n'ai maintenant, plus qu'a mettre chaque valeur que je récupère dans un tableau afin d'en faire mon plateau de jeu ! Mais surtout, il faut que j'arrive a arrêter la boucle
while(..)
a mon "retour à la ligne" entre mes deux états (bien-sur, je n'y arrive pas...).
0