C++ : Lecture fichier texte

Sethpolma Messages postés 66 Statut Membre -  
 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

  1. Doudou95 Messages postés 1897 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
  2. Luffy =) Messages postés 366 Statut Membre 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
  3. Sethpolma Messages postés 66 Statut Membre 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
  4. MissZaza Messages postés 149 Statut Membre 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
    1. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  7. Sethpolma Messages postés 66 Statut Membre 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
  8. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  9. Sethpolma Messages postés 66 Statut Membre 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
    1. MissZaza Messages postés 149 Statut Membre 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
    2. 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
  10. Doudou95 Messages postés 1897 Date d'inscription   Statut Membre Dernière intervention   275
     
    Pourquoi ne pas ajouter un flux lier au fichier oO
    0
  11. kcmo31 Messages postés 22 Statut Membre
     
    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
    1. 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
  12. Doudou95 Messages postés 1897 Date d'inscription   Statut Membre Dernière intervention   275
     
    Surement en mettant tout dans un String
    0
  13. 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