web-dev-qa-db-fra.com

C ++ lit le fichier entier dans le tampon

Quelle est la bonne approche pour lire tout le contenu d'un fichier dans un tampon pour C++?

Alors qu'en C simple, je pouvais utiliser la combinaison de fonctions fopen(), fseek(), fread() et lire le fichier entier dans un tampon, est-ce toujours une bonne idée d'utiliser la même chose pour C++? Si oui, comment pourrais-je utiliser l'approche RAII lors de l'ouverture, l'allocation de mémoire pour le tampon, la lecture et la lecture du contenu du fichier dans le tampon.

Dois-je créer une classe wrapper pour le tampon, qui désalloue la mémoire (allouée au tampon) dans son destructeur, et le même wrapper pour la gestion des fichiers?

27
vard

Il n'y a pas besoin de classes wrapper pour des fonctionnalités très basiques:

std::ifstream file("myfile", std::ios::binary | std::ios::ate);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);

std::vector<char> buffer(size);
if (file.read(buffer.data(), size))
{
    /* worked! */
}
54
jrok

Vous pouvez accéder au contenu d'un fichier avec un flux de fichier d'entrée std :: ifstream , puis vous pouvez utiliser std :: istreambuf_iterator pour parcourir le contenu de l'ifstream,

std::string
getFileContent(const std::string& path)
{
  std::ifstream file(path);
  std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

  return content;
}

Dans ce cas, j'utilise l'itérateur pour construire une nouvelle chaîne en utilisant le contenu de l'ifstream, la std::istreambuf_iterator<char>(file) crée un itérateur au début de l'ifstream et std::istreambuf_iterator<char>() est une construction par défaut itérateur qui indique l'état spécial "end-of-stream" que vous obtiendrez lorsque le premier itérateur atteindra la fin du contenu.

16
AngelCastillo

Quelque chose que j'ai dans la plupart de mes programmes:

/** Read file into string. */
inline std::string Slurp (const std::string& path) {
  std::ostringstream buf; 
  std::ifstream input (path.c_str()); 
  buf << input.rdbuf(); 
  return buf.str();
}

Peut être placé dans un en-tête.
Je pense l'avoir trouvé ici: https://stackoverflow.com/a/116220/257568

13
ArtemGr