C++ : Lecture fichier texte

Sethpolma Messages postés 66 Date d'inscription   Statut Membre Dernière intervention   -  
 lydafree -
Bonjour,

J'aimerais savoir comment lire un fichier texte en C++, et ce caractère par caractère. En effet, voici le code que j'ai imaginé (le fichier texte comprend exactement 25 colonnes et 16 lignes, toutes remplies d'un chiffre).

void ReadLVL(int a)
{
	FILE* file;

	if( a==1 ) file = fopen("lvl001.txt","r");

	for( char j=1 ; j<19 ; j++ )
	{
		for( char i=1 ; i<26 ; i++ )
		{
			lvl[i][j] = fgetc(file);
		}
	}

	fclose(file);
}


Or, le programme, lors de l'appel à cette fonction, quitte instantanément. Cela dit, je n'ai encore jamais eu besoin d'utiliser des fichiers textes. Donc, il est fort probable que ce soit une erreur de programmation...

Merci !

12 réponses

Doudou95 Messages postés 1561 Date d'inscription   Statut Membre Dernière intervention   275
 
#include <iostream>
using namespace std;
# include <fstream>

fstream file;

file.connect("fichier.txt";ios::in|ios::out|ios::app);

Après faut que je fasse un peu de recherche j'ai ça chez moi la je taff te dirais ça mais c'est un truc à base de
while(file>>...)
{
cout << ....;
}
5
Luffy =) Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   110
 
salut =)

le principe est bon, mais la mise en pratique un peu moins... ;-)

sur tes boucles, il faut boucler avec des int et non avec des char.
ensuite si tu as 19 colonnes, il faut penser au caractère de retour à la ligne (\n en général, mais ça pt être \n\r, à voir).

la variable lvl a été déclaré ailleurs que dans la fonction ?

voili voilou ++
1
Sethpolma Messages postés 66 Date d'inscription   Statut Membre Dernière intervention   15
 
Tiens ! Encore toi ! Tu es décidément mon sauveur, Luffy !

Il s'agit toujours du même jeu, avec quelques problèmes supplémentaires... Au fur et à mesure que j'en résouds, d'autres apparaissent... Niveau tableaux dynamiques, ça marche toujours pas. Je pense que je vais tout transformer en statique, et me débrouiller avec.

Par contre, pour la lecture du fichier, je ne vois toujours pas. Bien sûr, la matrice lvl a été déclarée ailleurs. Mais, même en augmentant i et j et en les transformant en entier, ça ne marche pas... Vraiment très bizarre...
0
MissZaza Messages postés 149 Date d'inscription   Statut Membre Dernière intervention   33
 
Bonsoir,

Peut-être qu'il n'arrive pas à ouvrir le fichier.
Mets un test sur l'ouverture:
if (!file) // Affiche un message d'erreur
0
moberol
 
bjr! excusez moi ! je suis debutant en C++
je doit lire dans un fichier text le nombre de module existant dans le fichier mais j'ai que des nobre négatif si vous pouvez m'aider...
merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
En effet, il peut y avoir un problème d'ouverture de fichier.
D'ailleur, à ta place, je grouperai l'ouverture du fichier avec sa lecture et sa fermeture dans le if(a==1)
D'ailleur, je ne voi vraiment pas l'interet de passer un argument à cette fonction. autant faire dans l'apel : if (a==1) ReadLVL();
donne nous la declaration de lvl aussi stp.
0
Sethpolma Messages postés 66 Date d'inscription   Statut Membre Dernière intervention   15
 
La déclaration de lvl est : char lvl[25][18]. Je ne pense pas que le problème vienne de là, car j'ai essayé quelques niveaux, et tout fonctionnait très bien.

Pour l'existence du fichier, je vais essayer... Vraiment très étrange... D'habitude je pense à faire cela (tous les chargements des images ont leurs propres messages d'erreurs). J'essaierais ça dès que je pourrai.

Sinon, l'argument est nécessaire : ce sera la même fonction pour tous les niveaux, et le fichier change selon le niveau où l'on est. Pour le niveau 1, ce sera le fichier "lvl001.txt". Pour le 2, "lvl002.txt", et ainsi de suite.

Je vous tiens au courant !
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
a ce moment la, je te conseil de faire juste avant le for :
if(file==NULL) {cerr<<"pb chargement level\n";return;}
enfin, cherche pas trop, si tu as déclarer lvl[25][18], c'est normal que ça plante ! tu va chercher lvl[25][18] or en C les tableau commencent à 0 (c'est pas à toi que je l'ai deja dit?) donc au max tu peux apeler lvl[24][17] !
0
Sethpolma Messages postés 66 Date d'inscription   Statut Membre Dernière intervention   15
 
J'ai revu un petit peu mon code. Maintenant, mon fichier texte est bien lu (mon fichier texte n'avait pas d'extension, ce qui a mit le programme incapable de le reconnaître). J'ai aussi modifié la taille de mon tableau.

Cependant, un problème persiste. Mon fichier texte est bien lu (j'ai fait un cout dans un fichier vierge pour m'en assurer). Or, il semblerait qu'il ne parvienne pas à tester la valeur.

	

int boxc = 0, goalc = 0, wallc = 0;

Box = new box[nbBox];
Goal = new goal[nbGoal];
Wall = new wall[nbWall];

for( int j=1 ; j<19 ; j++ )
{
             for( int i=1 ; i<27 ; i++ )
            {
	lvl[i][j] = fgetc(file);

                          // Position 1
			
	if( lvl[i][j] == 3 ) 
	{

                          // Position 2
		Box[boxc] = box(i,j);
		boxc++;
	}

	if( lvl[i][j] == 2 )
	{
		Goal[goalc] = goal(i,j);
		goalc++;
	}

	if( lvl[i][j] == 5 )
	{
		Sokoban[0] = soko(i,j);
	}

	if( lvl[i][j] == 1 )
	{
		Wall[wallc] = wall(i,j);
		wallc++;
	}
                }
}


Voici le morceau de code qui se trouve dans la boucle précédente. Si je met un cout en position 1, je retrouve tout dans mon fichier texte. Si je le met en position 2, il n'y a rien (il devrait y avoir au moins un 2). Je soupçonne donc une erreur dans la condition if... Mais, quelle-est elle ?
0
MissZaza Messages postés 149 Date d'inscription   Statut Membre Dernière intervention   33
 
Bonjour,

Quand tu fais fgetc(), tu récupères un caractere ou plutôt le code ASCII de ce caractere, c'est pourquoi ta comparaison ne fonctionne pas.
Tu as 2 solutions:
soit tu fais if ( lvl[i][j]=='3' ) pour comparer caractere et caractere,
soit tu convertis ton lvl[i][j] en int et tu le compares ensuite à 3.
Bonne prog.
A+.
0
Omeya
 
Salut,

Pour lire un fichier texte, je te conseille de le faire ligne par ligne en utilisant des strings puis de travailler sur ces strings...

/////////////////////////////////
int numclosed;
string ligne;

ifstream ouverturefichier( "exemple.txt" ); // ouvre le fichier "exemple.txt"
while ( getline( ouverturefichier, ligne )) //lit toutes les lignes du fichier, jusqu'à la dernière
{
//ici tu ajoute ton code pour travailler sur la string "ligne" en cours
}
numclosed = _fcloseall( ); // ferme tous les fichiers ouverts
///////////////////////////////////

Je ne t'ai mis, ici, que le code de base pour lire toutes les lignes d'un fichier texte. A toi ensuite d'effectuer les opérations de recherche/enregistrement/modification de mots ou de caractères dans les strings lus par ce bout de code ;)
0
Doudou95 Messages postés 1561 Date d'inscription   Statut Membre Dernière intervention   275
 
Pourquoi ne pas ajouter un flux lier au fichier oO
0
kcmo31 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
bonjour , je veux afficher le contenu d'un fichier text(c://windows//temp// exemple.txt) dans mon interface c++ BUILDER sans passer par la boite de dialogue , directement par un bouton
merci
0
bibi87
 
slt kcmo31, j'éspére que tu as trouvé la réponse à ta question , car moi aussi je cherche à faire la méme chose avec mon interface"afficher le contenu d'un fichier texte dans mon interface c++builder" donc si tu as la solution fais le moi savoir stp, mérciii pour ton aide.
0
Doudou95 Messages postés 1561 Date d'inscription   Statut Membre Dernière intervention   275
 
Surement en mettant tout dans un String
0
lydafree
 
bonjour a tous;
j'ai le mem problème mais avec c++ builder; j'ai essayé tout ce que j'ai trouvé dans le net en c et en c++ mais ça marche pas avec builder.
qlq'1 peut m'aider svp?
0