[C++] Lecture/Ecriture.

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Status
Not open for further replies.

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Salut tout le monde ;)

Aujourd'hui je suis confronté à un problème amusant.
J'ai un projet à faire sur le labyrinthe de Thesée.
Concernant le cours et les TD, je les ai tous compris.
Donc j'explique le projet.
Nous avons dans un fichier texte d'une part le nombre de ligne puis le nombre de colonnes et a la suite le labyrinthe avec :
# = mur
+ = chemin possible.
On nous facilite la tache car tout est sur une ligne.
Par exemple :
7 21######+++####++++##+#+####+
J'en conclus donc qu'il faut utiliser la fonction Getline (why not ?) :).

Donc j'ai tout d'abord commencer un petit test c'est de lire le fichier. Cela marche, ça m'afficher uniquement les deux premiers chiffres.
En revanche mon problème se pose au début même du projet.

Comment récupérer le premier chiffre dans un premier temps pour avoir le nombre de lignes puis dans un autre temps le nombre de colonnes ?
Puis ajouter dans chaque case d'un tableau a double entrer (que je compte allouer en mémoire dynamique), le caractère qui est la suite de 21.

Je tiens aussi à ajouter que je n'ai jamais vue ça en TD o.O

Merci d'avance.
 

Cyrion

._.
V
Ancien staff
Jul 8, 2010
2,524
2
944
www.bufferoverflow.fr
Bah tu utilise la fonction ifstream::get pour récupérer un caractère , et ifstream::read pour lire un nombre n de caractère.

Avec ça, tu devrais être capable de lire ton premier chiffre ainsi que ce que tu veux par la suite..
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Bah tu utilise la fonction ifstream::get pour récupérer un caractère , et ifstream::read pour lire un nombre n de caractère.

Avec ça, tu devrais être capable de lire ton premier chiffre ainsi que ce que tu veux par la suite..

Donc si je comprend bien, une fois qu'un caractère lu si je remet la fonction ifstream::read il passera automatiquement au suivant ?
Mais si au lieu de 7 j'avais 100.
Le problème c'est que je vais récuperer que le 1 alors que je voulais le 100.
N'y a-t-il pas un moyen pour lire une chaîne de caractère mais en placant un séparateur.
Par exemple je pourrais lire jusqu'à un espace ou bien un #. Avec une boucle while.
 

Cyrion

._.
V
Ancien staff
Jul 8, 2010
2,524
2
944
www.bufferoverflow.fr
Bah tu pourrais séparer tes infos par un caractère quelconque et te créer une fonction de split pour diviser ta ligne ou un truc du genre ..
 
May 23, 2013
508
0
322
'merica
Utilises std::cin comme ça :
Code:
std::string s = "";
std::cin >> s ;  //Si j'entre "Bonjour cg3", ça ne récupéreras que le "Bonjour"

Ça récupère les tout les caractère jusqu’à ce qu'il y ait un espace.
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Le problème c'est que je souhaite crée un tableau à double entrée.
Par exemple dans ce cas : Tab[9][21].
Prendre chaque caractère et les mettre dans ce tableau.
Tab[0][0]=#;
Pour tous les mettre suffira de faire une boucle.
Mais comment les récupérer séparément.
Et comme tu l'as dis je peux les séparer ?
Mais comment ? Il n'y aucune indication dans mes cours (ceux sont tous des polycopiés).
Merci d'avance.
 

Cyrion

