Lire le fichier en chaîne en C++

Jinku Hu 12 octobre 2023
  1. Utilisez istreambuf_iterator pour lire le fichier dans une chaîne en C++
  2. Utilisez rdbuf pour lire un fichier dans une chaîne de caractères en C++
  3. Utiliser fread pour lire un fichier dans une chaîne
  4. Utilisez la fonction read pour lire un fichier dans une chaîne de caractères
Lire le fichier en chaîne en C++

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 :

  1. Un pointeur vers la mémoire tampon où les données lues sont stockées.
  2. La taille de l’élément de données.
  3. Nombre de données
  4. 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);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ File