C travaillant avec des fichiers, créez un fichier. Exemples d'écriture et de lecture à partir d'un fichier. Classe fstream : accès aléatoire aux fichiers

Travailler avec des fichiers texte en C++.

Il existe deux principaux types de fichiers : texte et binaire. Les fichiers permettent à l'utilisateur de lire de grandes quantités de données directement à partir du disque sans avoir à les saisir au clavier.

    Texte les fichiers composés de n'importe quel caractère sont appelés. Ils sont organisés en lignes, chacune se terminant par un caractère de fin de ligne. La fin du fichier lui-même est indiquée par le symbole « fin de fichier ». Lors de l'enregistrement d'informations dans fichier texte, qui peut être visualisé à l'aide de n'importe quel éditeur de texte ; toutes les données sont converties en type de caractère et stockées sous forme de caractères.

    Créez un nouveau fichier et ajoutez-le à l'espace de travail

    Si l'utilisateur a soumis le formulaire avec ce qui suit. Chacun de ces types de fichiers peut également être ajouté à l'espace de travail. Il fonctionne généralement de la même manière que les fichiers sources classiques, mais prend en charge protection supplémentaire cryptage.

    • Fichiers sources.
    • Fichiers d'en-tête.
    • Les fichiers d'en-tête portent l'extension .
    • Fichiers texte.
    • Les fichiers texte peuvent être utilisés pour documenter des notes.
    • Il y en a deux type spécial fichiers texte.
    Lors de la création d'un nouveau fichier source, vous avez la possibilité d'ajouter le fichier à l'espace de travail actuel.

    DANS binaire Dans les fichiers, les informations sont lues et écrites sous forme de blocs d'une certaine taille, dans lesquels des données de tout type et de toute structure peuvent être stockées.

Pour travailler avec des fichiers, spécial types de données, appelé flux. Couler ifstream est utilisé pour travailler avec des fichiers en mode lecture, et de flux en mode enregistrement. Pour travailler avec des fichiers en mode écriture et lecture, un flux est utilisé fstream.

classe ifstream : lecture de fichiers

Vous avez également la possibilité de créer un nouveau fichier source avec un contenu par défaut. Si vous cochez la case "Remplir par défaut", un nouveau fichier source sera créé avec le texte suivant. Pour chaque fonction, la section d'aide affiche le fichier d'en-tête dans lequel la fonction est prototypée. Lors de la création d'un fichier, vous pouvez spécifier un dossier par défaut ou un dossier personnalisé.

Configuration d'un modèle de fichier source

Ce choix est organisationnel car vous pouvez toujours préciser un chemin lors du référencement de ces fichiers dans votre code. Lorsque vous créez un nouveau fichier source, le " Nouveau fichier» La case à cocher Remplir le contenu par défaut apparaît. Vous pouvez ouvrir, modifier et enregistrer ce fichier modèle pour personnaliser le contenu des nouveaux fichiers source par défaut.

Création d'un fichier source chiffré

Entrer Nouveau mot de passe et confirmez le mot de passe saisi. Boîte de dialogue Mot de passe.

Dans les programmes C++, lorsque vous travaillez avec des fichiers texte, vous devez inclure les bibliothèques iostream et fstream.

Pour enregistrer données dans un fichier texte, vous avez besoin de :

    décrire une variable de type ofstream.

    afficher les informations dans un fichier.

    assurez-vous de fermer le fichier.

Pour en lisant les données d'un fichier texte, vous avez besoin de :

Chiffrer le fichier source existant





Vous pouvez cocher la case « Mémoriser le mot de passe » pour mémoriser votre mot de passe pendant 30 jours. Sélectionnez le menu Fichier : Enregistrer comme crypté et entrez un nom de fichier pour créer une copie cryptée. code source.

Pour changer le mot de passe d'un fichier crypté existant

Ouvrez un fichier existant et ajoutez-le à l'espace de travail. L'ajout de fichiers à l'espace de travail fournit les avantages suivants programmation.

    décrire une variable de type ifstream.

    ouvrez un fichier à l'aide de la fonction open.

    fermez le fichier.

Enregistrer informations dans un fichier texte

    Comme mentionné précédemment, pour commencer à travailler avec un fichier texte, vous devez décrire type de variable du flux. Par exemple, comme ceci :

    Une variable F sera créée pour écrire des informations dans le fichier.

    Ouvrir un fichier existant sans l'ajouter à l'espace de travail

    Les fichiers ajoutés à l'espace de travail apparaissent sous forme d'icônes dans les dossiers de la fenêtre zone de travail. Seuls les fichiers sources ajoutés à l'espace de travail peuvent être compilés. Si vous avez des fonctions codées dans des fichiers source distincts, mais que les fichiers sources font partie du même fichier d'espace de travail, vous pouvez charger et créer le fichier d'espace de travail par programme et appeler les fonctions.

    Ajout de fichiers ouverts à l'espace de travail

    Spécification des fichiers d'espace de travail en tant que packages. Utilisateur temporaire ou fichiers personnalisés. Chacun des six dossiers prédéfinis contient des fichiers ajoutés à l'espace de travail de diverses manières.

    A l'étape suivante, le fichier doit être ouvert en écriture. DANS cas général l'opérateur d'ouverture du flux ressemblera à :

F.open("fichier", mode);

Ici F est une variable décrite comme ofstream,

déposer - nom et prénom fichier sur disque

mode - mode de travail avec le fichier en cours d'ouverture.

Veuillez noter que lorsque vous spécifiez le nom complet du fichier, vous devez utiliser une double barre oblique. Par exemple, le nom complet du fichier noobs.txt situé dans dossier du jeu sur le lecteur D :, vous devrez écrire ceci :

Rechercher des fichiers contenant une chaîne de caractères spécifiée

Les fichiers des six dossiers peuvent être déplacés en les faisant glisser vers n'importe quel autre dossier, mais les fichiers ne peuvent pas être déplacés vers dossier temporaire. Chaque dossier de package contient un sous-dossier nommé " Fichiers utilisateur", qui contient les fichiers situés dans le dossier User Files. Dans la section Navigation dans l'espace de travail à l'aide de l'arborescence de l'espace de travail. Entrez la chaîne de recherche souhaitée dans la zone de liste déroulante Rechercher.

