Fichiers et flux C++
Jusqu'à présent, nous avons utilisé la bibliothèque standard iostream, qui fournit les méthodes cin et cout pour lire les flux à partir de l'entrée standard et écrire un flux dans sortie standard.
Ce tutoriel explique comment lire des flux et écrire des flux dans des fichiers. Cela nécessite l'utilisation d'une autre bibliothèque standard en C++ fstream, qui définit trois nouveaux types de données :
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
Pour effectuer le traitement de fichiers en C++, vous devez utiliser la source C++ Le fichier de code contient les fichiers d'en-tête <iostream> et <fstream>.
Ouvrir un fichier
Avant de pouvoir lire ou écrire des informations dans un fichier, vous devez d'abord ouvrir le fichier. Les objets ofstream et fstream peuvent être utilisés pour ouvrir des fichiers pour des opérations d'écriture. Si vous avez uniquement besoin d'ouvrir le fichier pour des opérations de lecture, utilisez l'objet ifstream.
Ce qui suit est la syntaxe standard de la fonction open(), qui est membre des objets fstream, ifstream et ofstream.
void open(const char *filename, ios::openmode mode);
Ici, le premier paramètre de la fonction membre open() précise le nom et l'emplacement du fichier à ouvrir, et le deuxième paramètre définit le mode dans lequel le fichier est ouvert .
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 |
Vous pouvez combiner deux ou plusieurs des modes ci-dessus. Par exemple, si vous souhaitez ouvrir un fichier en mode écriture et que vous souhaitez tronquer le fichier au cas où le fichier existe déjà, alors vous pouvez utiliser la syntaxe suivante :
ofstream outfile; outfile.open("file.dat", ios::out | ios::trunc );
De même, si vous souhaitez ouvrir un fichier avec Pour la lecture et l'écriture, vous pouvez utiliser la syntaxe suivante :
fstream afile; afile.open("file.dat", ios::out | ios::in );
Fermer le fichier
Lorsque le programme C++ se termine, il fermera et actualisera automatiquement tous les flux, libérera toute la mémoire allouée et fermez tous les documents ouverts. Mais les programmeurs doivent prendre l’habitude de fermer tous les fichiers ouverts avant la fin du programme.
Ce qui suit est la syntaxe standard de la fonction close(), qui est membre des objets fstream, ifstream et ofstream.
void close();
Écriture dans un fichier
En programmation C++, nous utilisons l'opérateur d'insertion de flux ( << ) pour écrire des informations dans un fichier, tout comme nous utilisons cet opérateur pour afficher des informations dans le écran Idem. La seule différence est que vous utilisez ici un objet ofstream ou fstream au lieu d'un objet cout.
Lecture d'un fichier
En programmation C++, nous utilisons l'opérateur d'extraction de flux ( >> ) pour lire les informations d'un fichier, tout comme nous utilisons cet opérateur pour saisir des informations à partir du clavier . La seule différence est que vous utilisez ici un objet ifstream ou fstream au lieu d'un objet cin.
Exemple de lecture et d'écriture
Le programme C++ suivant ouvre un fichier en mode lecture et écriture. Après avoir écrit les informations saisies par l'utilisateur dans le fichier afile.dat, le programme lit les informations du fichier et les affiche à l'écran :
#include <fstream> #include <iostream> using namespace std; int main () { char data[100]; // 以写模式打开文件 ofstream outfile; outfile.open("afile.dat"); cout << "Writing to the file" << endl; cout << "Enter your name: "; cin.getline(data, 100); // 向文件写入用户输入的数据 outfile << data << endl; cout << "Enter your age: "; cin >> data; cin.ignore(); // 再次向文件写入用户输入的数据 outfile << data << endl; // 关闭打开的文件 outfile.close(); // 以读模式打开文件 ifstream infile; infile.open("afile.dat"); cout << "Reading from the file" << endl; infile >> data; // 在屏幕上写入数据 cout << data << endl; // 再次从文件读取数据,并显示它 infile >> data; cout << data << endl; // 关闭打开的文件 infile.close(); return 0; }
Lorsque le code ci-dessus est compilé et exécuté, il produit l'entrée suivante et sortie :
$./a.out Writing to the file Enter your name: Zara Enter your age: 9 Reading from the file Zara 9
Dans l'exemple ci-dessus, des fonctions supplémentaires de l'objet cin sont utilisées. Par exemple, la fonction getline() lit une ligne de l'extérieur et la fonction ignore() ignore les caractères supplémentaires laissés. par la déclaration de lecture précédente.
Pointeur d'emplacement de fichier
istream et ostream fournissent tous deux des fonctions membres pour déplacer les pointeurs d'emplacement de fichier. Ces fonctions membres incluent seekg ("seek get") pour istream et seekp ("seek put") pour ostream.
L'argument de seekg et seekp est généralement un long entier. Le deuxième paramètre peut être utilisé pour spécifier la direction de recherche. La direction de recherche peut être ios::beg (par défaut, en commençant par le début du flux), ou ios::cur (en commençant par la position actuelle du flux), ou Peut être ios::end (positionné à partir de la fin du flux).
Le pointeur de position du fichier est une valeur entière qui spécifie le nombre d'octets entre la position de départ du fichier et la position du pointeur. Voici un exemple de positionnement du pointeur d'emplacement de fichier "get" :
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg) fileObject.seekg( n ); // 把文件的读指针从 fileObject 当前位置向后移 n 个字节 fileObject.seekg( n, ios::cur ); // 把文件的读指针从 fileObject 末尾往回移 n 个字节 fileObject.seekg( n, ios::end ); // 定位到 fileObject 的末尾 fileObject.seekg( 0, ios::end );