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

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

Votre réponse

4 réponses

Meilleure réponse
cs_Lucky92 180 Messages postés mercredi 22 décembre 2004Date d'inscription 16 août 2012 Dernière intervention - 31 oct. 2011 à 04:40
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.

Merci cs_Lucky92 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Lucky92
Meilleure réponse
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscription 24 septembre 2018 Dernière intervention - 1 nov. 2011 à 12:07
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
PhilipMorris 3 Messages postés dimanche 30 octobre 2011Date d'inscription 1 novembre 2011 Dernière intervention - 31 oct. 2011 à 13:41
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
PhilipMorris 3 Messages postés dimanche 30 octobre 2011Date d'inscription 1 novembre 2011 Dernière intervention - 1 nov. 2011 à 14:23
0
Merci
Merci, c'est bien ce que je pensais! Résolu!
Commenter la réponse de PhilipMorris

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.