Classe fstream : accès aléatoire aux fichiers

Pour limiter la recherche aux instances d'une chaîne qui sont des mots entiers, sélectionnez Correspondances de mots entiers uniquement. Mot complet est une ligne entourée d'espace ou de ponctuation, sauf si la ligne apparaît au début ou à la fin d'une ligne. Pour inclure des sous-dossiers dans votre recherche, sélectionnez Rechercher des sous-dossiers. . La ligne contenant la chaîne de recherche sera marquée.

D:\\jeu\\noobs.txt.

Le fichier peut être ouvert dans l'un des modes suivants :

ios::in - ouvre le fichier en mode lecture de données, ce mode est le mode par défaut pour ifstreams ;

ios::out - ouvre un fichier en mode écriture de données (dans ce cas, les informations sur le fichier existant sont détruites), ce mode est le mode par défaut pour ofstreams ;

Navigation dans les fichiers à l'aide de l'arborescence de l'espace de travail

Après avoir compilé les fonctions dans fichier source vous pouvez afficher les définitions de fonctions, les déclarations de fonctions, les classes, les structures et les définitions de types rencontrées au moment de la compilation dans l'arborescence de l'espace de travail. Vous pouvez ensuite développer le nœud de l'arborescence dans l'espace de travail pour une définition de fonction, une déclaration de fonction, une classe, une structure ou une définition de type afin d'ouvrir le fichier source.

Suppression de fichiers de l'espace de travail

Les fichiers qui ont été ajoutés à l'espace de travail sont associés à des icônes dans la fenêtre de l'espace de travail.

Exclusion de fichiers de l'espace de travail

Nous ajouterons ensuite une fonctionnalité permettant de lire le fichier spécifié dans l'argument de ligne de commande du nom de fichier. Le listing 12-3 contient un poème d'Emily Dickinson qui fonctionnerait bien ! Et puis nous sommes quelques-uns – ne le dites pas ! Aussi publiquement qu'une grenouille, Pour dire son nom le jour Avant d'admirer le marais !

ios::app - ouvre le fichier en mode d'écriture des données jusqu'à la fin du fichier ;

ios::ate - passer à la fin d'un fichier déjà ouvert ;

ios::trunc - efface le fichier, cela se produit également en mode ios::out ;

ios::nocreate - n'ouvre pas un fichier s'il n'existe pas ;

ios :: noreplace - ne pas ouvrir fichier existant.

Le paramètre mode peut être absent, auquel cas le fichier est ouvert dans le mode par défaut pour ce flux.

Encart 12-3 : Poème Je ne suis personne ! Qui es-tu? Emily Dickinson qui fera bon essai. Listing 12-4 : Lecture du contenu d'un fichier, indiqué deuxième argument. Celui-ci contiendra le contenu du fichier après sa lecture. Notre code lit et imprime le contenu du fichier. La fonction principale comporte de nombreuses responsabilités ; Les fonctions sont généralement plus claires et plus faciles à maintenir si chaque fonction n'est responsable que d'une seule idée. Un autre problème est que nous ne gérons pas les erreurs, et il peut aussi y en avoir. Bien que notre programme soit encore modeste, ces lacunes ne sont pas gros problème, mais à mesure que notre programme se développe, il sera plus difficile de les corriger.

