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

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

Votre réponse

4 réponses

Meilleure réponse
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Dernière intervention
16 août 2012
- 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é 90 internautes ce mois-ci

Commenter la réponse de cs_Lucky92
Meilleure réponse
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
5 novembre 2018
- 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é 90 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Dernière intervention
1 novembre 2011
- 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
Messages postés
3
Date d'inscription
dimanche 30 octobre 2011
Dernière intervention
1 novembre 2011
- 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.