Lire le fichier en chaîne en C++
-
Utilisez
istreambuf_iterator
pour lire le fichier dans une chaîne en C++ -
Utilisez
rdbuf
pour lire un fichier dans une chaîne de caractères en C++ -
Utiliser
fread
pour lire un fichier dans une chaîne -
Utilisez la fonction
read
pour lire un fichier dans une chaîne de caractères
Cet article explique plusieurs méthodes pour lire le contenu d’un fichier dans une std::string
en C++.
Utilisez istreambuf_iterator
pour lire le fichier dans une chaîne en C++
istreambuf_iterator
est un itérateur d’entrée qui lit les caractères successifs de l’objet std::basic_streambuf
. Ainsi, nous pouvons utiliser istreambuf_iterator
avec un flux ifstream
et lire le contenu entier du fichier dans une std::string
.
Au début, nous ouvrons un chemin de fichier donné comme un objet ifstream
. Ensuite, nous pouvons passer istreambuf_iterator<char>(input_file)
au constructeur string
et obtenir l’objet dont nous avions besoin en premier lieu. Notez que nous passons directement l’instruction du constructeur string
pour retourner de la fonction. La sortie du programme devrait être le contenu du fichier tel que spécifié par la variable filename
.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString(const string& path) {
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
return string((std::istreambuf_iterator<char>(input_file)),
std::istreambuf_iterator<char>());
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Utilisez rdbuf
pour lire un fichier dans une chaîne de caractères en C++
La fonction rdbuf
est une méthode intégrée pour renvoyer un pointeur vers le tampon de flux du fichier, ce qui est utile pour insérer le contenu entier du fichier en utilisant l’opérateur <<
vers l’objet nécessaire.
Dans l’exemple suivant, nous construisons un objet ostringstream
où nous insérons la valeur de retour de la fonction rdbuf
. La fonction elle-même renvoie l’objet string
, donc la méthode string
est utilisée pour obtenir la valeur de retour finale.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString2(const string& path) {
auto ss = ostringstream{};
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
ss << input_file.rdbuf();
return ss.str();
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString2(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Utiliser fread
pour lire un fichier dans une chaîne
Une autre méthode pour lire un fichier est la fonction de bibliothèque standard C fread
. Cette méthode nécessite des fonctions relativement anciennes qui ne sont pas courantes dans les bases de code C++ modernes, mais elle offre des performances d’accélération significatives par rapport aux méthodes précédentes.
La fonction fread
prend quatre arguments :
- Un pointeur vers la mémoire tampon où les données lues sont stockées.
- La taille de l’élément de données.
- Nombre de données
- Le pointeur de fichier à partir duquel on peut lire.
Puisque nous lisons le fichier en entier, la taille du fichier doit être récupérée, et c’est implémenté avec l’appel système Unix stat
. Une fois la taille du fichier récupérée, nous transmettons sa valeur en tant que taille de l’élément de données à la fonction fread
, et en tant que nombre d’éléments de données, nous spécifions 1
.
Notez que les fichiers ouverts doivent être fermés avec l’appel de la fonction fclose
, qui prend le seul argument du pointeur de fichier.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString3(const string& path) {
struct stat sb {};
string res;
FILE* input_file = fopen(path.c_str(), "r");
if (input_file == nullptr) {
perror("fopen");
}
stat(path.c_str(), &sb);
res.resize(sb.st_size);
fread(const_cast<char*>(res.data()), sb.st_size, 1, input_file);
fclose(input_file);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString3(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Utilisez la fonction read
pour lire un fichier dans une chaîne de caractères
La méthode de read
est un appel de fonction compatible POSIX disponible sur divers systèmes d’exploitation et peut être la plus souple si le programmeur sait l’utiliser efficacement. La méthode fread
elle-même appelle read
en dessous, mais cela ne garantit pas un fonctionnement plus rapide dans tous les cas, car de multiples facteurs jouent un rôle dans l’utilisation efficace de ces appels de système.
La principale différence avec fread
est que read
a besoin d’un argument descripteur de fichier pour pointer vers le fichier à partir duquel on veut lire les données. Les descripteurs de fichiers sont des entiers spéciaux associés aux flux de fichiers ouverts que le programme peut avoir pendant l’exécution. Ils peuvent être acquis en utilisant l’appel de fonction open
et stockés dans le type int
. Les deux autres arguments de la fonction read
sont le pointeur vers le tampon où les données seront stockées et le nombre d’octets à lire, ce dernier étant récupéré avec l’appel de fonction fstat
. Notez que nous utilisons la string.data
comme tampon pour stocker le contenu des fichiers lus.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString4(const string& path) {
struct stat sb {};
string res;
int fd = open(path.c_str(), O_RDONLY);
if (fd < 0) {
perror("open\n");
}
fstat(fd, &sb);
res.resize(sb.st_size);
read(fd, (char*)(res.data()), sb.st_size);
close(fd);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString4(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook