[C++] Lire un fichier dans un string

Lire un fichier dans un string [C++] - C++ - Programmation

Marsh Posté le 06-05-2004 à 08:45:35    

Je cherche a lire un fichier dans un std::string sous VC++ 6.
 
J ai alors entrez le code suivant:
 

Code :
  1. std::ifstream in("toto.txt" );
  2. std:: string c ;
  3. std::copy( std::istream_iterator<char>(in)
  4. , std::istream_iterator<char>()
  5. , std::back_inserter(c) );


 
Mais alors, je ne comprend pas l' erreur de compilateur:
 
error C2039: 'push_back' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' ....
 
Je pense avoir mis les bons include (l' erreur semble pas venir de la)
Du coup , je bloque ...

Reply

Marsh Posté le 06-05-2004 à 08:45:35   

Reply

Marsh Posté le 06-05-2004 à 08:55:09    

ben la réponse elle est claire : une string n'a pas de push_back

Reply

Marsh Posté le 06-05-2004 à 09:02:03    

Bon, comment j ecris dans le string alors?

Reply

Marsh Posté le 06-05-2004 à 09:05:04    

ben tu écris pas. tu utilises un vector/deque<char> ou tu écris toi même une sorte de back_inserter pour string


Message édité par Taz le 06-05-2004 à 09:05:39
Reply

Marsh Posté le 06-05-2004 à 09:11:25    

ok merci

Reply

Marsh Posté le 06-05-2004 à 10:06:32    

que pensez vous d'un truc comme ça?

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <sstream>
  5. using namespace std;
  6. int main(int argc, char *argv[])
  7. {
  8.         if(argc!=2)
  9.         {
  10.                 cout << "bad args" << endl;
  11.                 exit(1);
  12.         }
  13.         ifstream in(argv[1]);
  14.         if(!in)
  15.         {
  16.                 cout << "cannot open file " << argv[1] << endl;
  17.                 exit(0);
  18.         }
  19.         stringstream out;
  20.         out << in.rdbuf();
  21.         string content=out.str();
  22.         cout    << "content size: " << content.size() << endl
  23.                 << "content:"
  24.                 << content << endl;
  25. }


Reply

Marsh Posté le 06-05-2004 à 10:18:26    

c'est pas mal
 
string content=out.str();  
 
mais arrêtez avec =
 
par contre, je planquerais le stringstream, histoire de pouvoir le purger dès que j'ai récupéré ma string

Reply

Marsh Posté le 06-05-2004 à 11:02:51    

Bon j ai stocké mon fichier dans un vector<char> mais le probleme c est que j ai perdu tous les espaces et tabulations.
Z avez pas une idée pour eviter ca?

Reply

Marsh Posté le 06-05-2004 à 11:50:12    

J'aurais fait ca betement :

Code :
  1. std::ostringstream stream;
  2. std::string str;
  3. std::ifstream fichier( "nom_fichier.txt" );
  4. while( std::getline( fichier, str ) ) //--edit.
  5. stream << str << "\n";
  6. std::cout << stream.str();


Message édité par xterminhate le 06-05-2004 à 16:40:02

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 06-05-2004 à 13:03:59    

Ton prog marche bien.
En ce qui me concerne, j ai besoin de lire un gros fichier et les getline prennent beacoup de temp(18 sec).
Je voudrais pouvoir le lire en quasi instantanné

Reply

Marsh Posté le 06-05-2004 à 13:03:59   

Reply

Marsh Posté le 06-05-2004 à 13:57:15    

xterminhate a écrit :

J'aurais fait ca betement :
 
std::ostringstream stream;
std::string str;
std::ifstream fichier( "nom_fichier.txt" );
while( !std::getline( fichier, str ) .eof() )
stream << str << "\n";
std::cout << stream.str();
 

ça tu peux le dire, t'es con ...


Message édité par Taz le 06-05-2004 à 13:57:39
Reply

Marsh Posté le 06-05-2004 à 14:23:15    

Stoluup a écrit :

Ton prog marche bien.
En ce qui me concerne, j ai besoin de lire un gros fichier et les getline prennent beacoup de temp(18 sec).
Je voudrais pouvoir le lire en quasi instantanné


et le type de solution que je t'ai donné plus haut ne te convient pas?

Reply

Marsh Posté le 06-05-2004 à 14:24:18    

la solution rdbuf est bonne
sinon on peut tout simplement passer par un read

Reply

Marsh Posté le 06-05-2004 à 14:28:40    

hé, en fait SoWhat, je la comprennait pas bien ta solution.
 
Et, au risque d' énerver tout le monde, je dois avouer que je bidouille pas mal sans trop connaitre la STL.
 
Un programme optimal, c' est qqch de nouveau pour moi

Reply

Marsh Posté le 06-05-2004 à 15:09:53    

En plus rapide...
 

Code :
  1. #include<string>
  2. #include<iostream>
  3. #include<sstream>
  4. #include<fstream>
  5. using namespace std;
  6. int main()
  7. {
  8. ifstream is ("nom_fichier.txt" );
  9. is.seekg (0, ios::end);
  10. int length( is.tellg() );
  11. is.seekg (0, ios::beg);
  12. char * buffer = new char [length];
  13. is.read (buffer,length);
  14. string str( buffer);
  15. delete[] buffer;
  16. cout << str;
  17. }


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 06-05-2004 à 15:12:25    

Taz a écrit :

ça tu peux le dire, t'es con ...


Qu'est ce qui ne va pas ?


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 06-05-2004 à 15:17:05    

Bon SoWhatin22, ton prog est bien aussi.
Mais , il met quand même 16 secondes pour lire mon fichier.

Reply

Marsh Posté le 06-05-2004 à 16:00:27    

pour copier un fichier j'ai un code cour

Reply

Marsh Posté le 06-05-2004 à 16:22:19    

En fait, je voulais lire le fichier dans un string pour pouvoir utiliser find et trouver un mot particulier.
Pour mon problème le mieux est en fait de ne pas lire le fichier dans un string:
 

Code :
  1. std::ifstream in("fichier.txt" );
  2. std::istream_iterator<string> Begin(in);
  3. std::istream_iterator<string> End;
  4. if (std::find(Begin, End, ToFind) != End)
  5. {cout<<"bon";}


Mais je suis tombé sur un nouveau problème:
Je dois recherché un mot des centaines de fois, et même avec find ça rame,...  mais bon ce problème a surement sa place dans un autre topic
 

Reply

Marsh Posté le 06-05-2004 à 16:28:38    

xterminhate a écrit :

Qu'est ce qui ne va pas ?

tu te fous de qui avec ton eof ?

Reply

Marsh Posté le 06-05-2004 à 16:39:11    

Oui, c'est pas terrible en effet, probablement que sans eof() ce serait mieux.
 
Et je ne me fous de personne, loin de moi l'idée d'être aussi impoli que toi.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 06-05-2004 à 16:44:42    

ben dès fois ça à se demander ... les stream ont tout pour être utilisé facilement, avec détection d'erreur, etc, tout à a été fait pour que tu puisses écrire
 
while(std::getline(std::cin, line))
 
et toi tu mets tout en l'air avec eof que tu ne sais même pas employer correctement ...

Reply

Marsh Posté le 06-05-2004 à 16:47:34    

C'est noté et j'espère réparé! :)


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed