Lire un fichier texte avec Visual 2010 - problème definition

Résolu
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 - Modifié le 10 janv. 2023 à 14:52
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 - 12 janv. 2023 à 09:36

Salut à tous et toutes,

Je suis certaine que le blocage vient d'un truc tout bête, mais puisque je tourne en rond dessus depuis un moment déjà, je viens vers vous en espérant que vos méninges fonctionneront mieux que les miennes. 

Je suis sous visual studio 2010 et je code en c++ (ce n'est pas mon langage maternel, je le code comme je l'ai trouvé sur internet, donc soyez indulgents svp). 

Objectif tout simple : lire la seule et unique ligne d'un fichier texte pour la stocker dans une variable pour l'utiliser dans la suite de mon programme. Voici le code : 

1  CString lecture(){
2    	CString result ; 
3   	string ligne;
4   	ifstream monFlux("C:/MonFichier.txt");  //Ouverture d'un fichier en lecture
5
6       if(monFlux)
7       {
8    
9       	getline(monFlux,ligne);
10      }
11      else
12      {
13          cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
14      }
15
16      result = ligne.c_str(); 
17      monFlux.close() ; 
18
19      return result ;
20
21 } 

Cependant, lorsque je génère la solution, des messages d'erreurs me sont retournés : 

ligne 9 : "Erreur    86    error C3861: 'getline' : identificateur introuvable   "

ligne 4 : "Erreur    85    error C2440: 'initialisation' : impossible de convertir de 'const char [22]' en 'int'   "

ligne 4 : "Erreur    84    error C2079: 'monFlux' utilise une class de 'std::basic_ifstream<_Elem,_Traits>' non défini  "

Sur le papier (enfin l'écran :p ), je pense que le code est censé fonctionner, donc je me dis que ça vient peut-être d'un problème d'en-têtes ou de version ? Voici mes #include

#include <stdlib.h> 
#include <iostream>
#include <string>
#include <stdio.h>
#include <afxdb.h> 
#include <fstream>
#include <sstream>
#include <istream>

Voilà, j'espère que vous aurez une piste. Si vous avez besoin de plus d'informations demandez-moi ! 

Merci d'avoir pris le temps de lire ! 

6 réponses

pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
10 janv. 2023 à 18:51

Bonjour Maelhia,

Je ne fais aucune correction dans ton programme. En voici une variante utilisable.

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

std::string lecture(std::string fichier) {
    std::string line;
    std::ifstream filein(fichier.c_str());
    if(std::getline(filein, line)) return line;
    std::cout << "Erreur de lecture du fichier : " << fichier << std::endl;
    return "ko";
}

int main(int argc, char** argv) {
    std::string ligne = lecture("monfichier.txt");
    if(ligne != "ko") std::cout << "La ligne lue est : " << ligne << std::endl;
    return 0;
}

Bonne continuation.

1
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
Modifié le 11 janv. 2023 à 14:04

Bonjour Maelhia,

Voici une version améliorée et plus complète pour ton logiciel.

#include <windows.h> 
#include <iostream>
#include <fstream>
#include <cstddef>
#include <vector>
#include <string>

// Pour afficher les caractères spéciaux du français
std::string print(const std::string strn) {
    char* buf = new char[strn.size()+1];
    CharToOemA(strn.c_str(), buf);
    std::string str(buf);
    delete [] buf;
    return str;
}

// Pour lire la première ligne du fichier nommé : fichier
std::string lecture(std::string fichier) {
    std::string line;
    std::ifstream filein(fichier.c_str());
    if(std::getline(filein, line)) return line;
    std::cout << "Erreur de lecture du fichier : " << fichier << std::endl;
    return "ko";
}

int main(int argc, char** argv) {
    std::string ligne = lecture("monfichier.txt");
    if(ligne != "ko") {
        std::cout << "La ligne lue est : " << print(ligne) << std::endl;
        std::vector<std::string> mots;
        int n = 0;
        std::size_t found = ligne.find(" ");
        while (found != std::string::npos) {
            if(found != 0) {
                n = n+1;
                mots.push_back(ligne.substr(0, found));
            }
            ligne = ligne.substr(found+1);
            found = ligne.find(" ");
        }
        if(ligne.size() != 0) {
            n = n+1;
            mots.push_back(ligne);
        }
        for(int i=1; i <= n; i++) std::cout << print("mot n° ") << i << " : " << print(mots[i-1]) << std::endl;
    }
    return 0;
}

Comme tu peux le voir :

- ligne est la première ligne du fichier nommé fichier
- mots est un vecteur de strings
- mots[i-1] est le i-ième mot contenu dans la string nommée ligne
- n est le nombre final de mots contenus dans la string nommée ligne
- les caractères spéciaux du français sont affichés correctement

En voici l'affichage d'une première utilisation :

La ligne lue est : mésange âne tortue zèbre léopard chien
mot n° 1 : mésange
mot n° 2 : âne
mot n° 3 : tortue
mot n° 4 : zèbre
mot n° 5 : léopard
mot n° 6 : chien

Avec cette version cela permet d'envisager facilement d'autres utilisations.

Cordialement, pgl10


1
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 11
11 janv. 2023 à 16:51

Bonjour,

Le fichier ici n'est pas un fichier texte. Ça semble être un fichier au format utf-16 little-endian avec header.

Pour le lire, plutôt qu'une bidouille, il faut le convertir en utf-8.

#include <fstream>
#include <codecvt>
#include <string>

void test() {
	std::ifstream  f_in( "C:/test.txt" );
	f_in.imbue( std::locale( f_in.getloc(),
		new std::codecvt_utf16<char, 0x10ffff, std::consume_header> ) );
	std::string  str;
	std::getline( f_in, str );
	std::cout << str << '\n';
}
1
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 1
11 janv. 2023 à 09:07

Salut ! 

Merci plg10 pour ton code, il fonctionne. Cependant, pour la suite de mon programme je dois changer la valeur récupérée dans line en CString. Voici ce que j'ai fais : 

#include <iostream>
#include <fstream>
#include <string>
#include "stdafx.h"

std::string lecture(std::string fichier) {
    std::string line;
    std::ifstream filein(fichier.c_str());
    if(std::getline(filein, line)) return line;
    std::cout << "Erreur de lecture du fichier : " << fichier << std::endl;
    return "ko";
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	CString chaineFinale;
	string ligneFichier;
	ligneFichier= lecture("C:\\test.txt");
	chaineFinale= ligneFichier.c_str();

	// Suite du programme
 

}

Le problème vient de quand je lis mon fichier "C:\test.txt" . Dans ce fichier il n'y a que écrit "toto". Hors, le mot "toto" va être stocké de la manière suivante dans ma variable ligneFichier. 

ligneFichier: [0] : 'ÿ'

            [1] : 'þ'

            [2] : 't'

            [3] : 0x00

            [4] : 'o'

            [5] : 0x00

            [6] : 't'

            [7] : 0x00

            [8] : '0'

            [9] : 0x00

Ce qui fait que lorsque j'éxécute cette partie du code  : 

chaineFinale= ligneFichier.c_str();

ma variable chaineFinale = 'ÿþt' alors que je souhaiterai récupérer 'toto'. 

Une idée de comment résoudre ça ? 

0

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

Posez votre question
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 1
11 janv. 2023 à 11:46

Bon, pour palier à mon problème j'ai fais un peu de "bricolage". Je mets ça ici des fois que ça puisse aider, mais si quelqu'un a une meilleure solution ou une explication, qu'il/elle n'hésite pas à m'en faire part. 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	CString chaineFinale;
	string ligneFichier;
    string intermediaire ; 

    int num ; // longueur de ligneFichier 
    int i ; 
    int cmpt ; 
    
    
    intermediaire = "1234" // car j'aurai toujours 4 caractère max à récupérer dans mon fichier txt
    num = ligneFichier.length();
    cmpt= 0 ;


    ligneFichier= lecture("C:\\test.txt"); // on lit le fichier 

    for (i=0; i<num; i=i+1) {

        if ((i%2==0) && (i+2<num)){
           
           intermediaire[cmpt]=ligneFichier[i+2]; // car c'est à partir de l'indice 2 qu'il y a les caractères qui m'interressent
           cmpt=cmpt+1 ;

        }

    }
// à la fin de la boucle on a "toto" stocké dans intermediaire
	
	chaineFinale= intermediaire.c_str();

	// Suite du programme
 

}
0
Maelhia Messages postés 21 Date d'inscription vendredi 25 mars 2022 Statut Membre Dernière intervention 15 février 2023 1
12 janv. 2023 à 09:36

Salut pgl10 et Dalfab 

Merci pour vos réponses. 

pgl10 : Merci pour ton code, en effet ça me permettra plus tard de faire évoluer le contenu de mon fichier txt c'est top !! 

Dalfab : En effet, mon fichier n'était pas au format utf-8. Plutôt que de m'embêter avec du code, j'ai préféré changer le type de mon fichier. Cependant, en utf-8 ça me renvoyait aussi des caractères particuliers. Je l'ai passé en ANSI pour pouvoir seulement récupérer "toto" avec mon code actuel. 

Merci encore à tous les deux pour votre aide :D

0
Rejoignez-nous