Après une ouverture réussie du fichier (dans n'importe quel mode), la variable F stockera vrai, sinon faux. Cela vous permettra de vérifier l'exactitude de l'opération d'ouverture du fichier.

Ouvrir le fichier (comme prenons un exemple fichier D:\\game\\noobs.txt) en mode enregistrement en utilisant l'une des méthodes suivantes :

// d'abord chemin

du flux F ;

F.open("D:\\game\\noobs.txt", ios::out);

Une bonne pratique consiste à commencer la refactorisation à stade précoce lors du développement d'un programme, car il est beaucoup plus facile de refactoriser de plus petites quantités de code, nous allons donc le faire maintenant. Attention : il y en a un de plus paramètre facultatif, mais nous ne nous intéressons qu’à ces trois premiers.

Peut être utilisé valeurs suivantes. Vous devez donc définir la constante que vous souhaitez utiliser. Étant donné que les fichiers ne sont rien d'autre qu'une séquence non structurée de caractères uniques, le type de données traitées n'a pas d'importance.

Ce n'est que grâce au traitement des données que les symboles individuels acquièrent une signification et une structure. Vous devez d’abord ouvrir un simple fichier texte pour le lire. Dans ce cas, procédez comme suit. La spécification du chemin autorise chaque chaîne valide. Utilisez mode pour spécifier comment le flux est accessible.

  • Buffer - adresse de départ, pointeur actuel, taille.
  • Descripteur de fichier.
  • Lire ou écrire la position du pointeur.
Bien entendu, vous pouvez également ouvrir plusieurs fichiers à la fois.

//deuxième méthode, le mode ios::out est le mode par défaut

// Pour coulerde flux

du flux F ;

//la troisième méthode combine la description de la variable et le type du flux

// et ouverture du fichier en une seule instruction

ofstream F("D:\\game\\noobs.txt", ios::out);

Après avoir ouvert un fichier en mode écriture, un fichier vide sera créé dans lequel vous pourrez écrire des informations.

Ensuite, le premier argument doit contenir ce qui suit. Il existe d'autres différences entre les deux systèmes d'exploitation. Outre l'accès en lecture que vous avez déjà utilisé, il existe plusieurs autres moyens d'accéder au flux. Le tableau 3 donne un aperçu régimes existants et leur signification.

Opérateurs d’inclusion et d’extraction

Pour utiliser ce livre comme informations de référence, le tableau 4 montre davantage examen rapide chaque mode. Vous pouvez également joindre deux caractères supplémentairesà ces modes, qui distinguent le texte et fichiers binaires. Permettez-moi d'expliquer brièvement la différence entre les fichiers texte et les fichiers binaires : les fichiers texte sont lisibles par les humains à l'aide d'un éditeur, tandis que les fichiers binaires ou les caractères binaires forment un langage qu'un ordinateur comprend. Pour les humains, les fichiers binaires sont à peine distinguables.

Si vous souhaitez ouvrir un fichier existant en mode écriture en premier, vous devez utiliser ios::app comme mode.

Après avoir ouvert un fichier en mode enregistrement, vous pouvez y écrire de la même manière que sur l'écran, uniquement à la place du périphérique de sortie standardcoutvous devez préciser le nom du fichier ouvert.

Par exemple, pour écrire la variable a dans le flux F, l'instruction de sortie ressemblera à :

En mode binaire, cette conversion n'est pas effectuée. Bien entendu, vous pouvez également spécifier le nom du fichier à ouvrir à l’aide d’arguments de ligne de commande. Tout d'abord, il vérifie si deux arguments ont été saisis dans ligne de commande. Si ce n'est pas le cas, un message d'erreur approprié s'affiche. Sinon, une tentative sera faite pour ouvrir le fichier spécifié sur la ligne de commande avec le deuxième argument. Si une erreur se produit, elle est généralement due à une spécification de chemin incorrecte ou à des autorisations de fichier inadéquates.

Cette constante détermine combien de fichiers peuvent être ouverts simultanément par processus. Ne vous inquiétez pas si vous n'avez pas encore compris ces points, vous serez autorisé à le faire. pages suivantes. L'exemple suivant montre comment configurer et joindre un fichier texte.

Pour une sortie séquentielle vers le flux G de variables b, c, d, l'opérateur de sortie deviendra comme ceci :

G<

La fermeture d'un flux se fait à l'aide de l'opérateur :

EXEMPLE:

Créez un fichier texte D:\\game\\noobs.txt et écrivez-y n nombres réels.

#include "stdafx.h"

#inclure

#inclure

#inclure

en utilisant l'espace de noms std ;

Ce fichier dit alors "Quand le désir disparaît, le désir de désir persiste." Son fonctionnement est expliqué rapidement. Mais comme on ne peut pas supposer que cerise sera un mot réservé à l'avenir, il peut également être écrit en minuscules. Toutes les opérations sur les fichiers, par ex. Cela change dans l’exemple suivant.

Exemples d'écriture et de lecture à partir d'un fichier

Peu importe le nombre de fois où le script est exécuté, l'aphorisme n'existe qu'une seule fois. Comment est lu un fichier texte ? Cela devrait ressembler à ceci. Andres Emann José Maria Aznar Felipe Gonzales Charles de Gaulle Louis Bonaparte. La dernière étape lit l'intégralité du fichier. Le script ne fonctionne que si chaque entrée est sur une ligne.

int principal()

setlocale(LC_ALL, "RUS");

int je, n;

doubler un;

//décrit un flux pour écrire des données dans un fichier

de flux f;

//ouvre le fichier en mode écriture,

//modeiOS:: dehorsinstallé par défaut

f.open("D:\\game\\noobs.txt", ios::out);

//entre le nombre de nombres réels

cout<<" n="; cin>> n;

La lecture du contenu d'un fichier à l'aide de l'opérateur Diamond, puis sa transmission dans un tableau est considérée comme lente. L'exemple suivant montre comment procéder plus rapidement. Il est très rare d'utiliser le caractère de nouvelle ligne utilisé par l'opérateur Diamond pour lire un fichier. Néanmoins, ce cas est envisageable. Par exemple, vous pourriez avoir quelque chose comme ça.

Ligne Andres Emann ligne Maria Martinez ligne Werner. Ligne Binsengrün Ligne Heinrich Mann Ligne Gottfried Keller. Ernst Weiss Ligne Robert Musil. L'écriture se fait entre ligne et ligne. Un autre symbole peut être défini dans ce contexte : il ressemble à ceci. Le chemin diffère selon le système d'exploitation. Si seul le nom du fichier est spécifié sans le chemin, le fichier sera recherché dans le même répertoire où se trouve le programme. Le paramètre mode spécifie dans quel mode le fichier doit être ouvert. Le mode détermine quelles opérations peuvent être effectuées sur le fichier : lecture, écriture ou les deux.

//boucle pour saisir des nombres réels

// et les écris dans un fichier

pour (i=0; je

cout<<"a=";

//entre un numéro

cin>>a;

f<

//ferme le flux

f.close();

système("pause");

renvoie 0 ;

_______________________________________________________________

Afin de lire les informations d'un fichier texte, vous devez décrire une variable comme ifstream. Après cela, vous devez ouvrir le fichier pour le lire à l'aide de l'opérateur ouvrir. Si la variable s'appelle F, alors les deux premières instructions ressembleront à ceci :

F.open("D:\\game\\noobs.txt", ios::in);

Après avoir ouvert un fichier en mode lecture, vous pouvez en lire les informations de la même manière qu'à partir du clavier, uniquement au lieu decinspécifiez le nom du flux à partir duquel les données seront lues.

Par exemple, pour lire le flux F dans la variable a, l'instruction d'entrée ressemblerait à ceci :

Deux nombres dans un éditeur de texte sont considérés comme séparés s'il y a au moins un des caractères entre eux : espace, tabulation, fin de ligne. C'est bien si le programmeur sait à l'avance combien et quelles valeurs stocker dans le fichier texte. Cependant, souvent le type de valeurs stockées dans le fichier est simplement connu, mais leur nombre peut varier. Pour résoudre ce problème, vous devez lire les valeurs du fichier une par une et avant chaque lecture, vérifier si la fin du fichier a été atteinte. Il y a une fonction pour ça F. eof().

Ici F est le nom du thread, la fonction renvoie une valeur booléenne : vrai ou faux, selon que la fin du fichier est atteinte. Par conséquent, une boucle pour lire le contenu du fichier entier peut être écrite comme ceci :

//organiser la lecture des valeurs d'un fichier, exécution

//la boucle se brisera lorsque nous arriverons à la fin du fichier,

//dans ce cas, F.eof() retournera true

tandis que (!F.eof())

EXEMPLE:

Le fichier texte D:\\game\\noobs.txt stocke les nombres réels, les affiche à l'écran et calcule leur nombre.

#include "stdafx.h"

#inclure

#inclure

#inclure

#inclure

en utilisant l'espace de noms std ;

int principal()

setlocale(LC_ALL, "RUS");

entier n=0 ;

flotter un;

fstream F ;

//ouvre le fichier en mode lecture

F.open("D:\\game\\noobs.txt");

//si le fichier a été ouvert correctement, alors

//boucle pour lire les valeurs d'un fichier ; l'exécution de la boucle sera interrompue,

//quand on atteint la fin du fichier, dans ce cas F.eof() retournera true.

tandis que (!F.eof())

//lecture de la valeur suivante du flux F dans la variable a

F>>a ;

//afficher la valeur de la variable a à l'écran

cout<

//augmenter le nombre de nombres lus

//ferme le flux

F.close();

//saisir à l'écran le nombre de nombres lus

cout<<"n="<

//si l'ouverture du fichier était incorrecte, alors la sortie

//messages sur l'absence d'un tel fichier

sinon cout<<" Файл не существует"<

système("pause");

renvoie 0 ;

C++. Traitement des fichiers binaires

Lors de l'écriture d'informations dans un fichier binaire, les caractères et les nombres sont écrits sous forme de séquence d'octets.

Pour écrire données dans un fichier binaire, vous avez besoin de :

    décrire une variable de fichier de type FAIL * à l'aide de l'opérateur FILE *filename ; Ici, le nom de fichier est le nom de la variable où le pointeur vers le fichier sera stocké.

    écrire des informations dans un fichier à l'aide de la fonction fwrite

Pour compter b données provenant d'un fichier binaire, il vous faut :

    décrire une variable de type FILE *

    ouvrir un fichier en utilisant la fonction fopen

    fermer un fichier en utilisant la fonction fclose

Fonctions de base requises pour travailler avec des fichiers binaires.

Pour ouvertures Le fichier est destiné à la fonction fopen.

FICHIER *fopen(const *nom de fichier, const char *mode)

Ici, filename est une chaîne qui stocke le nom complet du fichier en cours d'ouverture, mode est une chaîne qui détermine le mode de travail avec le fichier ; les valeurs suivantes sont possibles :

"rb" - ouvre le fichier binaire en mode lecture ;

« wb » - crée un fichier binaire pour l'enregistrement ; s'il existe, son contenu est effacé ;

"ab" - crée ou ouvre un fichier binaire à ajouter à la fin du fichier ;

« rb+ » - ouvre un fichier binaire existant en mode lecture-écriture ;

« wb+ » - ouvrez le fichier binaire en mode lecture-écriture, le fichier existant est effacé ;

"ab+" - un fichier binaire est ouvert ou créé pour corriger les informations existantes et ajouter de nouvelles informations à la fin du fichier.

La fonction renvoie NULL dans la variable de fichier f si le fichier ne s'ouvre pas. Après ouverture d'un fichier, son 0ème octet est disponible, le pointeur de fichier est 0 dont la valeur, au fur et à mesure de sa lecture ou de son écriture, est décalée du nombre d'octets lus (écrits). La valeur actuelle du pointeur de fichier est le numéro d'octet à partir duquel l'opération de lecture ou d'écriture aura lieu.

Pour clôture le fichier est destiné à la fonction fclose

int fclose(FILE *nom de fichier);

Renvoie 0 si le fichier a été fermé avec succès, NULL sinon.

La fonction de suppression est pour suppression fichiers.

int supprimer (const char *nom de fichier);

Cette fonction supprime un fichier nommé filenema du disque. Le fichier à supprimer doit être fermé. La fonction renvoie une valeur non nulle si le fichier n'a pas pu être supprimé.

Pour renommer fichiers, la fonction renommer est destinée à :

int rename(const char *ancien nom de fichier, const char *nouveau nom de fichier);

Le premier paramètre est l'ancien nom du fichier, le second est le nouveau. Renvoie 0 si le programme se termine avec succès.

En lisantà partir d'un fichier binaire se fait à l'aide de la fonction fread :

fread(void *ptr, taille, n, FILE *nom de fichier);

La fonction fread lit n éléments de taille taille du fichier nom de fichier dans un tableau ptr. La fonction renvoie le nombre d'éléments lus. Après la lecture d'un fichier, son pointeur est décalé de n*size octets.

Enregistrer vers un fichier binaire se fait à l'aide de la fonction fwrite :

fwrite(const void *ptr, taille, n, FILE *nom de fichier);

La fonction fwrite écrit dans le fichier filename à partir d'un tableau ptr de n éléments de taille size. La fonction renvoie le nombre d'éléments écrits. Après avoir écrit les informations dans le fichier, le pointeur est décalé de n*size octets.

Pour contrôle de fin de fichier il existe une fonction feof :

int feof(FILE *nom de fichier);

Il renvoie une valeur non nulle si la fin du fichier est atteinte.

EXEMPLE:

Créez un fichier binaire D:\\game\\noobs.dat et écrivez-y n nombres entiers et n nombres réels.

#include "stdafx.h"

#inclure

en utilisant l'espace de noms std ;

int principal()

setlocale(LC_ALL, "RUS");

int n, je;

doubler un;

//crée un fichier binaire en mode écriture

f=fopen("D:\\game\\noobs.dat", "wb");

// saisir Nombresn

cout<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//boucle pour saisir n nombres réels

pour (i=0; je

//entre le prochain nombre réel

cout<<"a=";

cin>>a;

// écriture d'un nombre réel dans un fichier binaire

fwrite(&a, sizeof(double), 1, f);

// fermer déposer

ffermer(f);

système("pause");

renvoie 0 ;

EXEMPLE:

Afficher le contenu du fichier binaire D:\\game\\noobs.dat créé lors de la tâche précédente

#include "stdafx.h"

#inclure

en utilisant l'espace de noms std ;

int principal()

setlocale(LC_ALL, "RUS");

int n, je;

double *a;

FICHIER *f; //décrit la variable du fichier

//ouvre le fichier binaire existant en mode lecture

// lit un entier du fichier dans la variable n

//sortie n à l'écran

cout<<"n="<

// allouer de la mémoire pour un tableau de n nombres

a=nouveau double[n] ;

//lire n nombres réels du fichier dans le tableau a

// affiche le tableau à l'écran

pour (i=0; je

cout<

cout<

// fermer déposer

ffermer(f);

système("pause");

renvoie 0 ;

Fichier binaire- structure de données séquentielle, après ouverture d'un fichier, le premier octet qui y est stocké est disponible. Vous pouvez écrire ou lire les données d'un fichier de manière séquentielle. Disons que vous devez compter le quinzième nombre, puis le premier. En utilisant l'accès séquentiel, cela peut être fait de la manière suivante :

int n, je;

doubler un;

FICHIER *f;

f=fopen("D:\\game\\noobs.dat", "rb");

pour (i=0; je<15; i++)

ffermer(f);

f=fopen("D:\\game\\noobs.dat", "rb");

fread(&a, taillede(double), 1, f);

ffermer(f);

Comme vous pouvez le constater, lire les nombres d’un fichier, puis rouvrir le fichier n’est pas le moyen le plus pratique. Il sera beaucoup plus pratique d'utiliser la fonction fseek pour déplacer le pointeur de fichier vers un octet donné.

int fseek(FILE *nom de fichier, décalage int long, origine int);

La fonction définit le pointeur de position actuel du fichier F conformément aux valeurs d'origine et de décalage. Le paramètre offset est égal au nombre d'octets dont le pointeur de fichier sera décalé par rapport à l'origine spécifiée par le paramètre origin. La valeur du paramètre origin doit être l'une des valeurs de décalage suivantes définies dans l'en-tête stdio.h :

SEEK_SET - depuis le début du fichier ;

SEEK_CUR - à partir de la position actuelle ;

SEEK_END - à partir de la fin du fichier.

La fonction renvoie une valeur nulle si l'opération a réussi, une valeur non nulle si le décalage a échoué.

La fonction fseek implémente en fait un accès direct à n'importe quelle valeur d'un fichier. Il vous suffit de connaître l'emplacement (numéro d'octet) de la valeur dans le fichier. Examinons l'utilisation de l'accès direct dans les fichiers binaires en utilisant le problème suivant comme exemple.

EXEMPLE

Dans le fichier binaire D:\\game\\noobs.dat créé précédemment, échangez les nombres réels les plus grands et les plus petits.

L'algorithme de résolution du problème comprend les étapes suivantes :

    lire les réels d'un fichier dans le tableau a.

    recherchez dans le tableau a les valeurs maximale (max) et minimale (min) et leurs nombres (imax, imin).

    déplacer le pointeur de fichier vers la valeur maximale et écrire min.

    déplacer le pointeur de fichier vers la valeur minimale et écrire max.

Vous trouverez ci-dessous le texte du programme pour résoudre le problème avec des commentaires.

#include "stdafx.h"

#inclure

en utilisant l'espace de noms std ;

int principal()

setlocale(LC_ALL, "RUS");

int n, je, imax, imin ;

double *a, max, min ;

FICHIER *f;

//ouvre un fichier en mode lecture-écriture

f=fopen("D:\\game\\noobs.dat", "rb+");

//lire le numéro du fichier dans la variable n

// nombres réels dans le fichier

fread(&n, taillede(int), 1, f);

cout<<"n="<

// alloue de la mémoire pour stocker les nombres réels,

//qui sera stocké dans le tableau a

a=nouveau double[n] ;

//lire du fichier dans un tableau et des nombres réels

fread(a, taillede(double), n, f);

//recherche des éléments maximum et minimum

//dans le tableau a et leurs indices

pour (imax=imin=0, max=min=a, i=1; je

si (a[i]>max)

max=a[je];

si (un[je]

min=a[je];

// mobile aiguille À maximum élément

fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);

//écrit le min au lieu du maximum de l'élément de fichier

fwrite(&min, sizeof(double), 1, f);

// mobile aiguille À minimum élément

fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);

//enregistre le maximum au lieu de l'élément de fichier minimum

fwrite(&max, sizeof(double), 1, f);

//fermeture du fichier

ffermer(f);

//mémoire libre

supprimer [ ]un;

système("pause");

Cette section abordera deux façons de travailler avec des fichiers et la classe standard MFC CFileDialog.


1. Travailler avec des fichiers en C (fonctionne également en C++).


    #inclure
    #inclure

Vide principal(vide)
{
FICHIER *fichier ;
char* nom_fichier = "fichier.txt";
char load_string = "aucun";

Fichier = fopen(nom_fichier, "w");

Fputs("chaîne", fichier);

Fichier = fopen(nom_fichier, "r");
si(fichier != 0)
{
fgets(load_string, 50, fichier);
cout)
autre
{
cout)
fclose(fichier);
) Les descriptions des fonctions pour travailler avec des fichiers se trouvent dans la bibliothèque stdio.h
Vous devez d’abord créer un pointeur vers une variable de type FILE ( FICHIER* fichier ;).
L'ouverture d'un fichier se fait en appelant la fonction fopen ( fichier = fopen(nom_fichier, "w");)
Le premier paramètre de cette fonction est le nom du fichier, le second précise dans quel mode le fichier doit être ouvert. "w"- ouvert pour l'enregistrement, "r"- ouvert à la lecture, "un"- ajout de fichiers (ce sont les modes les plus utilisés, bien qu'il en existe d'autres). L'écriture et la lecture des données d'un fichier s'effectuent par les fonctions suivantes : fputc, fputs, fgetc, fgets, fprintf, fscanf(pour une description de ces fonctions, voir stdio.h).
La fermeture d'un fichier se fait en appelant la fonction fclose ( fclose(fichier);).

Travailler avec des fichiers utilisant MFC (classes CFile, CStdioFile, ...) et la classe MFC standard CFileDialog.


La bibliothèque MFC comprend plusieurs classes pour travailler avec des fichiers. Les classes décrites ci-dessous héritent de la classe de base

Fichier CF.

Fichier de classe CF

Fichier CFconçu pour fonctionner avec des fichiers. Il facilite l'utilisation des fichiers en représentant un fichier comme un objet pouvant être créé, lu, écrit, etc.

Pour accéder à un fichier, vous devez d'abord créer un objet de la classe CFile. Le constructeur de classe vous permet d'ouvrir un fichier immédiatement après avoir créé un tel objet. Mais vous pourrez ouvrir le fichier plus tard en utilisant la méthode

Ouvrir.

Ouverture et création de fichiers

Après avoir créé l'objet de classe Fichier CFvous pouvez ouvrir un fichier en appelant la méthodeOuvrir. La méthode doit préciser le chemin d'accès au fichier à ouvrir et le mode de son utilisation. Prototype de méthodeOuvrira la forme suivante :

Virtual BOOL Open (LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError=NULL);

En tant que paramètre lpszFileName, vous devez spécifier le nom du fichier à ouvrir. Vous pouvez spécifier uniquement le nom du fichier ou le nom complet du fichier qui inclut le chemin complet d'accès.

Le deuxième paramètre, nOpenFlags, spécifie l'action que la méthode Open effectue sur le fichier, ainsi que les attributs du fichier. Vous trouverez ci-dessous quelques valeurs possibles pour le paramètre nOpenFlags :

  • CFile::modeCreate - Crée un nouveau fichier. Si le fichier spécifié existe, son contenu est effacé et la longueur du fichier est mise à zéro.
  • CFile::modeNoTruncate - Ce fichier est destiné à être utilisé conjointement avec le fichier CFile::modeCreate. Si un fichier existant est créé, son contenu ne sera pas supprimé.

  • CFile :: modeRea d - Le fichier est ouvert en lecture seule.
  • CFile::modeReadWrite - Le fichier est ouvert en écriture et en lecture.
  • CFile::modeWrite - Le fichier est ouvert en écriture uniquement.
  • CFile::typeText - Utilisé par les classes dérivées de la classe CFile, telles que CStdioFile, pour travailler avec des fichiers en mode texte. Le mode texte convertit la combinaison d'un caractère de retour chariot et d'un caractère de saut de ligne.
  • CFile::Binary - Utilisé par les classes dérivées de la classe CFile, telles que CStdioFile, pour travailler avec des fichiers en mode binaire.
  • Paramètre facultatif pError, qui est un pointeur vers un objet de classe CFileException, n'est utilisé que si l'exécution d'une opération sur le fichier entraînerait une erreur. Dans ce cas, des informations supplémentaires seront écrites sur l'objet pointé par pError.

    Méthode Ouvrirrenvoie une valeur différente de zéro si le fichier est ouvert et zéro en cas d'erreur. Une erreur lors de l'ouverture d'un fichier peut survenir, par exemple, si la méthode Open est spécifiée pour lire un fichier inexistant.

    ID de fichier ouvert

    La classe CFile comprend un élément de données m_hFile de type UINT. Il stocke l'identifiant du fichier ouvert. Si un objet de la classe CFile a déjà été créé, mais que le fichier n'a pas encore été ouvert, alors la constante hFileNull est écrite dans la variable m_hFile.

    Généralement, l'identifiant du fichier ouvert n'est pas utilisé directement. Méthodes de classe Fichier CFvous permettent d'effectuer presque toutes les opérations avec des fichiers et ne vous obligent pas à spécifier un identifiant de fichier. Puisque m_hFile est un élément de classe, l'implémentation de ses méthodes y a toujours libre accès.

    Fermeture des fichiers

    Après avoir fini de travailler avec le fichier, celui-ci doit être fermé. Classe Fichier CFa une méthode Close spéciale pour cela. A noter que si un objet de la classe CFile a été créé et qu'un fichier a été ouvert, puis que l'objet est supprimé, le fichier associé est fermé automatiquement à l'aide d'un destructeur.

    Lire et écrire des fichiers

    Il existe plusieurs méthodes de classe pour accéder aux fichiers. Fichier CF: Lire, LireÉnorme, Écrire, ÉcrireÉnorme, Flush. Méthodes Lire et lireénorme sont conçus pour lire les données d’un fichier précédemment ouvert. Sur les systèmes d'exploitation 32 bits, les deux méthodes peuvent lire simultanément plus de 65 535 octets à partir d'un fichier. La spécification ReadHuge est considérée comme obsolète et n'est conservée que pour des raisons de compatibilité avec les systèmes d'exploitation 16 bits.

    Les données lues à partir du fichier sont écrites dans le tampon lpBuf. Le paramètre nCount spécifie le nombre d'octets à lire dans le fichier. En fait, moins d'octets peuvent être lus dans le fichier que ce qui est demandé par le paramètre nCount. Cela se produit si la fin du fichier est atteinte pendant la lecture. Les méthodes renvoient le nombre d'octets lus dans le fichier.

    Les méthodes Write et WriteHuge sont destinées à écrire dans un fichier. Sur les systèmes d'exploitation 32 bits, les deux méthodes peuvent écrire simultanément plus de 65 535 octets dans un fichier. Les méthodes écrivent les octets du tampon lpBuf dans le fichier ouvert nCount. Si une erreur d'écriture se produit, telle qu'un disque plein, les méthodes invoquent la gestion des exceptions.

    Méthode de rinçage

    Lorsque la méthode Write ou WriteHuge est utilisée pour écrire des données sur le disque, celles-ci peuvent rester dans un tampon temporaire pendant un certain temps. Pour vous assurer que les modifications nécessaires sont apportées au fichier sur le disque, vous devez utiliser la méthode Flush.

    Opérations sur les fichiers

    La classe comprend des méthodes qui vous permettent d'effectuer diverses opérations sur des fichiers, telles que copier, renommer, supprimer, modifier des attributs.

    Pour changer le nom du fichier, la classe CFile inclut une méthode statique Rebaptiser, qui remplit les fonctions de cette commande. La méthode ne peut pas être utilisée pour renommer des répertoires. Si une erreur se produit, la méthode génère une exception.

    Une méthode statique est incluse dans la classe CFile pour supprimer des fichiers Retirer, qui vous permet de supprimer le fichier spécifié. Cette méthode ne vous permet pas de supprimer des répertoires. Si le fichier ne peut pas être supprimé, la méthode lève une exception.

    Pour déterminer la date et l'heure de création du fichier, sa longueur et ses attributs, une méthode statique est utilisée Obtenir le statut. Il existe deux variétés de méthodes : la première est définie comme une méthode virtuelle et la seconde est définie comme une méthode statique.

    Version virtuelle de la méthode Obtenir le statutdétermine l'état ouvert du fichier associé à cet objet de classe CFile. Cette méthode est appelée uniquement lorsqu'un objet de classe CFile est créé et que le fichier est ouvert.

    Version statique de la méthode Obtenir le statutpermet de déterminer les caractéristiques d'un fichier qui n'est pas associé à un objet de la classe CFile. Pour utiliser cette méthode, il n’est pas nécessaire d’ouvrir au préalable le fichier.

    Verrouillage

    La classe comprend des méthodes Plage de verrouillage Et Plage de déverrouillage, qui permettent de verrouiller un ou plusieurs éléments de données de fichiers pour permettre l'accès à d'autres processus. Si une application tente de reverrouiller des données précédemment verrouillées par cette application ou une autre, une exception est levée. Le verrouillage est l'un des mécanismes qui permettent à plusieurs applications ou processus de travailler simultanément sur le même fichier sans interférer les uns avec les autres.

    Vous pouvez définir un verrou en utilisant la méthode Plage de verrouillage. Pour supprimer les verrous installés, vous devez utiliser la méthodePlage de déverrouillage. Si plusieurs verrous sont définis dans un fichier, chacun d'eux doit être libéré par un appel de méthode distinctPlage de déverrouillage.

    Positionnement

    Pour déplacer le pointeur de position actuelle du fichier vers une nouvelle position, vous pouvez utiliser l'une des méthodes de classe suivantes Fichier CF - Chercher, chercher à commencer, chercher à finir.À la classe Fichier CFcomprend également des méthodes qui vous permettent de définir et de modifier la longueur du fichier, -ObtenirLongueur, DéfinirLongueur.

    Lors de l'ouverture d'un fichier, l'indicateur de position actuelle du fichier est situé au tout début du fichier. Lorsqu'une donnée est lue ou écrite, le pointeur de position actuelle se déplace vers la fin du fichier et pointe vers les données qui seront lues ou écrites lors de la prochaine opération de lecture ou d'écriture dans le fichier.

    Pour déplacer le pointeur de position actuelle du fichier vers n’importe quel emplacement, vous pouvez utiliser la méthode universelle

    Chercher. Il vous permet de déplacer le pointeur d'un certain nombre d'octets par rapport à la position de début, de fin ou actuelle du pointeur.

    Pour déplacer le pointeur vers le début ou la fin d'un fichier, il est plus pratique d'utiliser des méthodes spéciales. Méthode

    Chercher à commencerdéplace le pointeur au début du fichier et la méthodeRechercher jusqu'à la fin- jusqu'à sa fin.

    Mais pour déterminer la longueur d’un fichier ouvert, il n’est pas nécessaire de déplacer son pointeur. Vous pouvez utiliser la méthode

    ObtenirLongueur. Cette méthode renvoie également la longueur du fichier ouvert en octets. MéthodeDéfinir la longueurvous permet de modifier la longueur du fichier ouvert. Si cette méthode augmente la taille du fichier, la valeur des derniers octets n'est pas définie.

    La position actuelle du pointeur de fichier peut être déterminée à l'aide de la méthode

    ObtenirPosition. Renvoyé par méthodeObtenirPositionLa valeur 32 bits spécifie le décalage du pointeur depuis le début du fichier.

    Caractéristiques des fichiers ouverts

    Pour déterminer l'emplacement d'un fichier ouvert sur le disque, vous devez appeler la méthode ObtenirFilePath. Cette méthode renvoie un objet de la classeChaîneC, qui contient le chemin complet du fichier, y compris le nom du lecteur, les répertoires, le nom du fichier et l'extension du fichier.

    Si vous avez uniquement besoin de déterminer le nom et l'extension d'un fichier ouvert, vous pouvez utiliser la méthode ObtenirNomFichier. Il renvoie un objet CString contenant le nom du fichier. Dans le cas où vous avez besoin de connaître uniquement le nom d'un fichier ouvert sans extension, utilisez la méthodeObtenirFileTitle.

    La méthode suivante de la classe CFile vous permet de définir le chemin du fichier. Cette méthode ne crée, ne copie ni ne modifie le nom du fichier ; elle remplit uniquement l'élément de données correspondant dans l'objet de classe CFile.

    Classe C

    FichierMem

    La bibliothèque MFC inclut la classe

    Fichier CMem, hérité de la classe de baseFichier CF. Classe Fichier CMemreprésente un fichier situé dans la RAM. Avec des objets de classeFichier CMemla même chose qu'avec les objets de classeFichier CF. La différence est que le fichier associé à l'objetFichier CMem, ne se trouve pas sur le disque, mais dans la RAM de l’ordinateur. De ce fait, les opérations avec un tel fichier sont beaucoup plus rapides qu'avec des fichiers ordinaires.

    Travailler avec des objets de classe

    Fichier CMem, vous pouvez utiliser presque toutes les méthodes de la classeFichier CFqui ont été décrits ci-dessus. Vous pouvez écrire des données dans un tel fichier ou le lire. En plus de ces méthodes, la classe contientFichier CMemméthodes supplémentaires incluses.

    Il existe deux constructeurs différents pour créer des objets de la classe CMemFile. Le premier constructeur CMemFile n'a qu'un seul paramètre facultatif nGrowBytes :

    CMemFile(UINT nGrowBytes=1024);

    Ce constructeur crée un fichier vide dans la RAM. Une fois créé, le fichier s'ouvre automatiquement (pas besoin d'appeler la méthode Ope

    n).

    Lorsque l'écriture dans un tel fichier commence, un bloc de mémoire est automatiquement alloué. Pour obtenir les méthodes de classe mémoire

    Fichier CMemappeler des fonctions standardmalloc, réallocation Et gratuit. Si le bloc mémoire alloué n'est pas suffisant, sa taille est augmentée. Le bloc mémoire du fichier est augmenté en parties de nGrowBytes octets. Après avoir supprimé un objet de classeFichier CMemla mémoire utilisée est automatiquement renvoyée au système.

    Le deuxième constructeur de la classe CMemFile possède un prototype plus complexe. Ce constructeur est utilisé dans les cas où le programmeur lui-même alloue de la mémoire pour le fichier :

    CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes=0);

    Le paramètre lpBuffer spécifie le tampon à utiliser pour le fichier. La taille du tampon est déterminée par le paramètre nBufferSize.

    Le paramètre facultatif nGrowBytes est utilisé de manière plus complète que dans le constructeur de première classe. Si nGrowBytes contient zéro, alors le fichier généré contiendra les données du lpBuffer. La longueur d'un tel fichier sera égale à nBufferSize.

    Si nGrowBytes est supérieur à zéro, alors le contenu de lpBuffer est ignoré. De plus, si plus de données sont écrites dans un tel fichier que ne peut en contenir le tampon alloué, sa taille augmente automatiquement. Le bloc mémoire du fichier est augmenté en parties de nGrowBytes octets.

    Fichier CMempermet d'obtenir un pointeur vers la zone mémoire utilisée par le fichier. Grâce à ce pointeur, vous pouvez travailler directement avec le contenu du fichier, sans vous limiter aux méthodes de classeFichier CF. Pour obtenir un pointeur vers un tampon de fichier, vous pouvez utiliser la méthode Detach. Avant de faire cela, il est utile de déterminer la longueur du fichier (et donc la taille du buffer mémoire) en appelant la méthodeObtenirLongueur. Détacherferme le fichier donné et renvoie un pointeur vers le bloc de mémoire qu'il utilise. Si vous devez à nouveau ouvrir le fichier et lui associer un bloc RAM, vous devez appeler la méthodeAttacher.

    Il est à noter que pour gérer le buffer des fichiers, la classe

    Fichier CMemappelle des fonctions standardsmalloc, réallocation Et gratuit. Par conséquent, afin de ne pas casser le mécanisme de gestion de la mémoire, le tampon lpBuffer doit être créé par les fonctionsmalloc ou calloc.

    Classe CStdioFile

    Ceux qui sont habitués à utiliser les fonctions d'E/S de streaming de la bibliothèque standard C et C++ doivent prêter attention à la classe

    Fichier CStdio, hérité de la classe de baseFichier CF. Cette classe vous permet d'effectuer des E/S tamponnées en mode texte et binaire. Pour les objets de classeFichier CStdioVous pouvez appeler presque toutes les méthodes de la classe CFile.Fichier CStdioinclut l'élément de données m_pStream, qui contient un pointeur vers le fichier ouvert. Si un objet de classeFichier CStdiocréé, mais que le fichier n'est pas encore ouvert ou fermé, alors m_pStream contient la constante NULL.Fichier CStdioa trois constructeurs différents. Le premier constructeur de la classe CStdioFile n'a aucun paramètre. Ce constructeur crée uniquement un objet de classe, mais n'ouvre aucun fichier. Pour ouvrir un fichier, vous devez appeler la méthodeOuvrirclasse de baseFichier CF.

    Constructeur de deuxième classe

    Fichier CStdiopeut être appelé si le fichier est déjà ouvert et que vous devez créer un nouvel objet de la classe CStdioFile et y associer le fichier ouvert. Ce constructeur peut être utilisé si le fichier a été ouvert avec une fonction standardfouvert. Le paramètre méthode doit contenir un pointeur vers le fichier obtenu en appelant la fonction standardfouvert.

    Le troisième constructeur peut être utilisé si vous devez créer un objet de classe

    Fichier CStdio, ouvrez un nouveau fichier et associez-le à l'objet nouvellement créé.

    Pour lire et écrire dans un fichier texte, la classe CStdioFile inclut deux nouvelles méthodes :

    Chaîne de lecture Et Chaîne d'écriture. La première méthode vous permet de lire une chaîne de caractères à partir d'un fichier et la seconde méthode vous permet de l'écrire.

    Exemples d'écriture et de lecture à partir d'un fichier

    Voici des fragments de code qui démontrent l'utilisation des panneaux de dialogue de sélection de fichier standard et la procédure de lecture et d'écriture dans un fichier.

    Ouvrir un fichier et le lire

    CString m_Text ; ……// création d'un panneau de sélection de fichier standard Ouvrir CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY,(LPCSTR)" Fichiers texte (*.txt) |*.txt||");// affiche le panneau de sélection de fichier standard Ouvrir if(DlgOpen.DoModal()==IDOK) (// crée un objet et ouvre le fichier en lecture CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary);// lecture des chaînes du fichier CString& ref=m_Text; File.ReadString(réf.

    ); // une référence à une chaîne est passée

    CString m_Text ; m_Texte) Ouverture et écriture à partir d'un fichier // création d'un panneau de sélection de fichier SaveAs standard CFileDialog DlgSaveAs(FALSE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)" Fichiers texte (*.txt) |*.txt||"); // affiche le panneau de sélection de fichier SaveAs standard if(DlgSaveAs.DoModal()==IDOK) ( // crée un objet et ouvre un fichier en écriture Fichier CStdioFile (DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
      // écriture dans un fichier de chaînes

      Exécutez le programme - Tout construire / Reconstruire (il y aura des erreurs), sélectionnez Construire / Définir la configuration active - Win 32 Realise, sélectionnez l'élément de menu "Projet", puis "Paramètres...", l'onglet "C/C++", Catégorie - Génération de code et dans l'élément "Utiliser la bibliothèque d'exécution", sélectionnez "Multithread". Après cela, recommencez tout Build / Rebuild et le programme fonctionnera.



    Des questions ?

    Signaler une faute de frappe

    Texte qui sera envoyé à nos rédacteurs :