._.
V
Ancien staff
Jul 8, 2010
2,524
2
944
www.bufferoverflow.fr
Personnellement (C'est peut-être pas la meilleur solution) , serait d'ajouter des séparateurs du genre:

7|21|######+++####++++##+#+####+

Puis après tu fais une fonction qui crée un tableau de string , et à chaque fois que tu rencontre le caractère "|" , tu ajoute une autre string dans ton tableau (ou vecteur).

Et donc après, tu peux consulter chaque partie de ta ligne séparément.
 

fsadki

Membre d'Honneur
V
Jun 1, 2010
8,168
1
944
30
Euh... Chez moi
Personnellement (C'est peut-être pas la meilleur solution) , serait d'ajouter des séparateurs du genre:

7|21|######+++####++++##+#+####+

Puis après tu fais une fonction qui crée un tableau de string , et à chaque fois que tu rencontre le caractère "|" , tu ajoute une autre string dans ton tableau (ou vecteur).

Et donc après, tu peux consulter chaque partie de ta ligne séparément.

Oui si je pouvais modifier le fichier en effet.
Sauf que en TD (à la rentrée) nous allons avoir un labyrinthe de taille 100/100.
Je ne pourrais modifier le fichier.

J'ai juste une question à ce propos.
Voilà mon code pour lire le fichier :

Code:
int main(){
	ifstream fichier( "lab0.txt" );

	if( fichier ){
		string ligne;
		
		getline (fichier, ligne);

		cout<<ligne<<endl;


	}
	else cout<<"error";
return 0;
}

Syntaxiquement, comment pourrai-je faire pour utiliser un séparateur.
C'est à dire qu'il arrête de lire si il y a un espace ou un "#".

---------------Edit--------------
Honte à moi :'(

Code:
int main(){
	ifstream fichier( "lab0.txt" );

	if( fichier ){
		string ligne;
		string ligne2;

		getline (fichier, ligne,' ');
		cout<<ligne<<endl;

        getline (fichier, ligne2,'#');
		cout<<ligne2<<endl;
	}
	else cout<<"error";
return 0;
}

Celui ci marche.
Je peux n'utiliser qu'un seul string ( le ligne et pas besoin de ligne2) mais je vais tout de fois garder les deux) merci bien ;)

~_~ Sauf que maintenant ce sont des string.
Or pour ma part, disons pour initialiser un tableau j'utilise la fonction suivante :

Code:
void initialiser(Tableau2D& t, unsigned int dimX, unsigned int dimY){
	t.dimX = dimX;
	t.dimY = dimY;
	t.tab = new Item2D*[dimX]; //Alloue les lignes X du tableau2D.
	for(int i=0; i < dimX; i++){
		t.tab[i] = new Item2D [dimY]; //Alloue les colonnes Y du tableau2D
	}
}

En entrée elle prend des unsigned int or ligne et ligne2 sont des string.

Problème résolu :

Code:
int main(){
	ifstream fichier( "lab0.txt" );

	if( fichier ){
        int a;
        int b;
        fichier >> a; // lire un entier
        cout << "A = " << a;
        fichier >> b;
        cout << "B = " << b;

	}
	else cout<<"error";
return 0;
}



---------------------------------------------------------​

A nouveau un problème :(
Voici tout d'abord mon code :

Code:
#include "Item2D.h"
#include "Tableau2D.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main(){
	ifstream fichier( "lab0.txt" );

	if( fichier ){
        int a;
        int b;
        string ligne;
        fichier >> a; // lire un entier
        cout << "A = " << a;
        fichier >> b;
        cout << "B = " << b;

        getline (fichier, ligne,' ');
		cout<<ligne<<endl;
		Tableau2D t;
		initialiser(Tableau2D& t,  a,  b);

	}
	else cout<<"error";
return 0;
}

J'ai juste ajouter :

Code:
Tableau2D t;
		initialiser(Tableau2D& t,  a,  b);

La problème c'est que ça m'afficher cette erreur :

1388754906-error.png


Concernant la fonction initialiser, elle se trouve dans un fichier header qui se nomme "Tableau2D.h" (il est inclus avant le main).

Code:
#ifndef TABLEAU2D_H_
#define TABLEAU2D_H_
#include "Item2D.h"
struct Tableau2D {
	Item2D** tab; //tableau 2D en mémoire dynamique
	unsigned int dimX; // dimX > 0
	unsigned int dimY; // dimY > 0
};
void initialiser(Tableau2D& t, unsigned int dimX, unsigned int dimY);

void detruire(Tableau2D& t);



#endif /* TABLEAU2D_H_ */

Et d'autre part le .cpp :

Code:
#include "Item2D.h"
#include "Tableau2D.h"
#include <iostream>
using namespace std;

void initialiser(Tableau2D& t, unsigned int dimX, unsigned int dimY){
	t.dimX = dimX;
	t.dimY = dimY;
	t.tab = new Item2D*[dimX]; //Alloue les lignes X du tableau2D.
	for(int i=0; i < dimX; i++){
		t.tab[i] = new Item2D [dimY]; //Alloue les colonnes Y du tableau2D
	}
}

void detruire(Tableau2D& t){
	for(int i=0; i < t.dimX; i++){
		delete []t.tab[i];
	}
	delete [] t.tab;
}
 
Last edited:
Status
Not open for further replies.