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?
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! */
}
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.
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