Écrire des données dans un fichier en C#. Travailler avec des fichiers en C-Sharp. Classes StreamReader et StreamWriter. Écrire dans un fichier

J'avoue : « Je n'ai aucune idée de comment écrire une structure dans un fichier s'il y a des pointeurs à l'intérieur de ses champs. » Je peux enregistrer chaque champ individuellement, mais ce n'est pas ce que j'aimerais vraiment. En fait, j’aimerais écrire toute la structure d’un coup, et une telle possibilité existe pour les structures. (Le seul bémol est que my: « existe » fait référence à des structures sans pointeurs. Je ne sais pas avec des pointeurs (je pense que pour les structures avec des pointeurs, il suffit de traiter les champs individuellement).

Comme tu le sais, opérations standards l'entrée et la sortie sont effectuées à l'aide de threads. Les opérations sur les fichiers sont également effectuées à l'aide de threads. Il existe trois classes à cet effet. La première chose à faire pour travailler avec un fichier est de l'ouvrir. Le vide est ouvert.

Le premier paramètre spécifie le chemin d'accès au fichier. Le second représente le mode d'ouverture du fichier. Il y a divers modes, dans lequel vous pouvez ouvrir le fichier. Voir un exemple d'ouverture d'un fichier en lecture et en écriture. Comme mentionné ci-dessus, un flux est associé à un fichier. De cette façon, vous pouvez effectuer des opérations d'entrée et de sortie de base telles que l'écriture et la lecture d'un fichier.

Ainsi, pour écrire une structure dans un fichier, il est nécessaire qu’il existe une telle structure que nous souhaitons écrire. Est-ce logique ? – logique. On commence donc par écrire une structure simple

PHP

struct mystruct //Structure MyStruct à trois champs (i,buf,d) ( long i; char buf; double d; ); int main() ( mystruct X; //Déclare une structure X dont le type est mystruct return 0; )

C'est probablement assez simple et compréhensible. Création d'une structure et type de variable structure créée. Maintenant, il ne reste plus que partie importante— écrire la structure dans un fichier. Pour écrire une structure dans un fichier, vous devez connaître la taille de la structure.
Parlons à nouveau des pointeurs. S'il y a des pointeurs dans les champs de la structure, alors taille correcte les structures ne peuvent pas être reconnues. La taille d'un objet ne peut pas être extraite du pointeur. Il est possible de connaître la taille du pointeur lui-même, mais pas la taille de l'objet vers lequel il pointe. Cela pose des difficultés notables. Un pointeur reste un pointeur, une connerie complexe.
Revenons à l'écriture d'une structure simple dans un fichier. Pour écrire une structure dans un fichier, vous devez indiquer au compilateur l'adresse de la structure, un pointeur de transtypage vers char et la taille de la structure à écrire. C'est fait comme ça

Cette fonction ferme le fichier et sépare le flux de ce fichier. Vous obtiendrez le résultat suivant car le symbole nouvelle ligne est aussi un personnage, et il est extrait de la même manière que n'importe quel caractère simple. Il est possible de définir la position de la prochaine valeur récupérée du flux.

Comme indiqué ci-dessus, l'opérateur d'insertion est utilisé pour écrire des données formatées dans un fichier. Vous pouvez également utiliser fonctions suivantes pour écrire dans un fichier. Ce programme fournit prochaine sortie. Cependant, cela ne signifie pas que vous y comptez : le problème est que les garbage collector ne s'exécutent généralement que lorsque la mémoire est faible ; ils ignorent l'existence d'autres ressources rares telles que descripteurs de fichiers. S'il y en a plusieurs disponibles mémoire disponible, il est facile d'exécuter des descripteurs de fichiers bien avant le démarrage du garbage collector.

PHP

#inclure #inclure #inclure struct mystruct ( long i; char buf; double d; ); int main() ( const char *FName="d:\\txt"; //Chemin d'accès au fichier. Entrez le vôtre. mystruct X; //memset(&ms,0,sizeof ms); //vous pouvez initialiser le structurer les éléments avec des zéros comme ceci X.i = 10; //écrire la valeur dans le champ i X.d = 2; //écrire la valeur dans le champ d strcpy(X.buf,"site"); buf field //ouvre le fichier d'écriture du flux f(FName) ,ios::binary|ios::out); f.write((char*)&X,sizeof X); //Écrit la structure entière f.close(); ); strcpy(X.buf,"\0"); //Je change le champ buf de la structure X X.i=0; //Je change le champ i de la structure X //ouvre le fichier de lecture ifstream dans(FName, ios::binary|ios::in); &X,sizeof X //Lire la structure entière en même temps in.close();<

Les chemins logiques peuvent ensuite apparaître à des emplacements spécifiques sur le système de fichiers réel lorsque le programme a été installé en définissant une « traduction de chemin logique » qui convertit les chemins logiques correspondant à certains caractères génériques en noms de chemin représentant les fichiers sur le système de fichiers, appelés chemins physiques. Ils les utilisent dans certaines situations, mais vous pouvez aller assez loin sans vous en soucier. C'est à vous de vous soucier de la portabilité.

Au chapitre 19. Si vous avez vraiment besoin de connaître le nombre de caractères d'un fichier, vous devez serrer les dents et écrire quelque chose comme ceci. Ou peut-être quelque chose de plus efficace. Il existe cependant deux normes de facto pour les threads utilisateur. Malheureusement, nous n'avons pas eu le temps de résoudre toutes les questions soulevées par son projet afin de l'inclure dans la norme linguistique.

#inclure

#inclure

#inclure

struct mastruct (

longtemps je ;

char buf[255];

double d ;

} ;

int principal()

const char * FName = "d:\\txt" ; //Chemin d'accès au fichier. Entrez le vôtre.

mastruct X ;

//memset(&ms,0,taillede ms); //vous pouvez initialiser les éléments de structure avec des zéros comme ceci

X. je = 10 ; //écrit la valeur dans le champ i

X. d = 2 ; //écrit la valeur dans le champ d

Un fichier dans une hiérarchie de dossiers. Dans le shell interactif, entrez ce qui suit. Ces chaînes seront transmises à plusieurs fonctions liées aux fichiers présentées dans ce chapitre. Par exemple, l'exemple suivant concatène les noms d'une liste de noms de fichiers à la fin du nom de dossier. Tous les noms de fichiers ou chemins d'accès qui ne commencent pas par le dossier racine sont supposés se trouver dans le répertoire de travail actuel. Bien que dossier soit un nom plus moderne pour un répertoire, notez que le répertoire de travail actuel est le terme standard et non le dossier de travail actuel.

dans. fermer();

cout<< X . buf << "\n" ; //Sort la valeur du champ de structure. C'est égal au site

renvoie 0 ;

Je ne peux pas très bien expliquer la ligne avec l’entrée dans le fichier. Cette syntaxe est plus facile à retenir, l'essentiel est que le premier paramètre utilise un pointeur vers char, c'est pourquoi le transtypage vers un tel pointeur est utilisé, et après la virgule vient le deuxième paramètre. Le deuxième paramètre spécifie la taille à utiliser pour écrire dans le fichier. Ceux qui sont familiers avec le casting de caractères devraient comprendre ce qui se passe ; ceux qui ne le connaissent pas devraient s'y habituer. La compréhension viendra.

Lecture à partir d'un fichier

Il existe deux manières de spécifier le chemin du fichier.

  • Un chemin absolu qui commence toujours au dossier racine.
  • Un chemin relatif qui fait référence au répertoire de travail actuel du programme.
Il existe également des dossiers point et point. Ce ne sont pas de véritables dossiers, mais des noms spéciaux qui peuvent être utilisés dans le chemin. Un point pour le nom du dossier est une abréviation de « ce répertoire ». Deux points signifient « dossier parent ».

Gestion des chemins absolus et relatifs

Si startup n'est pas spécifié, le répertoire de travail actuel est utilisé comme chemin de départ. Il s'agit d'un moyen simple de convertir un chemin relatif en chemin absolu. . Essayez ces fonctions dans un shell interactif. Étant donné que votre système contient probablement des fichiers et des dossiers différents du mien, vous ne pourrez pas suivre exactement tous les exemples de ce chapitre. Essayez cependant de le suivre en utilisant les dossiers qui existent sur votre ordinateur.

  • (char*)&X -> Notation peu pratique. Il faut le lire de droite à gauche. Adresse du bâtiment X Un pointeur vers char est converti en type. Ceci est nécessaire pour indiquer la méthode écrire (lire) l'adresse de la structure sous la forme dont elle a besoin. Lisez attentivement de droite à gauche, la seule chose : &X = adresse de la structure X, et gardez à l’esprit que ce type de relecture est souvent pratique lorsque vous travaillez avec des pointeurs.

Voici un exemple d'écriture d'une structure dans un fichier et de lecture des données du fichier dans la structure pour les débutants. Cet exemple est relativement simple. La principale chose à comprendre est que lorsque vous ouvrez un fichier pour traitement, vous devez le fermer après traitement. Lorsque vous lisez ou écrivez une structure à partir d'un fichier à l'aide de l'algorithme décrit, vous devez convertir l'adresse de la structure en un pointeur vers le type char et signaler la taille de la structure. Il ne faut pas oublier que les pointeurs : « Merde complexe » et leur utilisation peuvent soit être trompeurs, soit vous obliger à écrire du code plus complexe. Je souhaite également attirer une fois de plus votre attention sur le fait que vous ne pouvez pas attribuer une chaîne à un tableau de caractères et que pour y écrire une valeur, vous devez utiliser des techniques de copie.

Rechercher des fichiers et le contenu des dossiers

Le nom de base suit la dernière barre oblique du chemin et est identique au nom de fichier. Par exemple, entrez dans un shell interactif. Une fois que vous savez gérer les chemins de fichiers, vous pouvez commencer à collecter des informations sur des fichiers et des dossiers spécifiques. Une fois que vous serez à l'aise avec les dossiers et les chemins relatifs, vous pourrez spécifier les emplacements de fichiers pour la lecture et l'écriture. Les fonctions décrites dans les prochaines sections s'appliqueront aux fichiers en texte brut. Vos programmes peuvent facilement lire le contenu des fichiers en texte brut et les traiter comme une valeur de chaîne normale.

L'article a été entièrement réécrit le 7 janvier 2014.

    Si vous voyez des articles similaires, mais avec des pointeurs, sachez qu'ils sont faux et que je dois les corriger. Merci de les signaler. Je ne peux pas tout suivre moi-même, mais je ne veux pas non plus induire en erreur

La plupart des programmes informatiques fonctionnent avec des fichiers et il est donc nécessaire de créer, supprimer, écrire, lire et ouvrir des fichiers. Qu'est-ce qu'un fichier ? Un fichier est un ensemble nommé d'octets qui peuvent être stockés sur un périphérique de stockage. Eh bien, il est maintenant clair qu'un fichier désigne une certaine séquence d'octets qui a son propre nom unique, par exemple file.txt. Les fichiers portant les mêmes noms ne peuvent pas se trouver dans le même répertoire. Le nom du fichier fait référence non seulement à son nom, mais aussi à son extension, par exemple : fichier.txt et fichier.dat fichiers différents, bien qu'ils portent les mêmes noms. Il existe un nom de fichier complet - il s'agit de l'adresse complète du répertoire de fichiers indiquant le nom du fichier, par exemple : D:\docs\file.txt. Il est important de comprendre ces concepts de base, sinon il sera difficile de travailler avec des fichiers.

Étant donné que chaque type de fichier binaire doit être traité différemment, ce livre ne lira ni n'écrira directement les fichiers binaires bruts. Heureusement, de nombreux modules facilitent le travail avec les fichiers binaires ; vous en apprendrez un, le module Shelf, plus loin dans ce chapitre.

Ces deux commandes ouvriront le fichier en mode « lecture de texte brut », ou en mode lecture pour faire court. Alors ouvert et ouvert font la même chose. Assurez-vous de séparer les quatre lignes par des sauts de ligne. Entrez ensuite ce qui suit dans le shell interactif.

Pour travailler avec des fichiers, vous devez inclure un fichier d'en-tête . DANS plusieurs classes sont définies et les fichiers d'en-tête sont inclus entrée de fichier et sortie de fichier.

Les E/S de fichier sont similaires aux E/S standard, la seule différence est que les E/S sont effectuées vers un fichier plutôt que vers l'écran. Si les E/S vers les périphériques standard sont effectuées à l'aide des objets cin et cout, alors pour organiser les E/S sur les fichiers, il suffit de créer vos propres objets qui peuvent être utilisés de la même manière que les opérateurs cin et cout.

Il est souvent plus facile de travailler avec une liste de chaînes qu'avec une seule grande valeur de chaîne. Cependant, vous ne pouvez pas écrire dans un fichier que vous avez ouvert en mode lecture. Le mode écriture écrasera le fichier existant et repartira de zéro, tout comme écraser la valeur d'une variable par une nouvelle valeur. D'un autre côté, le mode Ajouter ajoutera du texte à la fin du fichier existant. Vous pouvez considérer cela comme un ajout à une liste dans une variable, plutôt que comme un remplacement de la variable.

Combinons ces concepts. Pour ajouter du texte au contenu existant d'un fichier au lieu de remplacer la ligne que nous venons d'écrire, nous ouvrons le fichier en mode ajout. Nous écrivons : « Le bacon n’est pas un légume. » au fichier et fermez-le. Vous devrez ajouter ce personnage vous-même.

Par exemple, vous devez créer un fichier texte et y écrire la ligne Travailler avec des fichiers en C++. Pour ce faire, vous devez suivre les étapes suivantes :

  1. créer un objet de classe ofstream ;
  2. associer un objet de classe au fichier dans lequel écrire ;
  3. écrire une ligne dans un fichier ;
  4. fermez le fichier.

Pourquoi est-il nécessaire de créer un objet ofstream plutôt qu'un objet ifstream ? Parce que vous devez écrire dans un fichier et si vous devez lire des données à partir d'un fichier, un objet de classe ifstream sera créé.

Stockage de variables à l'aide du module Shelf

De cette façon, votre programme peut récupérer les données des variables du disque dur. Le module étagère vous permettra d'ajouter des fonctionnalités Enregistrer et Ouvrir à votre programme. Par exemple, si vous avez démarré un programme et saisi certains paramètres de configuration, vous pouvez enregistrer ces paramètres dans un fichier étagère, puis charger le programme la prochaine fois que vous le démarrerez. Pour lire et écrire des données à l'aide du module étagère, importez d'abord l'étagère. Vous pouvez apporter des modifications à la valeur de conservation comme s'il s'agissait d'un dictionnaire.

// crée un objet pour écrire dans le fichier ofstream /*nom de l'objet*/; // objet de la classe ofstream

Appelons l'objet fout. Voici ce que nous obtenons :

Ofstream fout;

Pourquoi avons-nous besoin d’un objet ? L'objet doit pouvoir écrire dans un fichier. L'objet a déjà été créé, mais n'est pas associé au fichier dans lequel la chaîne doit être écrite.

Fout.open("cppstudio.txt"); // associe l'objet au fichier

Ici, notre valeur de conservation est stockée en étagère. Ces fichiers binaires contiennent les données stockées sur l'étagère. Le format de ces binaires n'est pas important ; il vous suffit de savoir ce que fait le module d'étagère, pas comment il le fait. Le module vous libère du souci de savoir comment stocker les données de votre programme dans un fichier.

Vos programmes peuvent utiliser le module étagère pour rouvrir et extraire ultérieurement les données de ces fichiers étagère. Les valeurs d'étagère ne doivent pas nécessairement être ouvertes en mode lecture ou écriture - elles peuvent être exécutées une seule fois lors de leur ouverture. Ici, nous ouvrons les fichiers d'étagère pour vérifier que nos données sont correctement enregistrées.

Grâce à l'opération point, nous accédons à la méthode de classe open(), dans laquelle nous indiquons le nom du fichier entre parenthèses. Le fichier spécifié sera créé dans le répertoire courant avec le programme. Si un fichier du même nom existe, le fichier existant sera remplacé par le nouveau. Ainsi, le fichier est ouvert, il ne reste plus qu'à y écrire la ligne souhaitée. Cela se fait comme ceci :

Fout<< "Работа с файлами в С++"; // запись строки в файл

Supposons que vous ayez un dictionnaire stocké dans une variable et que vous souhaitiez enregistrer cette variable et son contenu pour une utilisation ultérieure. Ce fichier sera votre propre module que vous pourrez importer chaque fois que vous souhaitez utiliser une variable qui y est stockée. Nous avons une liste de dictionnaires stockés dans des chats variables.

Vous pouvez ensuite importer ces fichiers dans des scripts. Cependant, pour la plupart des applications, le stockage des données à l'aide d'un module étagère est le moyen privilégié pour stocker les variables dans un fichier. Seuls les types de données de base tels que les entiers, les flottants, les chaînes, les listes et les dictionnaires peuvent être écrits dans un fichier sous forme de texte brut.

En utilisant l'opération stream en conjonction avec l'objet fout, la chaîne Working with files in C++ est écrite dans un fichier. Puisqu'il n'est plus nécessaire de modifier le contenu du fichier, celui-ci doit être fermé, c'est-à-dire que l'objet doit être séparé du fichier.

Fout.close(); // ferme le fichier

Résultat - un fichier a été créé avec la ligne Working with files in C++.

Les étapes 1 et 2 peuvent être combinées, c'est-à-dire sur une seule ligne, créer un objet et l'associer à un fichier. Cela se fait comme ceci :

Projet : Générer des fichiers de quiz aléatoires

Les objets fichier, par exemple, ne peuvent pas être codés sous forme de texte. Hélas, votre classe contient des œufs pourris et vous ne pouvez pas faire confiance aux élèves pour ne pas tricher. Vous souhaitez randomiser l'ordre des questions afin que chaque quiz soit unique, empêchant quiconque de donner des réponses à quelqu'un d'autre. Bien sûr, faire cela manuellement serait long et ennuyeux.

C'est ce que fait le programme. Génère 50 questions à choix multiples pour chaque quiz dans un ordre aléatoire. Fournit la bonne réponse et trois réponses incorrectes aléatoires pour chaque question dans un ordre aléatoire.

  • Écrit des quiz dans 35 fichiers texte.
  • Écrit les corrigés de 35 fichiers texte.
Cela signifie que le code devra faire ce qui suit.

Ofstream fout("cppstudio.txt"); // crée un objet de la classe ofstream et l'associe au fichier cppstudio.txt

Combinons tout le code et obtenons le programme suivant.

// file.cpp : Définit le point d'entrée de l'application console. #include "stdafx.h" #include en utilisant l'espace de noms std ; int main(int argc, char* argv) ( ofstream fout("cppstudio.txt"); // crée un objet de la classe ofstream pour l'enregistrement et l'associe au fichier cppstudio.txt fout<< "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

Stocker les données d'enquête dans un dictionnaire

Stockez les états et leurs capitales dans un dictionnaire. . La première étape consiste à créer un script squelette et à le remplir avec vos données d'enquête. Étant donné que ce programme ordonnera les questions et réponses de manière aléatoire, vous devrez importer un module aléatoire ❶ pour utiliser ses fonctions.

Créez un fichier de quiz et mélangez la requête

Le code dans la boucle se répétera 35 fois - une fois pour chaque quiz - vous n'aurez donc à vous soucier que d'un quiz à la fois dans la boucle. Tout d’abord, vous allez créer le fichier de quiz proprement dit. Il doit avoir un nom de fichier unique et doit également contenir une sorte d'en-tête standard, avec des espaces permettant à l'étudiant de remplir le nom, la date et la période de cours. Vous devrez ensuite obtenir une liste d’états dans un ordre aléatoire, qui pourra être utilisée ultérieurement pour créer des questions et des réponses pour le quiz.

Reste à vérifier que le programme fonctionne correctement, et pour cela, ouvrez le fichier cppstudio.txt et regardez son contenu, ça devrait être - Travailler avec des fichiers en C++.

  1. créer un objet de la classe ifstream et l'associer au fichier à partir duquel la lecture sera effectuée ;
  2. lire le fichier ;
  3. fermez le fichier.
#inclure en utilisant l'espace de noms std ; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // affichage correct du caractère cyrillique buff; // tampon de stockage intermédiaire du texte lu dans un fichier ifstream fin("cppstudio.txt") ; // fichier ouvert pour lire fin >><< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

Le programme montre deux façons de lire à partir d'un fichier, la première utilise l'opération de transfert vers un flux, la seconde utilise la fonction obtenir la ligne() . Dans le premier cas, seul le premier mot est lu, et dans le second cas, une chaîne de 50 caractères est lue. Mais comme il reste moins de 50 caractères dans le fichier, les caractères jusqu'au dernier inclus sont lus. Veuillez noter que lire une deuxième fois (ligne 17) a continué après le premier mot, et non depuis le début, puisque le premier mot a été lu dansligne 14. Le résultat du programme est présenté dans la figure 1.

Étape 3 : Créer des paramètres de réponse

Vous devrez créer une autre boucle – celle-ci – pour générer du contenu pour chacune des 50 questions du quiz. Il y aura ensuite un troisième élément à insérer à l’intérieur pour générer des options à choix multiples pour chaque question. Faites votre code comme suit. Cette boucle parcourra les états de la liste des états mélangés, d'état en état, trouvera chaque état dans les majuscules et stockera la capitale correspondante de cet état dans la bonne réponse. La liste des mauvaises réponses possibles est plus complexe.

Travailler avec des fichiers en C++ Pour continuer, appuyez sur n'importe quelle touche. . .

Figure 1 - Utilisation de fichiers en C++

Le programme a fonctionné correctement, mais cela n'arrive pas toujours, même si tout est en ordre avec le code. Par exemple, le nom d'un fichier inexistant a été transmis au programme ou il y a eu une erreur dans le nom. Et alors ? Dans ce cas, il ne se passera rien du tout. Le fichier ne sera pas trouvé, ce qui signifie qu'il ne sera pas possible de le lire. Par conséquent, le compilateur ignorera les lignes où le travail est effectué sur le fichier. En conséquence, le programme se fermera correctement, mais rien ne s'affichera à l'écran. Il semblerait que ce soit une réaction tout à fait normale face à une telle situation. Mais un simple utilisateur ne comprendra pas ce qui se passe et pourquoi la ligne du fichier n'apparaît pas à l'écran. Donc, pour que tout soit très clair, C++ fournit une telle fonction - is_open(), qui renvoie des valeurs entières : 1 - si le fichier a été ouvert avec succès, 0 - si le fichier n'a pas été ouvert. Modifions le programme en ouvrant un fichier, de sorte que si le fichier n'est pas ouvert, un message correspondant s'affiche.

// file_read.cpp : Définit le point d'entrée de l'application console. #include "stdafx.h" #include #inclure en utilisant l'espace de noms std ; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // affichage correct du caractère cyrillique buff; // tampon de stockage intermédiaire du texte lu dans un fichier ifstream fin("cppstudio.doc") ; // ( VOUS ENTREZ UN NOM DE FICHIER INVALIDE) if (!fin.is_open()) // si le fichier n'est pas ouvert cout<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >> chamois ; // compte le premier mot du fichier cout<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

Le résultat du programme est présenté dans la figure 2.

Le fichier ne peut pas être ouvert ! Pour continuer, appuyez sur n'importe quelle touche. . .

Figure 2 - Travailler avec des fichiers en C++

Comme le montre la figure 2, le programme a signalé qu'il était impossible d'ouvrir le fichier. Par conséquent, si le programme fonctionne avec des fichiers, il est recommandé d'utiliser cette fonction, is_open(), même si vous êtes sûr que le fichier existe.

Modes d'ouverture de fichiers

Les modes d'ouverture de fichiers déterminent la manière dont les fichiers sont utilisés. Pour définir le mode, la classe ios_base fournit des constantes qui déterminent le mode d'ouverture du fichier (voir Tableau 1).

Les modes d'ouverture de fichiers peuvent être définis directement lors de la création d'un objet ou lors de l'appel de la fonction open() .

Ofstream fout("cppstudio.txt", ios_base::app); // ouvre le fichier pour ajouter des informations à la fin du fichier fout.open("cppstudio.txt", ios_base::app); // ouvre le fichier pour ajouter des informations à la fin du fichier

Les modes d'ouverture de fichiers peuvent être combinés à l'aide d'une opération logique au niveau du bit ou| , par exemple : ios_base::out | ios_base::trunc - ouvre un fichier en écriture après l'avoir effacé.

Les objets de la classe ofstream, lorsqu'ils sont associés à des fichiers, contiennent par défaut des modes d'ouverture de fichiers ios_base::out | ios_base ::trunc . Autrement dit, le fichier sera créé s'il n'existe pas. Si le fichier existe, son contenu sera supprimé et le fichier lui-même sera prêt à être écrit. Les objets de la classe ifstream, lorsqu'ils sont associés à un fichier, ont le mode d'ouverture de fichier par défaut ios_base::in - le fichier est ouvert en lecture seule. Le mode d'ouverture du fichier est également appelé drapeau ; pour des raisons de lisibilité, nous utiliserons ce terme à l'avenir. Le tableau 1 ne répertorie pas tous les indicateurs, mais ceux-ci devraient suffire pour vous aider à démarrer.

Notez que les indicateurs ate et app ont une description très similaire, ils déplacent tous deux le pointeur vers la fin du fichier, mais l'indicateur app permet uniquement d'écrire jusqu'à la fin du fichier, et l'indicateur ate déplace simplement le drapeau vers la fin. du fichier et ne limite pas où écrire.

Développons un programme qui, à l'aide de l'opération sizeof(), calculera les caractéristiques des principaux types de données en C++ et les écrira dans un fichier. Caractéristiques:

  1. nombre d'octets alloués au type de données
  2. la valeur maximale qu'un type de données particulier peut stocker.

L'écriture dans un fichier doit être effectuée au format suivant :

/* type de données octet valeur maximale bool = 1 255,00 char = 1 255,00 short int = 2 32767,00 unsigned short int = 2 65535,00 int = 4 2147483647,00 unsigned int = 4 4294967295,00 long int = 4 ,00 non signé long int = 4 4294967295.00 flotteur = 4 2147483647.00 flotteur long = 8 9223372036854775800.00 double = 8 9223372036854775800.00 */

Un tel programme a déjà été développé plus tôt dans la section, mais là, toutes les informations sur les types de données ont été sorties sur le périphérique de sortie standard, et nous devons refaire le programme pour que les informations soient écrites dans un fichier. Pour ce faire, vous devez ouvrir le fichier en mode écriture, avec troncature préalable des informations du fichier actuel ( ligne 14). Une fois le fichier créé et ouvert avec succès (lignes 16 à 20), au lieu de l'instruction cout, dans ligne 22 nous utilisons l'objet fout. ainsi, au lieu de l'écran, les informations sur les types de données seront écrites dans un fichier.

// write_file.cpp : Définit le point d'entrée de l'application console. #include "stdafx.h" #include #inclure // travailler avec des fichiers #include // manipulateurs d'entrée/sortie utilisant l'espace de noms std ; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // associe l'objet au fichier et ouvre le fichier en mode écriture, en supprimant d'abord toutes les données ofstream fout("data_types.txt ", ios_base::out | ios_base::trunc); if (!fout.is_open()) // si le fichier n'a pas été ouvert ( cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value "<< endl // en-têtes de colonnes <<"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout << "Данные успешно записаны в файл data_types.txt\n"; system("pause"); return 0; }

Il est impossible de ne pas remarquer que les changements dans le programme sont minimes, et tout cela grâce au fait que les entrées/sorties standard et les entrées/sorties de fichiers sont utilisées exactement de la même manière. A la fin du programme, àligne 45Nous avons explicitement fermé le fichier, bien que cela ne soit pas nécessaire, mais que cela soit considéré comme une bonne pratique de programmation. Il convient de noter que toutes les fonctions et manipulateurs utilisés pour formater les entrées/sorties standard sont également pertinents pour les entrées/sorties de fichiers. Par conséquent, aucune erreur ne s'est produite lorsque l'instruction cout a été remplacé par un objet fout.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :