Structure des fichiers disque. Sujet de cours : « Fichiers et structures de fichiers »

L'un des composants du système d'exploitation est le système de fichiers - le stockage principal des informations système et utilisateur. Tous les systèmes d'exploitation modernes fonctionnent avec un ou plusieurs systèmes de fichiers, par exemple FAT (File Allocation Table), NTFS (NT File System), HPFS (High Performance File System), NFS (Network File System), AFS (Andrew File System). , Système de fichiers Internet.

Un système de fichiers est une partie du système d'exploitation dont le but est de fournir à l'utilisateur une interface pratique lorsqu'il travaille avec des données stockées dans la mémoire externe et de permettre le partage de fichiers entre plusieurs utilisateurs et processus.

Au sens large, la notion de « système de fichiers » comprend :

La collection de tous les fichiers sur le disque ;

Ensembles de structures de données utilisées pour gérer les fichiers, telles que les répertoires de fichiers, les descripteurs de fichiers, les tables d'allocation d'espace disque libre et utilisé ;

Ensemble d'outils logiciels système qui mettent en œuvre la gestion des fichiers, notamment : création, destruction, lecture, écriture, dénomination, recherche et autres opérations sur les fichiers.

Le système de fichiers est généralement utilisé à la fois lors du chargement du système d'exploitation après la mise sous tension de l'ordinateur et pendant le fonctionnement. Le système de fichiers remplit les fonctions principales suivantes :

Détermine les moyens possibles d'organiser les fichiers et la structure des fichiers sur le support ;

Implémente des méthodes pour accéder au contenu des fichiers et fournit des outils pour travailler avec les fichiers et la structure des fichiers. Dans ce cas, l'accès aux données peut être organisé par le système de fichiers à la fois par nom et par adresse (numéro de secteur, surface et trace du support) ;

Surveille l'espace libre sur les supports de stockage.

Lorsqu'un programme d'application accède à un fichier, il n'a aucune idée de la manière dont se trouvent les informations contenues dans un fichier particulier, ni du type de support physique (CD, disque dur ou unité de mémoire flash) sur lequel elles sont enregistrées. Tout ce que le programme connaît, c'est le nom du fichier, sa taille et ses attributs. Il reçoit ces données du pilote du système de fichiers. C'est le système de fichiers qui détermine où et comment le fichier sera écrit sur un support physique (par exemple un disque dur).

Du point de vue du système d'exploitation, le disque entier est un ensemble de clusters (zones de mémoire) dont la taille varie de 512 octets ou plus. Les pilotes du système de fichiers organisent les clusters en fichiers et répertoires (qui sont en fait des fichiers contenant une liste de fichiers dans ce répertoire). Ces mêmes pilotes gardent une trace des clusters actuellement utilisés, de ceux qui sont libres et de ceux marqués comme défectueux. Pour comprendre clairement comment les données sont stockées sur les disques et comment le système d'exploitation y donne accès, il est nécessaire de comprendre, au moins en termes généraux, la structure logique du disque.


3.1.5 Structure logique du disque

Pour qu'un ordinateur puisse stocker, lire et écrire des informations, le disque dur doit d'abord être partitionné. Des partitions y sont créées à l'aide de programmes appropriés - c'est ce qu'on appelle le « partitionnement du disque dur ». Sans ce partitionnement, il ne sera pas possible d'installer le système d'exploitation sur le disque dur (bien que Windows XP et 2000 puissent être installés sur un disque non partitionné, ils effectuent eux-mêmes ce partitionnement lors du processus d'installation).

Le disque dur peut être divisé en plusieurs partitions, chacune étant utilisée indépendamment. À quoi ça sert? Un disque peut contenir plusieurs systèmes d'exploitation différents situés sur différentes partitions. La structure interne d'une partition allouée à n'importe quel système d'exploitation est entièrement déterminée par ce système d'exploitation.

De plus, il existe d'autres raisons de partitionner un disque, par exemple :

Possibilité d'utiliser des disques d'une capacité supérieure à MS DOS
32 Mo ;

Si un disque est endommagé, seules les informations qui se trouvaient sur ce disque sont perdues ;

Réorganiser et décharger un petit disque est plus facile et plus rapide qu'un grand ;

Chaque utilisateur peut se voir attribuer son propre lecteur logique.

L'opération de préparation d'un disque à l'utilisation est appelée mise en page, ou initialisation. Tout l'espace disque disponible est divisé en côtés, pistes et secteurs, les pistes et les côtés étant numérotés à partir de zéro et les secteurs à partir de un. Un ensemble de pistes situées à la même distance de l'axe d'un disque ou d'un paquet de disques est appelé cylindre. Ainsi, l'adresse physique du secteur est déterminée par les coordonnées suivantes : numéro de piste (cylindre - C), numéro de côté disque (tête - H), numéro de secteur - R, c'est-à-dire CHR.

Le tout premier secteur du disque dur (C=0, H=0, R=1) contient le master boot record Enregistrement de démarrage principal. Cette entrée n'occupe pas tout le secteur, mais seulement sa partie initiale. Le Master Boot Record est un programme de chargeur de démarrage non système.

A la fin du premier secteur du disque dur se trouve la table de partition du disque - Table de partition. Ce tableau contient quatre lignes décrivant un maximum de quatre partitions. Chaque ligne du tableau décrit une section :

1) section active ou non ;

2) le numéro du secteur correspondant au début de la section ;

3) le numéro du secteur correspondant à la fin du tronçon ;

4) taille de partition en secteurs ;

5) code du système d'exploitation, c'est-à-dire À quel système d'exploitation appartient cette partition ?

Une partition est dite active si elle contient le programme de démarrage du système d'exploitation. Le premier octet de l'élément de section est l'indicateur d'activité de section (0 – inactif, 128 (80H) – actif). Il est utilisé pour déterminer si la partition est système (amorçable) et si le système d'exploitation doit être chargé à partir de celle-ci au démarrage de l'ordinateur. Une seule section peut être active. De petits programmes appelés gestionnaires de démarrage peuvent se trouver dans les premiers secteurs du disque. Ils demandent de manière interactive à l'utilisateur à partir de quelle partition démarrer et ajustent les indicateurs d'activité de la partition en conséquence. Étant donné que la table de partition comporte quatre lignes, il peut y avoir jusqu'à quatre systèmes d'exploitation différents sur le disque. Le disque peut donc contenir plusieurs partitions principales appartenant à différents systèmes d'exploitation.

Un exemple de structure logique d'un disque dur composé de trois partitions, dont deux appartiennent à DOS et une à UNIX, est présenté dans la figure 3.2a.

Chaque partition active possède son propre enregistrement de démarrage - un programme qui charge un système d'exploitation donné.

En pratique, le disque est le plus souvent divisé en deux partitions. Les tailles des partitions, qu'elles soient déclarées actives ou non, sont définies par l'utilisateur lors du processus de préparation du disque dur à l'utilisation. Cela se fait à l'aide de programmes spéciaux. Sous DOS, ce programme s'appelle FDISK, dans les versions Windows-XX, il s'appelle Diskadministrator.

Sous DOS, la partition principale est Partition primaire, c'est la section qui contient le chargeur du système d'exploitation et le système d'exploitation lui-même. Ainsi, la partition principale est la partition active, utilisée comme lecteur logique nommé C:.

Le système d'exploitation WINDOWS (à savoir WINDOWS 2000) a changé la terminologie : la partition active est appelée partition système et la partition de démarrage est le disque logique qui contient les fichiers système WINDOWS. Le disque logique de démarrage peut être le même que la partition système, mais il peut être situé sur une partition différente du même disque dur ou sur un disque dur différent.

Section avancée Partition étendue peut être divisé en plusieurs disques logiques portant des noms de D : à Z :.

La figure 3.2b montre la structure logique d'un disque dur, qui ne comporte que deux partitions et quatre lecteurs logiques.

Pour comprendre le fonctionnement des systèmes informatiques, il ne suffit pas d’interagir simplement avec le système d’exploitation au niveau visuel. Pour bien comprendre tous les processus se produisant dans le système, il est nécessaire de comprendre ce qu'est un fichier et sa structure. Lors de l'examen de ce sujet, il sera indiqué pourquoi cela est nécessaire.


Qu'est-ce qu'un fichier et sa structure ?

Vous devez d’abord définir les concepts et termes de base. Le concept clé ici est le fichier. Il définit le mécanisme de fonctionnement du système en termes logiciels. Un fichier est un objet qui contient certaines informations. Pour comprendre ce que sont les fichiers de données et leur structure, il est préférable de donner un exemple tiré de la vie. Vous pouvez comparer ces concepts avec un livre ordinaire. Tout le monde sait probablement qu'un livre a une couverture, des pages, une table des matières, des sections et des chapitres.

Pour simplifier la compréhension du problème, disons que la couverture représente l'ensemble du système de fichiers dans son intégralité, les pages sont des dossiers ou des répertoires dans lesquels des fichiers individuels sont stockés, la table des matières est un gestionnaire de fichiers, les sections et chapitres sont des fichiers contenant des information. La désignation d'un objet appelé fichier se compose généralement de deux parties : un nom et une extension. Le nom du fichier peut être spécifié dans différentes langues et peut être arbitraire. Une extension est une désignation spéciale qui indique un type de données.

L'extension se compose généralement de trois lettres latines ou plus. Par extension, vous pouvez comprendre à quel programme le fichier est associé et s'il s'agit d'un programme système. Par défaut, dans n'importe quel système d'exploitation, l'ouverture d'un fichier se fait en double-cliquant sur la souris. Cependant, vous ne pourrez pas nécessairement ouvrir n'importe quel fichier de cette façon. Donnons un exemple simple : de cette façon, vous pouvez exécuter des fichiers exécutables avec l'extension .exe sur le système d'exploitation Windows, mais les fichiers avec l'extension .dll ne peuvent pas être ouverts de cette façon.

En effet, le contenu est accessible via d'autres composants logiciels. De plus, le code peut être appelé par des composants spécialisés du système d'exploitation. Cependant, c'est l'exemple le plus simple. Les objets qui ne correspondent ni au système d'exploitation ni à aucun programme ne sont pas si faciles à ouvrir. Le système d'exploitation ne comprend pas quel outil doit être lancé pour ouvrir le fichier. Dans le meilleur des cas, le système vous proposera de choisir le programme approprié dans la liste de solutions présentée.

L'informatique au début du développement de la technologie informatique

Voyons maintenant à quoi ressemblaient les technologies de l'information lorsque les premiers ordinateurs sont apparus. Le système principal utilisé à cette époque était le système DOS, qui était alors primitif. Dans ce système, des commandes spéciales devaient être saisies pour accéder aux fonctions. Après l'apparition du produit unique Norton Commander, cela n'était plus nécessaire, même si certaines commandes doivent encore être enregistrées. Ce gestionnaire de fichiers peut être appelé table des matières, car toutes les informations stockées sur un périphérique de stockage externe ou un disque dur y étaient clairement structurées.

Dossiers et fichiers

Comme cela est déjà devenu clair, dans tout système d'exploitation, il existe plusieurs objets principaux. Des concepts tels que fichier et système de fichiers sont indissociables de la notion de dossiers. Ce concept est parfois aussi appelé répertoire ou répertoire. Il s'agit d'une section spéciale dans laquelle les composants individuels sont stockés. Pour expliquer ce concept, nous pouvons donner comme exemple une commode, dans laquelle se trouvent de nombreux tiroirs, dont chacun contient quelque chose.

Exemples de recherche de fichiers

Sur la base de ce qui précède, nous pouvons tirer une conclusion sur la recherche rapide d'informations. Tout système d'exploitation moderne fournit des outils spéciaux à cet effet. Ainsi, par exemple, dans le même gestionnaire de fichiers, dans un champ spécial, vous devez saisir le nom ou une partie du nom du fichier, après quoi le système affichera tous les objets contenant cette chaîne. Pour effectuer une recherche plus précise, vous devez savoir où se trouve exactement le fichier dont vous avez besoin. En d’autres termes, vous devez sélectionner un tiroir spécifique dans la commode dans lequel se trouve l’élément souhaité. La recherche est effectuée à l'aide d'un outil de gestion de fichiers standard. Vous pouvez également utiliser des raccourcis clavier comme Ctrl+F, qui font apparaître la barre de recherche.

Qu'est-ce qu'un système de fichiers ?

Les structures de fichiers et les fichiers ne peuvent être imaginés sans comprendre le fonctionnement du système de fichiers. Il convient de noter que la structure des fichiers et le système de fichiers sont des concepts différents. La structure est le principal type d’organisation des fichiers lorsqu’il s’agit d’organiser les données. Le système de fichiers est une méthode qui définit le fonctionnement d'une structure. En termes simples, c'est le principe du traitement des données au sens de leur placement sur un support de stockage. Il existe aujourd'hui de nombreux systèmes de fichiers. Pour le système d'exploitation Windows, les options les plus courantes sont les systèmes FAT avec une architecture 6, 16, 32 et 64 bits, ReFS et NTFS.

Les concepts de système de fichiers et de structure de fichiers sont étroitement liés. Il convient cependant maintenant de dire quelques mots sur les systèmes eux-mêmes. Sans parler de détails techniques, il convient de noter que la principale différence est que le système de fichiers FAT a une taille de cluster plus grande pour un accès et un stockage accélérés des petits fichiers ; les systèmes de fichiers NTFS et ReFS sont optimisés pour de grandes quantités de données et un accès rapide. à la vitesse maximale de lecture des informations du disque dur.

Effectuer des opérations sur les fichiers

Regardons cette question de l'autre côté. En règle générale, les opérations sur les fichiers prévues dans n'importe quel système d'exploitation ne sont fondamentalement pas différentes. Les opérations de base incluent la création, l'affichage, l'ouverture, l'enregistrement, l'édition, la copie, le renommage, la suppression et le déplacement. Pour tous les systèmes d'exploitation existants, ces actions sont standard. Mais il existe également un certain nombre de fonctions spécifiques.

Archivage des informations

Tout d'abord, les fonctions spécifiques incluent la compression des dossiers et des fichiers, appelée archivage, et le processus inverse : l'extraction des informations de l'archive. Tout en travaillant sur le système d'exploitation DOS, la création de types de données d'archives s'est principalement réduite à l'utilisation de la norme ARJ. Cependant, avec l'avènement de la technologie d'archivage ZIP, ces processus ont connu un développement plus important. En conséquence, un archiveur RAR universel a été créé. Ces technologies sont désormais disponibles dans n'importe quel système d'exploitation, même sans qu'il soit nécessaire d'installer un logiciel supplémentaire. Les opérations avec les fichiers dans cette vue sont traitées comme une compression virtuelle. Les technologies de compression demandent simplement au système de déterminer une taille plus petite que celle souhaitée. Le volume d'informations d'un dossier ou d'un fichier reste inchangé pendant le processus d'archivage.

Contrôle d'affichage des fichiers

Un concept tel que la structure des fichiers doit être considéré du point de vue de la possibilité de voir les objets eux-mêmes. Aujourd'hui, presque tous les utilisateurs de systèmes informatiques modernes sont confrontés au concept de fichiers et de dossiers cachés. Quels sont-ils? La présence de tels objets indique que le système présente une certaine limitation d'affichage. Par exemple, de telles restrictions sont définies sur les fichiers et dossiers système pour empêcher l'utilisateur de les supprimer accidentellement. Ainsi, ils ne disparaissent pas physiquement du disque dur, c’est juste que le gestionnaire de fichiers ne les reconnaît pas. Pour afficher tous les objets cachés dans le même Explorateur, vous pouvez utiliser le menu Affichage.

Sur l'onglet correspondant, vous devez cocher la case dans la ligne d'affichage des fichiers et dossiers cachés. Après avoir activé l'affichage, les objets de ce type auront des icônes translucides. Il peut y avoir des difficultés à trouver des objets cachés. Le système peut ne pas renvoyer de résultats de recherche même si vous entrez un nom et un type de fichier, ainsi qu'un emplacement spécifique. Pour trouver des objets cachés, vous devez mettre un symbole % au début et à la fin du nom du répertoire racine. Ce n'est que dans ce cas que le fichier et la structure du fichier recevront la clé de l'interaction.

Tôt ou tard, un utilisateur d'ordinateur novice est confronté à un concept tel qu'un système de fichiers (FS). En règle générale, la première connaissance de ce terme a lieu lors du formatage d'un support de stockage : disques logiques et supports connectés (lecteurs flash, cartes mémoire, disque dur externe).

Avant le formatage, le système d'exploitation Windows vous invite à sélectionner le type de système de fichiers sur le support, la taille du cluster et la méthode de formatage (rapide ou complet). Voyons ce qu'est un système de fichiers et pourquoi est-il nécessaire ?

Toutes les informations sont enregistrées sur le support sous une forme qui doit être située dans un certain ordre, sinon le système d'exploitation et les programmes ne pourront pas fonctionner avec les données. Cet ordre est organisé par le système de fichiers à l'aide de certains algorithmes et règles de placement des fichiers sur le support.

Lorsqu'un programme a besoin d'un fichier stocké sur disque, il n'a pas besoin de savoir comment ni où il est stocké. Il suffit au programme de connaître le nom du fichier, sa taille et ses attributs afin de transférer ces données vers le système de fichiers, qui donnera accès au fichier souhaité. La même chose se produit lors de l'écriture de données sur un support : le programme transfère les informations sur le fichier (nom, taille, attributs) au système de fichiers, qui les enregistre selon ses propres règles spécifiques.

Pour mieux comprendre, imaginez un bibliothécaire donnant un livre à un client en fonction de son titre. Ou dans l'ordre inverse : le client rend le livre qu'il a lu au bibliothécaire qui le remet en réserve. Le client n'a pas besoin de savoir où et comment le livre est conservé, cela relève de la responsabilité de l'employé de l'établissement. Le bibliothécaire connaît les règles du catalogage en bibliothèque et, selon ces règles, recherche la publication ou la replace, c'est-à-dire exerce ses fonctions officielles. Dans cet exemple, la bibliothèque est le support de stockage, le bibliothécaire est le système de fichiers et le client est le programme.

Fonctions de base du système de fichiers

Les principales fonctions du système de fichiers sont :

  • placement et organisation sur un support de données sous forme de fichiers;
  • déterminer la quantité maximale de données prise en charge sur le support de stockage ;
  • créer, lire et supprimer des fichiers ;
  • attribuer et modifier les attributs du fichier (taille, heure de création et de modification, propriétaire et créateur du fichier, lecture seule, fichier caché, fichier temporaire, archivé, exécutable, longueur maximale du nom de fichier, etc.) ;
  • déterminer la structure du fichier ;
  • organisation de répertoires pour une organisation logique des fichiers ;
  • protection des fichiers en cas de panne du système ;
  • protéger les fichiers contre tout accès non autorisé et modifier leur contenu.

Les informations enregistrées sur un disque dur ou tout autre support y sont placées selon une organisation en cluster. Un cluster est une sorte de cellule d'une certaine taille dans laquelle s'inscrit l'intégralité ou une partie du fichier.

Si le fichier est de taille cluster, il n’occupe qu’un seul cluster. Si la taille du fichier dépasse la taille de la cellule, il est alors placé dans plusieurs cellules du cluster. De plus, les clusters libres ne peuvent pas être situés les uns à côté des autres, mais peuvent être dispersés sur la surface physique du disque. Ce système vous permet d'utiliser l'espace le plus efficacement possible lors du stockage de fichiers. La tâche du système de fichiers est de distribuer de manière optimale le fichier lors de l'écriture dans des clusters libres, ainsi que de l'assembler lors de la lecture et de le transmettre au programme ou au système d'exploitation.

Types de systèmes de fichiers

Au cours de l'évolution des ordinateurs, des supports de stockage et des systèmes d'exploitation, un grand nombre de systèmes de fichiers ont disparu. Dans le processus d'une telle sélection évolutive, les types de systèmes de fichiers suivants sont aujourd'hui principalement utilisés pour fonctionner avec des disques durs et des périphériques de stockage externes (lecteurs flash, cartes mémoire, disques durs externes, CD) :

  1. FAT32
  2. ISO9660

Les deux derniers systèmes sont conçus pour fonctionner avec des CD. Les systèmes de fichiers Ext3 et Ext4 fonctionnent avec les systèmes d'exploitation basés sur Linux. NFS Plus est un système de fichiers pour les systèmes d'exploitation OS X utilisés sur les ordinateurs Apple.

Les systèmes de fichiers les plus utilisés sont NTFS et FAT32, et ce n'est pas surprenant, car... ils sont conçus pour les systèmes d'exploitation Windows, qui exécutent la grande majorité des ordinateurs dans le monde.

Aujourd'hui, FAT32 est activement remplacé par le système NTFS plus avancé en raison de sa plus grande fiabilité en matière de sécurité et de protection des données. De plus, les dernières versions du système d'exploitation Windows ne se permettront tout simplement pas d'être installées si la partition du disque dur est formatée en FAT32. Le programme d'installation vous demandera de formater la partition en NTFS.

Le système de fichiers NTFS prend en charge des disques d'une capacité de plusieurs centaines de téraoctets et une taille de fichier unique allant jusqu'à 16 téraoctets.

Le système de fichiers FAT32 prend en charge des disques jusqu'à 8 téraoctets et une taille de fichier unique jusqu'à 4 Go. Le plus souvent, ce FS est utilisé sur des lecteurs flash et des cartes mémoire. Les disques externes sont formatés en FAT32 en usine.

Cependant, la limitation de la taille des fichiers à 4 Go est déjà un gros inconvénient aujourd'hui, car... En raison de la distribution de vidéos de haute qualité, la taille du fichier du film dépassera cette limite et il ne sera pas possible de l'enregistrer sur le support.

Partager.

Bonjour, cher utilisateur, dans cet article, nous parlerons d'un sujet tel que les fichiers. A savoir, nous examinerons : Gestion de fichiers, types de fichier, structure du fichier, attributs de fichier.

Système de fichiers

L'une des tâches principales du système d'exploitation est de faciliter la tâche de l'utilisateur lorsqu'il travaille avec des données stockées sur des disques. Pour ce faire, le système d'exploitation remplace la structure physique des données stockées par un modèle logique convivial, qui est implémenté sous la forme d'une arborescence de répertoires affichée à l'écran par des utilitaires tels que Norton Commander, Far Manager ou l'Explorateur Windows. L'élément de base de ce modèle est déposer, ce qui équivaut à système de fichiers en général, peut être caractérisé à la fois par une structure logique et physique.

Gestion de fichiers

Déposer– une zone nommée de mémoire externe destinée à la lecture et à l’écriture de données.

Les fichiers sont stockés dans une mémoire indépendante de l'alimentation. Une exception est un disque électronique, lorsqu'une structure qui imite un système de fichiers est créée dans l'OP.

Système de fichiers(FS) est un composant du système d'exploitation qui assure l'organisation de la création, du stockage et de l'accès à des ensembles de données nommés - des fichiers.

Le système de fichiers comprend : Le système de fichiers comprend :

  • La collection de tous les fichiers sur le disque.
  • Ensembles de structures de données utilisées pour gérer les fichiers (répertoires de fichiers, descripteurs de fichiers, tables d'allocation d'espace disque libre et utilisé).
  • Un ensemble d'outils logiciels système qui mettent en œuvre diverses opérations sur les fichiers : création, destruction, lecture, écriture, dénomination, recherche.

Les problèmes résolus par le FS dépendent de la manière dont le processus informatique est organisé dans son ensemble. Le type le plus simple est un système de fichiers dans les systèmes d'exploitation à utilisateur unique et à programme unique. Les principales fonctions d'un tel FS visent à résoudre les tâches suivantes :

  • Nommer les fichiers.
  • Interface logicielle pour les applications.
  • Mappage du modèle de système de fichiers logique sur l'organisation physique de l'entrepôt de données.
  • Résistance FS aux pannes de courant, aux erreurs matérielles et logicielles.

Les tâches FS deviennent plus compliquées dans les systèmes d'exploitation multitâches mono-utilisateur, conçus pour le travail d'un seul utilisateur, mais permettent d'exécuter plusieurs processus simultanément. Aux tâches répertoriées ci-dessus, une nouvelle tâche est ajoutée : l'accès partagé à un fichier à partir de plusieurs processus.

Le fichier dans ce cas est une ressource partagée, ce qui signifie que le FS doit résoudre toute la gamme des problèmes associés à ces ressources. En particulier : il doit y avoir des moyens pour bloquer un fichier et ses parties, rapprocher les copies, empêcher les courses et éliminer les blocages. Dans les systèmes multi-utilisateurs, une autre tâche apparaît : protéger les fichiers d'un utilisateur contre tout accès non autorisé par un autre utilisateur.

Les fonctions du FS, qui fonctionne dans le cadre d'un OS réseau, deviennent encore plus complexes ; il doit organiser la protection des dossiers un utilisateur contre l'accès non autorisé d'un autre utilisateur.

Objectif principal système de fichiers et qui lui correspond systèmes de gestion de fichiers– organisation d'une gestion pratique des fichiers organisés en fichiers : au lieu d'un accès de bas niveau aux données indiquant les adresses physiques spécifiques de l'enregistrement dont nous avons besoin, un accès logique est utilisé indiquant le nom du fichier et l'enregistrement qu'il contient.

Il faut distinguer les termes « système de fichiers » et « système de gestion de fichiers » : le système de fichiers définit tout d'abord les principes d'accès aux données organisées en fichiers. Et le terme « système de gestion de fichiers » doit être utilisé en relation avec une implémentation spécifique du système de fichiers, c'est-à-dire Il s'agit d'un ensemble de modules logiciels qui permettent de travailler avec des fichiers dans un système d'exploitation spécifique.

Exemple

Le système de fichiers FAT (file allocation table) a de nombreuses implémentations en tant que système de gestion de fichiers

  • Le système développé pour les premiers PC s'appelait simplement FAT (maintenant simplement appelé FAT-12). Il a été conçu pour fonctionner avec des disquettes et, pendant un certain temps, il a été utilisé pour fonctionner avec des disques durs.
  • Ensuite, il a été amélioré pour fonctionner avec des disques durs plus gros, et cette nouvelle implémentation a été appelée FAT-16. ce nom est également utilisé en relation avec le SUF de MS-DOS lui-même.
  • L'implémentation de SUF pour OS/2 est appelée super-FAT (la principale différence est la capacité à prendre en charge les attributs étendus pour chaque fichier).
  • Il existe une version de SUF pour Windows 9x/NT, etc. (FAT-32).

Types de fichier

Fichiers réguliers: contiennent des informations de nature arbitraire qui y sont saisies par l'utilisateur ou qui sont générées à la suite du fonctionnement des programmes système et utilisateur. Le contenu d'un fichier standard est déterminé par l'application qui l'utilise.

Les fichiers normaux peuvent être de deux types :

  1. Logiciel(exécutable) – sont des programmes écrits dans le langage de commande du système d’exploitation et exécutent certaines fonctions du système (ont les extensions .exe, .com, .bat).
  2. Fichiers de données– tous autres types de fichiers : documents textes et graphiques, feuilles de calcul, bases de données, etc.

Catalogues- il s'agit, d'une part, d'un groupe de fichiers combinés par l'utilisateur sur la base de certaines considérations (par exemple, des fichiers contenant des programmes de jeux, ou des fichiers qui composent un progiciel), et d'autre part, il s'agit d'un groupe particulier type de fichiers contenant des informations d'aide du système sur un ensemble de fichiers regroupés par utilisateurs selon certains critères informels (type de fichier, emplacement sur le disque, droits d'accès, date de création et de modification).

Fichiers spéciaux– ce sont des fichiers factices associés aux périphériques d’entrée/sortie, qui sont utilisés pour unifier le mécanisme d’accès aux fichiers et aux périphériques externes. Les fichiers spéciaux permettent à l'utilisateur d'effectuer des opérations d'E/S à l'aide de commandes normales d'écriture ou de lecture de fichiers. Ces commandes sont d'abord traitées par les programmes FS, puis à un moment donné de l'exécution de la requête, elles sont converties par le système d'exploitation en commandes de contrôle pour le périphérique correspondant (PRN, LPT1 - pour le port d'imprimante (noms symboliques, pour le système d'exploitation - ce sont fichiers), CON - pour le clavier).

Exemple. Copier le contexte1 (travailler avec le clavier).

Structure du fichier

Structure du fichier– l'ensemble des fichiers sur le disque et les relations entre eux (l'ordre dans lequel les fichiers sont stockés sur le disque).

Types de structures de fichiers :

  • simple, ou de plain-pied: Un répertoire est une séquence linéaire de fichiers.
  • hiérarchique ou multi-niveaux: Un répertoire lui-même peut faire partie d'un autre répertoire et contenir de nombreux fichiers et sous-répertoires. La structure hiérarchique peut être de deux types : « Arbre » et « Réseau ». Les répertoires forment une « arborescence » si le fichier peut être inclus dans un seul répertoire (OS MS-DOS, Windows) et un « Réseau » - si le fichier peut être inclus dans plusieurs répertoires à la fois (UNIX).
  • La structure des fichiers peut être représentée sous forme de graphique décrivant la hiérarchie des répertoires et des fichiers :



Types de noms de fichiers

Les fichiers sont identifiés par des noms. Les utilisateurs donnent des fichiers noms symboliques, cela prend en compte les restrictions du système d'exploitation sur les caractères utilisés et la longueur du nom. Dans les premiers systèmes de fichiers, ces limites étaient assez étroites. Donc en populaire Système de fichiers FAT La longueur des noms est limitée par le schéma bien connu 8.3 (8 caractères - le nom lui-même, 3 caractères - l'extension du nom), et sous UNIX System V, le nom ne peut pas contenir plus de 14 caractères.

Cependant, il est beaucoup plus pratique pour l'utilisateur de travailler avec des noms longs, car ils permettent de donner au fichier un véritable nom mnémonique, par lequel, même après une période de temps assez longue, vous pourrez vous souvenir de ce que contient ce fichier. Par conséquent, les systèmes de fichiers modernes ont tendance à prendre en charge les noms de fichiers symboliques longs.

Par exemple, Windows NT spécifie dans son système de fichiers NTFS qu'un nom de fichier peut contenir jusqu'à 255 caractères, sans compter le caractère nul final.

Le passage à des noms longs crée un problème de compatibilité avec les applications créées précédemment qui utilisent des noms courts. Pour que les applications puissent accéder aux fichiers conformément aux conventions précédemment acceptées, le système de fichiers doit être capable de fournir des noms courts équivalents (alias) aux fichiers portant des noms longs. Ainsi, l'une des tâches importantes consiste à générer des noms courts appropriés.

Les noms symboliques peuvent être de trois types : simples, composés et relatifs :

  1. Nom simple identifie un fichier dans un répertoire, attribué aux fichiers en tenant compte de la nomenclature des symboles et de la longueur du nom.
  2. Nom et prénom est une chaîne de noms symboliques simples de tous les répertoires par lesquels passe le chemin de la racine vers un fichier donné, un nom de disque, un nom de fichier. Donc le nom complet est composite, dans lequel les noms simples sont séparés les uns des autres par un séparateur accepté dans le système d'exploitation.
  3. Le fichier peut également être identifié nom relatif. Le nom relatif du fichier est déterminé par le concept de « répertoire courant ». A un instant donné, l'un des répertoires est courant, et ce répertoire est sélectionné par l'utilisateur lui-même sur commande de l'OS. Le système de fichiers capture le nom du répertoire actuel afin de pouvoir ensuite l'utiliser en complément des noms relatifs pour former le nom de fichier complet.

Dans une structure de fichiers arborescente, il existe une correspondance biunivoque entre un fichier et son nom complet - « un fichier - un nom complet ». Dans une structure de fichiers réseau, un fichier peut être inclus dans plusieurs répertoires, ce qui signifie qu'il peut avoir plusieurs noms complets ; La correspondance ici est « un fichier - plusieurs noms complets ».

Pour le fichier 2.doc, définissez les trois types de nom, à condition que le répertoire actuel soit le répertoire 2008_year.

  • Nom simple : 2.doc
  • Nom complet : C:\2008_year\Documents\2.doc
  • Nom relatif : Documents\2.doc

Attributs du fichier

Une caractéristique importante d'un fichier réside dans ses attributs. Les attributs– il s’agit d’informations décrivant les propriétés des fichiers. Exemples d'attributs de fichier possibles :

  • Attribut en lecture seule ;
  • Signez « fichier caché » (Caché );
  • Signez « fichier système » (Système );
  • Signer « fichier d'archive » (Archive );
  • Type de fichier (fichier normal, répertoire, fichier spécial) ;
  • Propriétaire du fichier ;
  • Créateur de fichiers ;
  • Mot de passe pour accéder au fichier ;
  • Informations sur les opérations d'accès aux fichiers autorisées ;
  • Heure de création, dernier accès et dernière modification ;
  • Taille actuelle du fichier ;
  • Taille maximale du fichier ;
  • Signer « temporaire (supprimer une fois le processus terminé) » ;
  • Panneau de blocage.

Dans différents types de systèmes de fichiers, différents ensembles d'attributs peuvent être utilisés pour caractériser les fichiers (par exemple, dans un système d'exploitation mono-utilisateur, l'ensemble d'attributs ne contiendra pas de caractéristiques liées à l'utilisateur et à la sécurité (le créateur du fichier, le mot de passe pour accéder au fichier, etc.).

L'utilisateur peut accéder aux attributs en utilisant les fonctionnalités prévues à cet effet par le système de fichiers. En règle générale, vous pouvez lire les valeurs de n'importe quel attribut, mais n'en modifier que certains, par exemple, vous pouvez modifier les droits d'accès d'un fichier, mais vous ne pouvez pas modifier la date de création ou la taille actuelle du fichier.

Autorisations de fichiers

Définir des droits d'accès à un fichier revient à définir pour chaque utilisateur un ensemble d'opérations qu'il peut appliquer sur un fichier donné. Différents systèmes de fichiers peuvent avoir leur propre liste d'opérations d'accès différenciées. Cette liste peut inclure les opérations suivantes :

  • création de fichier.
  • destruction de fichiers.
  • écrire dans un fichier.
  • ouvrir un fichier.
  • fermer le dossier.
  • lecture à partir d'un fichier.
  • ajout de fichier.
  • recherche dans le fichier.
  • obtenir les attributs du fichier.
  • définition de nouvelles valeurs d’attribut.
  • renommer.
  • exécution du fichier.
  • lire un catalogue, etc.

Dans le cas le plus général des droits d'accès peut être décrit par une matrice de droits d'accès, dans laquelle les colonnes correspondent à tous les fichiers du système, les lignes correspondent à tous les utilisateurs, et à l'intersection des lignes et des colonnes les opérations autorisées sont indiquées :

Dans certains systèmes, les utilisateurs peuvent être divisés en catégories distinctes. Pour tous les utilisateurs d'une même catégorie, des droits d'accès uniformes sont définis, par exemple, dans le système UNIX, tous les utilisateurs sont divisés en trois catégories : le propriétaire du fichier, les membres de son groupe et tous les autres.

Travail de laboratoire n°10

SORTIE SUR DISQUE ET IMPRIMANTE

L'affichage simple des informations sur l'écran est utilisé dans presque tous les programmes, mais ses capacités sont quelque peu limitées. Même l'utilisation d'une pause temporaire pour permettre à l'utilisateur de lire tous les messages ne résout pas complètement le problème : une fois qu'un message quitte l'écran, il ne peut plus être lu sans redémarrer le programme.

De plus, les valeurs attribuées aux variables ne sont conservées que pendant la durée d'exécution du programme. Une fois le programme terminé, toutes les informations saisies sont perdues. Cela signifie que si, par exemple, vous avez saisi des informations sur votre collection de CD dans un tableau de variables de structure, elles seront perdues à la fermeture du programme et la prochaine fois que vous accéderez à votre ordinateur, vous devrez saisir à nouveau toutes les données.

Afin de sauvegarder des informations pour vous-même ou de familiariser d'autres personnes avec les résultats de votre programme, vous devez imprimer ces résultats sur papier. Et pour pouvoir accéder à tout moment aux données une fois saisies, il est nécessaire de sauvegarder les informations dans un fichier sur disque.

Qu'est-ce qu'une structure de fichier

Les données de sortie ne sont pas immédiatement envoyées au disque ou au périphérique d'impression, en fonction des instructions de sortie correspondantes. Au lieu de cela, ils accèdent d'abord à une zone de mémoire conçue pour le stockage temporaire d'informations appelée tampon. Et seulement lorsque le tampon est plein, les données sont envoyées au disque ou à l'imprimante (Fig. 1). Les données saisies à partir du disque vont également d'abord dans un tampon, d'où elles peuvent être affichées à l'écran ou attribuées en tant que valeur variable.

Afin d'envoyer ou de recevoir des données depuis un tampon, vous avez besoin d'une sorte de lien entre votre programme et le système d'exploitation de l'ordinateur. Ce lien est la structure du fichier.

Lorsqu'un programme ouvre un fichier pour travailler, il crée ainsi une structure spéciale en mémoire. Cette structure contient des informations

Riz. 1. Les données sont stockées dans un tampon pendant un certain temps

nécessaire à votre programme et à votre ordinateur pour sortir des données dans un fichier et entrer à partir d'un fichier, ainsi que pour imprimer des informations sur une imprimante.

Par exemple, la structure contient l'adresse d'un tampon de fichier afin que l'ordinateur sache où rechercher les informations que vous souhaitez afficher sur le disque ou où placer les données que vous souhaitez lire à partir du disque. De plus, cette structure stocke des informations sur le nombre de caractères restant dans le tampon, ainsi que la position du caractère suivant à la fois sorti et entrant dans le tampon (Fig. 2).


Riz. 2. La structure du fichier stocke les informations nécessaires à l'exécution normale des opérations sur les fichiers

Presque tous les compilateurs C et C++ stockent les informations nécessaires pour travailler avec les fichiers dans le fichier d'en-tête STDIO.H. Ce fichier contient les définitions des constantes nécessaires aux opérations sur les fichiers. De plus, il peut contenir une description de la structure du fichier. Afin d'utiliser les fonctions de travail avec des fichiers, le programme doit commencer par des instructions

#inclure,

qui rendra les constantes de fichiers et les descriptions de la structure des fichiers disponibles lors de la compilation et de la liaison du programme.

Lorsque vous saisissez des données à partir d'un fichier disque, elles sont copiées dans la mémoire de l'ordinateur ; les informations restant sur le disque ne changent pas pendant l'exécution du programme. Pour cette raison, les programmeurs appellent cette entrée en lisant données du fichier. Lors de la sortie de données sur disque, une copie des données stockées en mémoire est placée dans un fichier. Cette procédure est appelée enregistrement sur le disque.

Pointeur vers le fichier

L'entrée ou la sortie d'informations dans des fichiers est assurée à l'aide d'un pointeur de fichier, qui est un pointeur vers une structure de fichiers en mémoire. Lors de l'écriture d'informations dans un fichier ou de la lecture d'un fichier, le programme obtient les informations nécessaires de la structure. Le pointeur de fichier est défini comme suit :

FICHIER *file_pointer;

Le nom de la structure FILE indique au programme que la variable en cours de définition est un pointeur vers une structure de fichier. L'astérisque demande de créer un pointeur avec le nom de variable correspondant.

Si vous comptez utiliser plusieurs fichiers en même temps, vous avez besoin de pointeurs pour chacun d'eux. Par exemple, si vous écrivez un programme qui copie le contenu d'un fichier dans un autre, vous avez besoin de deux pointeurs vers les fichiers. Deux pointeurs sont également nécessaires si vous souhaitez lire les informations du disque et les imprimer sur une imprimante :

FICHIER *infile, *outfile;

Comment ouvrir un fichier

La connexion entre le programme et le fichier est établie à l'aide de la fonction fopen() dont la syntaxe est illustrée à la Fig. 3.

Cette fonction attribue l'adresse d'une structure à un pointeur. Le premier paramètre de cette fonction est le nom du fichier, qui doit être spécifié en fonction


Riz. 3. Syntaxe de la fonction fopen()

Certaines règles. Par exemple, dans le système d'exploitation MS-DOS, un nom de fichier peut comporter un maximum de huit caractères, plus une extension de nom de trois caractères maximum (l'extension n'est pas un élément obligatoire). Si vous souhaitez imprimer les informations sur un périphérique d'impression plutôt que sur un fichier disque, utilisez « PRN » comme nom de fichier entre guillemets. Dans ce cas, les données sont automatiquement sorties vers l'imprimante.

Le deuxième paramètre de la fonction est le mode d'accès au fichier, c'est-à-dire un message sur les opérations que l'utilisateur a l'intention d'effectuer avec le fichier. En C et C++, le paramètre qui détermine le mode d'accès est également placé entre guillemets. Les options suivantes sont possibles :

R - Indique ce qui sera exécuté en lisant informations d'un fichier dans la mémoire de l'ordinateur. Si le fichier n'existe pas déjà sur le disque, le programme signalera une erreur d'exécution.w - Indique qu'il sera exécuté enregistrer données sur disque ou sortie sur une imprimante. Si le fichier n'existe pas à ce stade, le système d'exploitation le créera. Si le fichier existe déjà sur le disque, toutes les informations actuellement écrites sur celui-ci seront détruites.a - Indique qu'il doit ajouter informations en fin de dossier. Si le fichier n'existe pas, le système d'exploitation le créera. Si elle existe, la nouvelle sortie sera ajoutée à la fin du fichier sans détruire le contenu actuel.

Par exemple, si vous souhaitez créer un fichier nommé CD.DAT pour stocker un catalogue de collections de CD, vous utiliserez les instructions suivantes :

FICHIER *cdfile;cdfile = fopen("CD.DAT", "w");

Si votre programme a besoin de lire un fichier plutôt que d'y écrire, utilisez la notation suivante :

FICHIER *cdfile;cdfile = fopen("CD.DAT", "r");

Notez que le nom du fichier et le caractère du mode d'accès sont placés entre guillemets doubles. C'est parce qu'ils sont transmis à fopen() sous forme de chaînes. Le nom du fichier peut être saisi à l'aide du clavier comme valeur d'une variable chaîne, puis le nom de cette variable peut être utilisé comme argument, sans guillemets.

Si vous souhaitez imprimer des informations sur votre collection sur une imprimante, utilisez la séquence d'instructions suivante :

FICHIER *cdfile;cdfile = fopen("PRN", "w");

Veuillez noter que la sortie des informations vers l'imprimante n'est possible qu'avec le mode d'accès « w ».

Comment C/C++ fonctionne avec les fichiers

C stocke des informations sur la position actuelle de lecture et d'écriture dans un fichier à l'aide d'un pointeur spécial.

Lors de la lecture d'informations à partir d'un fichier, le pointeur spécifie les prochaines données à lire à partir du disque. Lorsqu'un fichier est ouvert pour la première fois en utilisant le mode d'accès "r", le pointeur est placé sur le premier caractère du fichier. Lorsqu'une opération de lecture est effectuée, le pointeur se déplace vers la donnée suivante à lire. La taille du pas de mouvement dépend de la quantité d'informations lues en une seule fois (Fig. 4). Si un seul caractère est lu à la fois, le pointeur se déplacera vers le caractère suivant ; si une structure entière est lue, le pointeur se déplacera vers la structure suivante. Une fois toutes les informations lues dans le fichier, le pointeur se dirige vers un code spécial appelé caractère de fin de fichier La présence du caractère de fin de fichier n'est en réalité pas du tout nécessaire. Tenter de continuer la lecture après avoir atteint la fin du fichier entraînera une erreur d'exécution.

Si un fichier est ouvert avec le mode d'accès "w", le pointeur est également placé au début du fichier, de sorte que les premières données saisies seront placées au début du fichier. Lors de la fermeture d'un fichier, un caractère de fin de fichier sera ajouté après le tableau de données saisi. Si le fichier existe déjà au moment de son ouverture en mode d'accès « w », toutes les données qu'il contient sont écrasées et les nouvelles informations saisies par la procédure d'enregistrement sont écrites « par-dessus ». Toutes les données qui ne peuvent pas être détruites sont placées après le nouveau caractère de fin de fichier, de sorte qu'elles ne soient plus accessibles lors de la prochaine lecture des données du fichier. Ainsi, toute tentative d'écriture de données dans un fichier existant en utilisant le mode d'accès « w » entraînera la destruction des informations actuellement stockées dans celui-ci. Cela se produira même si le fichier est simplement ouvert et fermé sans écrire de données.

Si un fichier est ouvert en utilisant le mode d'accès "a", le pointeur est placé sur le caractère de fin de fichier. Les nouvelles données écrites dans un fichier sont placées après les données existantes, puis un caractère de fin de fichier est ajouté.

Comment fermer un fichier

Après avoir fini d'écrire ou de lire un fichier, vous devez le fermer, c'est-à-dire rompre la connexion entre le fichier et le programme. Cela se fait en utilisant les instructions

Fclose(file_pointer);

En fermant le fichier, nous obtenons la garantie que toutes les informations contenues dans le tampon sont effectivement écrites dans le fichier. Si l'exécution du programme se termine avant la fermeture du fichier, une partie des informations qui ne sont pas parvenues sur le disque peut rester dans le tampon, ce qui entraînera sa perte. De plus, le caractère de fin de fichier ne sera pas correctement écrit et le programme ne pourra pas accéder au fichier la prochaine fois.

Il faut ajouter que la fermeture d'un fichier libère le pointeur, après quoi il peut être utilisé avec un autre fichier ou pour effectuer d'autres opérations sur le même fichier. À titre d'exemple, disons que vous souhaitez créer un fichier, y écrire des données, puis vérifier que les informations sont écrites correctement. Pour ce faire, le programme peut utiliser la structure présentée dans le Listing1.

Listing 1. Utilisation d'un pointeur de fichier en deux opérations.

FILE *cdfile;if((cdfile = fopen("CD.DAT", "w")) == NULL) ( puts("Impossible d'ouvrir le fichier"); exit(); )/* Instructions pour écrire dans le fichier devrait aller ici */fclose(cdfile);if((cdfile = fopen("CD.DAT", "r")) == NULL) ( puts("Impossible d'ouvrir le fichier"); exit(); )/* À ce stade, vous devriez lire les instructions du fichier écrites */fclose(cdfile);

Ici, le fichier est d'abord ouvert en utilisant le mode d'accès "w", puis les données y sont écrites. La deuxième fois, le fichier est ouvert en utilisant le mode d'accès "r", qui permet de lire et d'afficher les données à l'écran.

Certains compilateurs vous permettent de vous assurer que toutes les données sont écrites dans un fichier en effaçant le tampon à l'aide de la fonction

Cette fonction vous permet d'effacer le tampon sans fermer le fichier et d'écrire toutes les données qu'il contient sur le disque ou de les envoyer à une imprimante.

Fonctions d'entrée et de sortie

Il existe plusieurs façons de transmettre des données vers et depuis un fichier, selon la fonction utilisée :

· écriture caractère par caractère des données dans un fichier ou sortie vers une imprimante à l'aide de la fonction putc() ou fputc() ;

· lecture caractère par caractère des données d'un fichier à l'aide de la fonction getc() ou fgetc() ;

· écrire des données ligne par ligne dans un fichier ou les envoyer à une imprimante à l'aide de la fonction fputs() ;

· lecture ligne par ligne des données d'un fichier à l'aide de la fonction fgets() ;

· sortie formatée de caractères, chaînes ou nombres sur disque ou sur une imprimante à l'aide de la fonction fprintf() ;

· entrée formatée de caractères, chaînes ou nombres à partir d'un fichier à l'aide de la fonction fscanf() ;

· écrire une structure entière en utilisant la fonction fwrite() ;

· lire une structure entière à l'aide de la fonction fread().

Travailler avec des symboles

Le transfert de données caractère par caractère est la forme la plus élémentaire d’opérations sur les fichiers. Bien qu'il ne s'agisse pas d'une des méthodes de traitement de l'information les plus utilisées dans la pratique, il illustre néanmoins bien les principes de base du travail avec des fichiers. Le programme ci-dessous écrit les données dans un fichier caractère par caractère et continue jusqu'à ce qu'une touche soit enfoncée. Entrer:

/*fputc.c*/#include main() ( FILE *fp; char letter; if((fp = fopen("MYFILE","w"))==NULL) ( puts("Impossible d'ouvrir le fichier") ; exit(); ) do ( lettre=getchar(); fputc(lettre, fp); ) while(lettre != "\r"); fclose(fp); )

Le fichier s'ouvre avec le mode d'accès "w". Si un fichier nommé MYFILE n'existe pas lors de l'exécution du programme, il sera créé. La boucle do utilise la fonction getchar() pour saisir une séquence de caractères, qui est ensuite écrite dans un fichier à l'aide de la fonction putc(). La syntaxe pour écrire putc() est :

Putc(char_variable, file_pointer);

La fonction fputc() peut également être utilisée avec les mêmes arguments.

La boucle s'exécute jusqu'à ce qu'une touche soit enfoncée Entrer, qui entre un code de retour chariot (\r), qui ferme le fichier.

Travailler avec des chaînes

Au lieu de travailler avec des caractères individuels, vous pouvez lire et écrire des lignes entières de texte à partir d'un fichier. L'écriture et la lecture ligne par ligne se font à l'aide des fonctions fputs() et fgets().

La fonction fputs() a la syntaxe suivante :

Fputs(string_variable, file_pointer);

Cette fonction écrit les données ligne par ligne dans un fichier ou les envoie à une imprimante, mais n'ajoute pas de code de « nouvelle ligne ». Pour que chaque ligne soit écrite sur le disque (ou imprimée sur une imprimante) véritablement comme une ligne distincte, vous devez saisir manuellement le code « nouvelle ligne ». Par exemple, le programme suivant crée un fichier de noms :

/*fputc.c*/#include main() ( FILE *fp; char flag; char name; if((fp = fopen("MYFILE","w"))==NULL) ( puts("Impossible d'ouvrir file "); exit(); ) flag = "y"; while(flag != "n") ( puts("Entrez un nom"); gets(name); fputs(name, fp); fputs("\ n" ,fp); printf("Voulez-vous saisir un nom différent ?"); flag=getchar(); putchar("\n"); ) fclose(fp); )

La boucle while continue jusqu'à ce que n soit saisi à l'invite. Dans cette boucle, le nom est saisi à partir du clavier à l'aide de la fonction gets(), après quoi le nom est écrit sur le disque à l'aide de la fonction fputs(). Ensuite, le code "nouvelle ligne" est écrit dans le fichier et enfin le programme demande à l'utilisateur s'il souhaite continuer à saisir les noms.

Si votre compilateur peut utiliser la fonction strlen(), vous pouvez simplifier quelque peu la procédure de saisie en utilisant les instructions suivantes :

Printf("Veuillez entrer un nom : ");gets(name);while(strlen(name) > 0) ( fputs(name, fp); fputs("\n", fp); printf("Veuillez entrer un nom : "); obtient(nom); )

Les caractères que vous tapez sur le clavier sont attribués au nom de la variable de chaîne, puis vérifiés pour voir si la longueur de la chaîne est 0. Si vous appuyez immédiatement sur Entrée lorsque vous y êtes invité, la chaîne aura une longueur de zéro et la boucle cessera de s'exécuter. . Si avant d'appuyer sur Entrer entrez au moins un caractère, la ligne et le code « nouvelle ligne » seront écrits sur le disque.

Certains compilateurs vous permettent de simplifier davantage l'algorithme de saisie de chaîne, par exemple, comme ceci :

Printf("Veuillez entrer un nom : ");while(strlen(gets(name)) > 0) ( fputs(name, fp); fputs("\n", fp); printf("Veuillez entrer un nom : " ); )

où la saisie de la ligne est effectuée dans la condition while.

Pour imprimer une chaîne sur une imprimante, le nom de fichier « prn » est utilisé au lieu de l'écrire sur le disque. Pour ouvrir un fichier, vous devez préciser :

Si ((fp = fopen("prn", "w")) == NULL)

Pour créer un programme d'impression, la longueur de la ligne est définie sur 81 caractères afin que la ligne puisse s'adapter à toute la largeur de l'écran avant d'appuyer sur une touche. Entrer. Le listing 2 est un programme qui montre comment écrire un simple traitement de texte. La ligne n'est pas envoyée à l'imprimante tant qu'une touche n'est pas enfoncée Entrer, qui vous permet d'utiliser la clé Retour arrière corriger les erreurs de saisie de ligne.

Listing 2. Programme de sortie d'une chaîne vers un périphérique d'impression.

/*wp.c*/#include "stdio.h"main() ( FILE *fp; char line; if ((fp = fopen("prn", "w")) == NULL) ( puts("Imprimante pas prêt à travailler"); exit(); ) puts("Entrez le texte, appuyez sur Entrée après chaque ligne\n"); puts("Pour arrêter de taper, appuyez sur Entrée au début d'une nouvelle ligne\n"); obtient (ligne) ; while (strlen(line) > 0) ( fputs(line, fp); fputs("\n", fp); gets(line); ) fclose(fp); )

Lignes de lecture

La lecture des lignes d'un fichier se fait à l'aide de la fonction fgets(). Syntaxe de la fonction :

Fgets(string_variable, longueur, file_pointer);

La fonction saisit la chaîne entière jusqu'au caractère de nouvelle ligne si sa longueur ne dépasse pas la valeur spécifiée dans le paramètre de longueur moins un caractère. Le paramètre de longueur est un entier, ou une constante ou une variable entière, indiquant le nombre maximum possible de caractères par ligne.

Vous trouverez ci-dessous un programme qui lit les noms du fichier créé dans l'exemple précédent :

/*fgets.c"/#include "stdio.h"main() ( FILE *fp; char name; if ((fp = fopen("MONFILE", "r")) == NULL) ( puts("Impossible ouvrir le fichier"); exit(); ) while(fgets(name, 12, fp) != NULL) ( printf(name); ) fclose(fp); )

La saisie est effectuée dans une boucle while jusqu'à ce que la valeur du caractère lu soit NULL. Une fois que le pointeur atteint la fin du fichier, la variable chaîne reçoit la valeur NULL. Lors de la lecture d'un fichier ligne par ligne, NULL est toujours utilisé pour indiquer la fin du fichier, et EOF est utilisé lors de la lecture caractère par caractère.

Si vous écrivez un programme pour lire n'importe quel fichier texte, spécifiez que l'argument de longueur est 80.

À propos, notez que la fonction printf() est utilisée dans cet exemple pour imprimer le contenu d'une variable chaîne sans spécificateurs de format. Chaque ligne lue dans le fichier inclut le code de nouvelle ligne qui a été écrit dans le fichier dans l'instruction fputs("\n", fp);, et aucun code de nouvelle ligne supplémentaire ne doit être inclus dans les paramètres de la fonction printf().

Listing 3. Sortie formatée.

/*fprintf.c*/#include "stdio.h"main() ( FILE *fp; nom du caractère; quantité int; coût flottant; if ((fp = fopen("MYFILE", "w")) == NULL ) ( puts("Le fichier ne peut pas être ouvert"); exit(); ) printf("Entrez le nom du produit : "); gets(name); while (strlen(name) > 0) ( printf("Entrez le nom du produit prix : ") ; scanf("%f", &cost); printf("Entrez le nombre d'unités du produit : "); scanf("%d", &quantité); fprintf(fp, "%s %f %d\ n", nom, coût, quantité); printf("Entrez le nom du produit : "); gets(name); ) fclose(fp); )

Veuillez noter que dans la dernière ligne de la boucle, le nom suivant est saisi. Cela vous permet d'arrêter de répéter le cycle en appuyant simplement sur une touche Entrer. Certains programmeurs débutants écriraient probablement la boucle comme ceci :

Do ( printf("Entrez le nom du produit : "); gets(name); printf("Entrez le prix : "); scanf("%f", &cost); printf("Entrez le nombre d'unités du produit : ") ; scanf(" %d", &quantité); fprintf(fp, "%s %f %d\n", nom, coût, quantité); )while (strlen(nom) > 0);

et ce programme fonctionnerait tout aussi bien, sauf qu'il faudrait appuyer sur une touche pour terminer la boucle Entrer trois fois : la première fois lors de la saisie du nom et deux fois supplémentaires en réponse à la demande de saisie du prix et de la quantité du produit.

Dans la boucle while, le prix et la quantité de chaque article sont saisis à l'aide de la fonction scanf() puis écrits sur le disque à l'aide de l'instruction

Fprintf(fp, "%s %f %d\n", nom, coût, quantité);

Notez que le code de nouvelle ligne est écrit dans le fichier à la fin de chaque ligne. Si vous affichez le contenu du fichier à l'aide de la commande TYPE du système d'exploitation MS-DOS, alors chaque ligne de la liste d'inventaire et à l'écran commencera par une nouvelle ligne :

Si le code de nouvelle ligne n'avait pas été écrit sur le disque, le texte aurait été imprimé consécutivement, sur une ligne à l'écran, et aurait ressemblé à ceci :

Disquettes 1,120000 100bandes 7,340000 150cartouches 75,000000 3

Veuillez noter qu'il n'y a pas d'espace entre le numéro indiquant le nombre d'unités d'un produit et le nom du suivant. Même avec cette méthode d'enregistrement, vous pouvez facilement lire ce fichier, puisque le compilateur est capable de faire la distinction entre la fin d'une valeur numérique et le début d'une ligne, mais que se passe-t-il si la dernière valeur de chaque nom de produit est une ligne avec le nom du fabricant ? Les informations contenues dans le fichier ressembleront à ceci :

Disquettes 1.120000 Bande Memoryex 7.340000 Cartouche Okaydata 75.000000 HP

puis, lors de la lecture des données d'un fichier, le programme ajoutera le début des données sur le produit suivant à la fin de la description du produit précédent. Par exemple, les données sur le premier nom du produit ressembleraient à ceci :

Disquettes 1.120000 Bande Memoryex

Toutes les données écrites sur le disque, même les valeurs int ou float, sont stockées sous forme de caractères de texte. Nous en reparlerons un peu plus tard.

Listing 4. Lecture de texte enrichi à partir d'un fichier.

/*fscanf.c*/#include "stdio.h"main() ( FILE *fp; nom du caractère; quantité int; coût flottant; if ((fp = fopen("MYFILE", "r")) == NULL ) ( puts("Impossible d'ouvrir le fichier"); exit(); ) while (fscanf(fp, "%s%f%d", nom, &coût, &quantité) != EOF) ( printf("Nom du produit : % s \n", nom); printf("Prix : %.2f\n", coût); printf("Nombre d'unités : %d\n", quantité); ) fclose(fp); )

Travailler avec des structures

Une façon de surmonter les limites de scanf() consiste à combiner des éléments de données dans une structure afin que des structures entières puissent être entrées et sorties ultérieurement. La structure peut être écrite sur le disque à l'aide de la fonction fwrite() et lue à partir d'un fichier à l'aide de la fonction fread().

La syntaxe de la fonction fwrite() est :

Fwrite(&structure_variable, structure_size, number_of_structures, file_pointer);

À première vue, cette instruction semble un peu intimidante, mais en fait elle est très simple à utiliser :

· &structure_variable - le nom d'une variable de structure avec un opérateur de réception d'adresse qui indique au compilateur l'adresse de départ des informations que nous voulons écrire sur le disque ;

· structure_size est le nombre de caractères dans la structure ; Vous n’êtes pas obligé de le calculer vous-même ; vous pouvez utiliser la fonction de bibliothèque sizeof(), écrite comme ceci :

Taille de (structure_variable)

qui déterminera automatiquement la taille de la structure spécifiée ;

· number_of_structures est un nombre entier qui détermine le nombre de structures que nous voulons écrire en même temps ; Le chiffre 1 doit toujours être spécifié ici, à moins que vous ne souhaitiez créer un tableau de structures et l'écrire dans un seul grand bloc ;

· file_pointer - pointeur vers le fichier.

À titre d'exemple, disons que vous souhaitez graver des informations sur votre collection de CD sur un disque. En utilisant la structure CD, dont nous avons parlé en détail plus tôt, nous écrivons l'instruction : fwrite(&disc, sizeof(disc), 1, fp);

L'exécution de cette instruction est illustrée sur la Fig. 5.

Le programme qui saisit les données dans une structure de CD puis les enregistre sur le disque est présenté dans le listing 12.5. La fonction gets() permet de saisir le nom du fichier à créer. La variable qui stocke le nom du fichier est utilisée par la fonction fopen() pour ouvrir le fichier.

Les informations sur chaque structure de CD sont saisies à partir du clavier, après quoi la structure entière est écrite sur le disque.



Riz. 5. Syntaxe de la fonction fwrite() dans l'instruction d'écriture de la structure CD

Listing 5. Enregistrement de la structure du CD.

/*fwrite.c*/#include "stdio.h"main() ( FILE *fp; struct CD ( nom du caractère; description du caractère; catégorie du caractère; coût flottant; numéro int; ) disque; nom du fichier char; printf("Entrer le nom du fichier que vous souhaitez créer : "); gets(filename); if ((fp = fopen(filename, "w")) == NULL) ( printf("Impossible d'ouvrir le fichier %s\n", filename); exit(); ) puts("Entrez les informations sur le disque\n"); printf("Entrez le nom du disque : "); gets(disc.name); while (strlen(disc.name) > 0) ( printf( "Entrez la description : "); gets(disc.description); printf("Entrez la catégorie : "); gets(disc.category); printf("Entrez le prix : "); scanf("%f", &disc.cost) ; printf ("Entrez le numéro de cellule : "); scanf("%d", &disc.number); fwrite(&disc, sizeof(disc), 1, fp); printf("Entrez le nom : "); gets(disc. nom) ; ) fclose(fp); )

Structures de lecture

Fread(&structure_variable, structure_size, nombre_de_structures, file_pointer);

À l'exception du nom de la fonction, cette instruction est exactement la même que la fonction fwrite(). Le programme qui lit la structure du CD à partir d'un fichier est présenté dans le listing 6. Pour lire les données, utilisez une boucle while :

Tandis que (fread(&disc, sizeof(disc), 1, fp) == 1)

La fonction fread() renvoie une valeur correspondant au nombre de structures lues avec succès. Puisque nous avons spécifié dans l'argument de la fonction que nous devons lire une structure à la fois, la fonction renvoie la valeur 1. La boucle while sera exécutée tant que la lecture des structures à partir du disque réussit. Si la structure ne peut pas être lue, par exemple parce que la fin du fichier est atteinte, la fonction renvoie 0 et la boucle se termine.

Listing 6. Lecture de la structure du CD à partir du disque.

/*fread.c*/#include "stdio.h"main() ( FILE *fp; struct CD ( nom du caractère; description du caractère; catégorie du caractère; coût flottant; numéro int; ) disque; nom du fichier char; printf("Entrer nom du fichier que vous souhaitez ouvrir : "); gets(filename); if ((fp = fopen(filename, "r")) == NULL) ( printf("Impossible d'ouvrir le fichier %s\n", filename ); exit (); ) while (fread(&disc, sizeof(disc), 1, fp) == 1) ( puts(disc.name); putchar("\n"); puts(disc.description); putchar ("\ n"); puts(disc.category); putchar("\n"); printf("%f", disque.cost); putchar("\n"); printf("%d", disque .numéro) ; ) fclose(fp); )

Dans le tableau 1 collecte toutes les méthodes décrites pour entrer et sortir des données et affiche les valeurs que chaque fonction renvoie s'il est impossible de continuer à lire ou à écrire des données.

Tableau 1. Fonctions d'entrée et de sortie d'un fichier.

Lire dans un tableau

Tous les exemples de programmes présentés jusqu'à présent ont lu les données d'un fichier et affiché l'entrée à l'écran. Cependant, si vous lisez des données dans des variables, vous pouvez effectuer n'importe quelle opération sur celles-ci, par exemple les utiliser pour écrire dans un tableau.

Le listing 7 montre le texte d'un programme qui lit les informations d'un fichier contenant des données sur une collection de CD dans un tableau de structures de CD (en supposant qu'il n'y en ait pas plus de 20). L'index est utilisé pour garantir que chaque structure lue à partir d'un fichier est stockée dans un élément distinct de la matrice de disques. Une fois la structure suivante lue et affichée, le coût du disque suivant est ajouté au montant reflétant le coût total de la collection, et l'index et le compteur sont incrémentés en exécutant les instructions suivantes :

Total = total + disque.cost;index++;count++;

Si nous étions uniquement intéressés par des informations sur le coût total et le nombre d'instances de la collection, nous pourrions lire les données dans une variable de structure sans utiliser de tableau et simplement compter les valeurs du total et compter les variables. Cependant, si les données sont lues dans un tableau, vous pouvez accéder arbitrairement aux structures et imprimer n'importe quelle information.

Notez que le programme répète l'invite d'un nom de fichier jusqu'à ce que vous saisissiez un nom de fichier qui peut réellement être ouvert.

Listing 7. Lecture d'une structure dans un tableau.

/*rarray.c*/#include "stdio.h"main() ( FILE *fp; struct CD ( nom du caractère; description du caractère; catégorie du caractère; coût flottant; numéro int; ) disque; index int, nombre; total flottant ; count = 0; total = 0; char filename; printf("Entrez le nom du fichier de données : "); gets(filename); while ((fp = fopen(filename, "r")) == NULL) ( printf(" Impossible d'ouvrir le fichier %s\n", nom de fichier); printf("Entrez le nom du fichier de données : "); gets(filename); ) index = 0; while (fread(&disc, sizeof(disc), 1, fp) = = 1) ( puts(disc.name); putchar("\n"); puts(disc.description); putchar("\n"); puts(disc.category); putchar("\n"); printf ( "%f", coût du disque); putchar("\n"); printf("%d", numéro du disque); total = total + coût du disque; index++; nombre++; ) fclose(fp); printf ( "La valeur totale de la collection est %.2f\n", total); printf("La collection contient %.d disques\n", count); )

Listing 8. Programme pour copier le contenu d'un fichier.

/*filecopy.c*/#include "stdio.h"main() ( FILE *fp1, *fp2; char infile, outfile; int letter; printf("Entrez le nom du fichier à lire : "); gets(infile); if ((fp1 = fopen(infile, "r")) == NULL) ( printf("Impossible d'ouvrir le fichier %s", infile); exit(); ) printf("Entrez le nom du fichier à écrire : ") ; obtient (outfile); if ((fp2 = fopen(infile, "w")) == NULL) ( printf("Impossible d'ouvrir le fichier %s", outfile); fclose(fp1); exit(); ) while ((lettre = fgetc(fp1)) != EOF) ( putchar(lettre); fputc(lettre, fp2); ) fclose(fp1); fclose(fp2); )

Le premier fichier est ouvert avec le mode d'accès "r" afin que les données puissent y être lues. Si le fichier ne peut pas être ouvert, le programme se termine. Le deuxième fichier s'ouvre avec le mode d'accès "w", qui vous permet d'écrire dans


Riz. 6. La fonction fprintf() écrit des valeurs numériques sous forme de caractères de texte

lui des données. Si le deuxième fichier ne peut pas être ouvert, le premier fichier est fermé avant la fermeture du programme. Cela nous donne la garantie que le premier fichier, s'il a été ouvert avec succès, ne sera pas endommagé à la sortie du programme.

La fonction fprintf() écrit toutes les données sous forme de texte. Par exemple, si vous utilisez fprintf() pour écrire le nombre 34,23 sur le disque, cinq caractères seront écrits comme indiqué sur la Fig. 6. Si la fonction fscanf() est ensuite utilisée pour lire les données d'un fichier, les caractères seront convertis en valeur numérique et écrits dans une variable sous cette forme.

Étant donné que la fonction fprintf() écrit les données sous forme de texte, la lecture à partir d'un fichier peut également être effectuée à l'aide des fonctions getc(), fgetc() ou fgets(). Cependant, ces fonctions liront les informations sous forme de caractères « imprimables ». Par exemple, si vous utilisez la fonction fgets(), les nombres seront lus comme des caractères faisant partie d'une chaîne. Lors de l'affichage ou de l'impression de données lues à l'aide de fgets() ou fgetc(), vous ne pourrez pas effectuer d'opérations arithmétiques sur des éléments de données individuels.

Format binaire

La fonction fwrite() est utilisée pour enregistrer des variables numériques au format binaire. Les données écrites de cette manière occuperont la même quantité d’espace sur le disque qu’en mémoire. Si nous visualisons le contenu d'un tel fichier à l'aide de la commande TYPE, nous verrons des lettres et des icônes dénuées de sens à la place des valeurs numériques. Ce sont des caractères ASCII équivalents aux valeurs écrites dans le fichier.

Pour lire un fichier écrit avec fwrite(), vous devez utiliser la fonction fread(). Les données doivent être saisies dans une structure dont la structure correspond aux données précédemment enregistrées. La structure peut avoir un nom différent et les noms des membres de la structure peuvent également différer, mais l'ordre, les types et les tailles des membres des deux structures doivent être les mêmes.

Imprimer les données

D'un point de vue technique, vous pouvez sortir des données vers une imprimante en utilisant n'importe quelle fonction de sortie : caractère par caractère, ligne par ligne, chaînes ou structures formatées. La seule chose requise est de spécifier le nom du fichier "prn" et le mode d'accès "w".

Cependant, l'impression "structurelle" à l'aide de la fonction fwrite() n'est pratiquement pas utilisée, puisque les données numériques seront imprimées au format binaire sous forme de caractères cryptés. Au lieu de cela, la fonction fprintf() est utilisée pour imprimer les structures, comme le montre le listing 9. Ce programme ouvre deux fichiers : le fichier disque est ouvert en lecture et le fichier imprimante est ouvert en sortie.

Listing 9. Lecture et impression du contenu d'un fichier disque.

Chaque structure est saisie dans son ensemble par la fonction fread(), après quoi les membres individuels de la structure sont imprimés à l'aide de la fonction fprintf(). La fonction fread() peut lire des chaînes contenant des espaces, elle est donc préférable à l'utilisation de la fonction fscanf().

Instructions

Fprintf(ptr, "\n\n");

afficher deux lignes vides entre les structures de CD individuelles.

Conception du programme

Savoir écrire et lire dans un fichier disque ouvre la possibilité de créer des applications complexes. Tous les programmes qui ont démontré la saisie de données à partir d'un fichier disque lisent l'intégralité du fichier. Mais vous pouvez imaginer une situation dans laquelle vous souhaiteriez traiter les données d’une autre manière.

Par exemple, vous devrez peut-être analyser un fichier disque pour une entrée spécifique. Dans ce cas, vous devez ouvrir le fichier avec le mode d'accès "r", puis utiliser une boucle pour saisir progressivement les données, structure par structure ou ligne par ligne, selon le type d'informations écrites dans le fichier. Lors de chaque itération de la boucle, les valeurs des données d'entrée sont comparées aux valeurs recherchées. Pour vérifier les valeurs des chaînes, utilisez la fonction strcmp(), si votre compilateur le permet, bien sûr. Une fois les données requises trouvées, elles s'affichent à l'écran, après quoi le fichier est fermé.