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.
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
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'; }
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBon, 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 }
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