[C++, flux et fichier]Charger un fichier dans un vector<char> [Résolu]

Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011
- - Dernière réponse : PhilipMorris
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011
- 1 nov. 2011 à 14:23
Bonjour à tous!

Débutant en c++, je cherche à charger les octets d'un fichier dans un " vector <char> tableau ", de la taille du fichier donc. Je ne sais pas si c'est possible, en tout cas j'ai des erreurs dans mon code :
 std::ifstream fichier("example.xyz", std::ios::binary);
  if (!fichier.is_open())
  {
    std::cerr << " Oups !" << std::endl;
  }
  else
  {
      fichier.seekg(0, std::ios_base::end);
      int taille = fichier.tellg();
      fichier.seekg(0, std::ios_base::beg);
  std::vector < char > tableau(taille);
  fichier.read(tableau, taille);
  fichier.close();
  }


Le problème vient de :
fichier.read(tableau, taille);


Avec comme message d'erreur :
error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::read(std::vector<char, std::allocator<char> >&, int&)'|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\istream|464|note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]|




Bref, je ne sais pas comment mettre un fichier dans un vector !
Puisse un maître me corriger
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
3
Merci
Salut,

Voici ce que je ferais :

std::ifstream fichier("example.xyz", std::ios::binary);
if (!fichier)
{
std::cerr << " Oups !" << std::endl;
}
else
{
std::vector < char > tableau;
std::copy( std::istream_iterator< char >( fichier ) ,
   std::istream_iterator< char >() , 
   std::back_insert_iterator< std::vector < char > >( tableau ) ) ;
        //...
}


C'est un grand classique d'utilisation de la STL : algoritme de copie, itérateur sur flux d'entrée et itérateur d'insertion.

Enjoy.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 197 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Lucky92
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
3
Merci
Si c'est un flux, alors j'utiliserais plutôt un std::string plutôt qu'un std::vector.
Le back_inserter est élégant, mais peu adapté à un flux de caractère. J'utilise généralement ceci:
bool fileToString(const std::string& filename, std::string& text)
{
  std::ifstream fichier(filename.c_str(), std::ios::binary);
  if (!fichier)
    return false;

  fichier.seekg(0, std::ios_base::end);
  const int nbOctet = fichier.tellg();
  fichier.seekg(0, std::ios_base::beg);

  char* tableau = new char[nbOctet + 1];
  fichier.read(tableau, nbOctet);
  fichier.close();
  tableau[nbOctet] = 0;
  text.assign(tableau, nbOctet);
  delete[] tableau;

  return true;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 197 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011
0
Merci
Merci !

Je viens de le tester et ça met énormément plus de temps à charger le fichier dans le vector que de charger dans un :
char* tableau = new char[nbOctet];



Il n'y a pas moyen de passer outre la fonction de copie pour charger un flux dans un vector? Parce que plus le fichier est grand, plus ça prend un temps fou!
Commenter la réponse de PhilipMorris
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011
0
Merci
Merci, c'est bien ce que je pensais! Résolu!
Commenter la réponse de PhilipMorris