C++ : Lecture fichier texte
Sethpolma
Messages postés
66
Date d'inscription
Statut
Membre
Dernière intervention
-
lydafree -
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).
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 !
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
#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 << ....;
}
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 << ....;
}
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 ++
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 ++
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...
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...
Bonsoir,
Peut-être qu'il n'arrive pas à ouvrir le fichier.
Mets un test sur l'ouverture:
if (!file) // Affiche un message d'erreur
Peut-être qu'il n'arrive pas à ouvrir le fichier.
Mets un test sur l'ouverture:
if (!file) // Affiche un message d'erreur
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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 !
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 !
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] !
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] !
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.
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 ?
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 ?
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+.
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+.
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 ;)
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 ;)
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
merci