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

Résolu
PhilipMorris
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011
- 30 oct. 2011 à 23:48
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

4 réponses

cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
31 oct. 2011 à 04:40
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.
3
cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
1 nov. 2011 à 12:07
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
3
PhilipMorris
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
1 novembre 2011

31 oct. 2011 à 13:41
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!
0
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
Merci, c'est bien ce que je pensais! Résolu!
0