CONFÉRENCIER: Jusqu'à présent, il est probable que la plupart de vos programmes ont été un peu éphémère. Vous exécutez un programme comme Mario ou Greedy. Il fait quelque chose, il invite peut-être l'utilisateur pour certaines informations, imprimer une certaine sortie à l'écran, mais alors quand votre programme est fini, il n'y a vraiment aucune preuve il il n'a jamais été exécuté en premier lieu. Je veux dire, bien sûr, vous pourriez avoir laissé il ouvrir dans la fenêtre de terminal, mais si vous désactivez votre écran, il ya vraiment aucune preuve qu'il existait. Nous ne disposons pas d'un moyen de stockage informations persistantes, des informations qui existe après notre programme a cessé de fonctionner, ou avons-nous pas jusqu'à ce point. Heureusement cependant, c fait nous fournir la capacité pour ce faire en mettant en œuvre quelque chose appelé un fichier, une structure que, fondamentalement, représente un fichier que vous souhaitez doubler cliquez sur votre ordinateur, si vous êtes utilisé pour un environnement graphique utilisateur. En général, lorsque l'on travaille avec c, nous sommes en fait va travailler avec pointeurs vers files-- fichier stars-- sauf pour un peu lorsque nous parlons d'un couple des fonctions que travailler avec des pointeurs de fichiers. Vous ne devez pas avoir vraiment creusé trop profondément dans la compréhension des pointeurs eux-mêmes. Il ya un peu Teeny où nous allons en parler, mais le fichier général des pointeurs et pointeurs, tandis que interdépendants, ne sont pas exactement la même chose. Maintenant, qu'est-ce que je veux dire quand Je dis données persistantes? Qu'est-ce que les données persistantes? Pourquoi nous soucions-nous à ce sujet? Supposons, par exemple, que vous exécutez un programme ou si vous avez réécrit une programme qui est un jeu, et vous voulez garder une trace de l'ensemble des mouvements de l'utilisateur de sorte que peut-être si quelque chose va mal, vous pouvez consulter le fichier après le match. Voilà ce que nous entendons lorsque nous parler de données persistantes. Au cours de l'exécution de votre programme, un fichier est créé. Et lorsque votre programme a cessé de fonctionner, ce fichier existe toujours sur votre système. Et nous pouvons regarder et examiner. Et si ce programme serait mis à ont créé des données persistantes, il existe des données après le programme a terminé l'exécution. Maintenant, toutes ces fonctions qui travaillent avec la création et la manipulation de fichiers de diverses façons vivre dans io.h standard, qui est un fichier d'en-tête vous avez probablement été la livre y compris au sommet de la jolie bien tous vos programmes car il contient l'un des la plupart des fonctions utiles pour nous, printf, qui permet également de vit en io.h. norme Donc, vous ne devez pas inclure marteler tous les fichiers supplémentaires probablement afin de travailler avec des pointeurs de fichiers. Maintenant, chaque fonction de pointeur de fichier, ou O, sortie chaque fichier I / entrée fonction, accepte comme une de ses paramètres ou des entrées un pointer-- de fichier, sauf pour un, fopen, qui est ce que vous utilisez pour obtenir le fichier pointeur en premier lieu. Mais après que vous avez ouvert la fichier et vous obtenez des pointeurs de fichiers, vous pouvez ensuite les transmettre comme arguments aux diverses fonctions nous allons parler aujourd'hui, ainsi que beaucoup d'autres de sorte que vous pouvez travailler avec des fichiers. Donc, il ya six jolie ceux de base communs que nous allons parler aujourd'hui. fopen et son compagnon fonction fclose, fgetc et son fputc fonction de compagnon, et fread et sa fonction de compagnon, fwrite. Donc, nous allons aller droit au but. fopen-- que fait-il? Eh bien, il ouvre un fichier et il vous donne un pointeur de fichier à elle, de sorte que vous pouvez ensuite utiliser ce pointeur du fichier comme argument à tout de l'autre fichier de fonctions d'E / S. La chose la plus importante à retenir avec fopen est que, après avoir ouvert le déposer ou fait un appel comme celui là, vous devez vérifier pour vous assurer que le pointeur que vous avez obtenu de retour est pas égal à null. Si vous ne l'avez pas regardé la vidéo sur pointeurs, cela pourrait ne pas donner un sens. Mais si vous essayez de déréférencer un rappel de pointeur nul, votre programme sera probablement souffrir une segmentation [inaudible]. Nous voulons nous assurer que nous obtenu un pointeur de retour légitime. La grande majorité du temps nous allons avoir obtenu un pointeur légitime retour et il ne sera pas un problème. Alors, comment pouvons-nous lançons un appel à fopen? Il ressemble beaucoup à cela. Étoiles du fichier ptr-- PTR étant un générique nommer pour le fichier pointer-- fopen et nous passons deux choses, un nom de fichier et une opération, nous voulons entreprendre. Donc, nous pourrions avoir un appel qui ressemble this-- ptr fichier étoiles 1 est égal à fopen file1.txt. Et l'opération, je l'ai choisi est r. Alors, que pensez-vous r est ici? Quels sont les types de choses que nous pourrait être en mesure de le faire à des fichiers? Donc, r est l'opération qui nous choisir quand nous voulons lire un fichier. Donc, nous le ferions essentiellement lorsque nous faisons un appel comme celui- être nous obtenir un pointeur de fichier de telle sorte que nous pourrions alors lire les informations de file1.txt. De même, nous pourrions ouvrir le fichier 2.txt pour l'écriture et pour que nous puissions passer ptr2, Le pointeur de fichier, je l'ai créé ici, comme un argument pour toute fonction qui écrit des informations dans un fichier. Et même à l'écriture, il ya également la possibilité de joindre une. La différence entre l'écriture et l'ajout étant que lorsque vous écrivez dans un fichier, si vous effectuez un appel à la fonction fopen pour l'écriture et que ce fichier existe déjà, il est va écraser le fichier entier. Il va commencer au tout début, Suppression de toutes les informations qui est déjà là. Alors que si vous l'ouvrez pour annexer, il ira à la fin du fichier si il ya déjà dans le texte ou informations qu'il contient, et il sera alors commencer l'écriture à partir de là. Donc, vous ne perdrez pas de la informations que vous avez fait avant. Que vous voulez écrire ou ajouter sorte de dépend de la situation. Mais vous savez probablement ce que le bonne opération est le moment venu. Voilà donc fopen. Qu'en est-il fclose? Eh bien, assez simplement, fclose accepte simplement le pointeur de fichier. Et comme vous vous en doutez, il ferme ce fichier. Et une fois que nous avons fermé un fichier, nous ne pouvons pas effectuer plus fichier fonctions d'E / S, lire ou écrire, sur ce fichier. Nous devons rouvrir le déposer une autre fois pour continuer à travailler avec à l'aide de fonctions d'E / S. Donc moyens FCLOSE nous fait travailler avec ce fichier. Et tout ce que nous devons adopter en est le nom d'un pointeur de fichier. Donc, il ya un couple glisse, nous fopened fichier texte 1 point pour la lecture et que nous avons attribué pointeur de fichier ptr1. Maintenant, nous avons décidé que nous sommes fait la lecture de ce fichier. On n'a pas besoin d'en faire plus avec elle. Nous ne pouvons tout simplement ptr1 fclose. Et de même, pourrions-nous fclose les autres. Bien. Voilà donc l'ouverture et la fermeture. Ce sont les deux base le début des opérations. Maintenant, nous voulons effectivement faire des choses intéressantes, et la première fonction que nous allons voir qui va le faire est fgetc-- déposer obtenir un caractère. Voilà ce que fgetc général se traduirait. Son but dans la vie est de lire le caractère suivant, ou si cela est votre très premier appel à fgetc pour un fichier particulier, le premier caractère. Mais alors après cela, vous obtenez le prochain, le caractère très prochaine de ce fichier, et le stocke dans une variable de caractère. Comme nous l'avons fait ici, char ch égale fgetc, passer dans le nom d'un pointeur de fichier. Encore une fois, il est très important ici de rappeler que, pour avoir cette opération réussit, le pointeur de fichier lui-même a dû été ouvert en lecture. Nous ne pouvons pas lire un caractère à partir d'un fichier pointeur que nous avons ouvert pour l'écriture. Voilà donc l'un des limitations de la fonction fopen, non? Nous avons pour restreindre nous seulement à effectuer une opération avec un pointeur de fichier. Si nous voulions lire et écrire à partir du même fichier, nous aurions ouvert deux séparés pointeurs de fichiers à la même file-- l'un pour la lecture, l'un pour l'écriture. Encore une fois, la seule raison Je soulever cette question est maintenant parce que si nous allons faire un appel à fgetc, ce fichier pointeur dű été ouvert en lecture. Et puis, assez simplement, tout ce que nous devons faire est passe dans le nom du fichier pointeur. Donc ch omble égale ptr1 fgetc. Cela va nous faire la prochaine character-- ou encore, si tel est le premier fois que nous avons fait cet appel, le premier character-- de quelque fichier est pointé par ptr1. Rappelons que ce fut fichier texte 1 point. Il obtiendra le premier caractère de cette et nous les stockons dans le ch variable. Assez simple. Donc, nous avons seulement regardé à trois fonctions et déjà nous peut faire quelque chose assez soignée. Donc, si nous prenons cette capacité d'obtenir un personnage et on boucle it-- donc nous continuer à obtenir caractères à partir d'un fichier au- encore et maintenant nous over-- peut lire chaque simple le caractère d'un fichier. Et si nous imprimons tous les personnages immédiatement après nous le lisons, nous avons maintenant lire un fichier et imprimé son contenu à l'écran. Nous avons effectivement concaténées ce fichier sur l'écran. Et qui est ce que le Linux commande cat fait. Si vous tapez chat dans le nom du fichier, il permet d'imprimer sur la totalité du contenu du fichier dans la fenêtre de votre terminal. Et donc cette petite boucle ici, seulement trois lignes de code, mais il duplique en fait la commande cat Linux. Donc, cette syntaxe pourrait regarder un peu bizarre, mais voici ce qui se passe ici. Bien ch égale fgetc, ptr est pas égale à EOF-- il est toute une bouchée, mais nous allons décomposer tout Il est donc clair sur la syntaxe. Je l'ai consolidés, elle pour des raisons d'espace, même si elle est un peu syntaxiquement délicate. Donc cette partie du chef verte maintenant, que fait-il? Eh bien, voilà tout notre appel de fgetc, non? Nous avons vu cela avant. Il est l'obtention d'un caractère du fichier. Puis nous comparons ce que caractère contre EOF. EOF est une valeur spéciale qui est défini dans io.h standard, qui est le caractère de fin de fichier. Donc, fondamentalement, ce qui va se passer est cette boucle va lire un caractère, le comparer à du folklore, la caractère de fin de fichier. Si elles ne correspondent pas, donc nous avons pas atteint la fin du fichier, nous imprimons ce personnage hors. Ensuite, nous allons revenir à la à partir de la boucle à nouveau. Nous aurons un caractère, vérifions contre EOF, imprimer, etc. Ainsi de suite, une boucle à travers de cette façon jusqu'à ce que nous avons atteint la fin du fichier. Et puis en ce moment, nous avons imprimé sur l'intégralité du contenu du fichier. Encore une fois, nous avons seulement vu fopen, fclose, et fgetc et déjà nous pouvons le reproduire une commande de terminal Linux. Comme je l'ai dit au début, nous avions fgetc et fputc, et fputc était le compagnon fonction de fgetc. Et donc, comme vous pouvez l'imaginer, il est l'équivalent de l'écriture. Il nous permet d'écrire une seul caractère dans un fichier. Encore une fois, la mise en garde étant, tout simplement comme il était avec fgetc, le fichier que nous écrivant à dű ętre ouvert en écriture ou en ajout. Si nous essayons et utilisons fputc sur un fichier que nous avons ouvert pour la lecture, nous allons souffrir un peu d'une erreur. Mais l'appel est assez simple. capitale fputc Un ptr2, tout cela va se faire est qu'il est va écrire la lettre en A dans le fichier 2 points texte, qui est le nom de la fichier qui nous avons ouvert et assigné le pointeur à ptr2. Donc, nous allons écrire une Une capitale à déposer 2 texte de dot. Et nous écrirons une exclamation Pointer vers un fichier 3 points texte, qui a été pointée par ptr3. Encore une fois, assez simple ici. Mais maintenant, nous pouvons faire autre chose. Nous avons cet exemple Nous allions plus d'être en mesure de reproduire le chat Commande de Linux, celui qui imprime à l'écran. Eh bien, maintenant que nous avons la capacité à lire les caractères à partir de fichiers et écrire des caractères dans les fichiers, pourquoi ne nous substituons pas juste que appeler à printf avec un appel à fputc. Et maintenant, nous avons dupliqué cp, une commande très basique Linux dont nous avons parlé long chemin Il ya dans le Linux commandes vidéo. Nous avons effectivement dupliqué ce droit ici. Nous lecture d'un caractère et alors nous sommes écrit ce personnage à un autre fichier. La lecture d'un fichier, l'écriture à un autre, encore et encore et encore jusqu'à ce que nous avons atteint EOF. Nous avons à la fin de la déposer nous essayons de copier. Et que nous aurons tous écrits des personnages que nous devons le fichier que nous écrivant à. Donc, cela est cp, la commande de copie Linux. Au tout début de cette vidéo, je devais la mise en garde que nous allions parler un peu de pointeurs. Voici précisément où nous en sommes allons parler de pointeurs en plus de déposer des pointeurs. Donc, cette fonction semble un peu effrayant. Il a obtenu plusieurs paramètres. Il ya beaucoup de choses ici. Il ya beaucoup de différents les couleurs et les textes. Mais vraiment, il est juste le version générique de fgetc qui nous permet d'obtenir tout quantité d'informations. Il peut être un peu inefficace si nous sommes obtenir caractères un à la fois, itérer le fichier un caractère à la fois. Serait-il pas agréable d'obtenir 100 à un moment ou 500 à la fois? Eh bien, fread et sa fonction de compagnon fwrite, dont nous parlerons dans un second, nous permettent de faire exactement cela. Nous pouvons lire une quantité arbitraire de l'information à partir d'un fichier et nous le stocker quelque part temporairement. Au lieu d'être en mesure de simplement l'adapter à une seule variable, nous pourrions avoir besoin de le stocker dans un tableau. Et donc, nous passons sur quatre arguments pour fread-- un pointeur à l'endroit où nous sommes aller à stocker des informations, la taille de chaque unité d'information sera, combien d'unités d'informations nous voulons acquérir, et à partir de quel fichier que nous voulons pour les obtenir. Probablement mieux illustré avec un exemple ici. Donc, disons que nous déclarons un tableau de 10 entiers. Nous venons déclarés sur les empiler arbitrairement int arr 10. Voilà donc assez simple. Maintenant, ce que nous faisons est le bien frecall est que nous sommes en train de lire taille de int fois 10 octets d'informations. Taille de int être four-- qui est la taille d'un entier c. Donc, ce que nous faisons est que nous lisons 40 octets d'une valeur de l'information à partir du fichier pointé par ptr. Et nous allons stocker les 40 octets quelque part où nous avons mis de côté 40 octets d'une valeur de mémoire. Heureusement, nous avons déjà fait par déclarant arr, ce tableau là. Qui est capable de retenue 10 unités sur quatre octets. Donc au total, elle peut contenir 40 octets valeur de l'information. Et nous sommes maintenant en train de lire 40 octets de l'information à partir du fichier, et nous allons stocker dans arr. Rappel de la vidéo sur les pointeurs que le nom d'un tableau, comme arr, est vraiment juste un pointeur à son premier élément. Alors, quand nous passons arr là, nous sont, en fait, en passant dans un pointeur. De même que nous pouvons faire this-- nous ne faisons pas nécessairement besoin pour sauver notre tampon sur la pile. Nous pourrions également allouer dynamiquement Un tampon de ce type, en utilisant malloc. Rappelez-vous, lorsque nous allouer dynamiquement la mémoire, nous économisons sur le tas, pas la pile. Mais il est encore un tampon. Il reste, dans ce cas, est tenant 640 octets d'informations car une double prend huit octets. Et nous demandons 80 d'entre eux. Nous voulons avoir l'espace de tenir 80 chambres doubles. Ainsi, la figure 8 est 80 fois 640 octets d'informations. Et cet appel à fread est collecte 640 octets d'informations à partir du fichier pointé par PTR et le stockant maintenant dans arr2. Maintenant, nous pouvons également traiter fread tout comme un appel à fgetc. Dans ce cas, nous essayons juste de obtenir un caractère du fichier. Et nous ne devons pas un tableau contenant un caractère. Nous pouvons simplement stocker dans une variable de caractère. Le hic, cependant, est que quand nous avons juste une variable, nous avons besoin de passer dans le Adresse de cette variable parce que le rappel premier argument de fread est un pointeur vers l'emplacement mémoire et où nous voulons stocker les informations. Encore une fois, le nom d'un tableau est un pointeur. Donc, nous ne devons faire ensemble esperluette. Mais c, le caractère c ici, est pas un tableau. Il est juste une variable. Et donc nous avons besoin de passer un esperluette c pour indiquer que ce est l'adresse où nous voulons à stocker un octet de cette information, celui-ci que caractère nous recueillons de ptr. Fwrite-- je vais passer en revue cela un peu plus quickly-- est à peu près la exact équivalent de fread sauf qu'il est pour l'écriture la place de la lecture, tout simplement comme le other-- nous avons eu ouverte et à proximité, obtenir un caractère, écrire un caractère. Maintenant, il est arbitraire obtenir quantité d'information, quantité arbitraire droit à l'information. Ainsi, tout comme avant, nous pouvons avoir un tableau de 10 entiers où nous avons déjà informations stockées, peut-être. Il était probablement quelques lignes de code qui devrait aller entre ces deux où je remplis avec l'arr quelque chose de significatif. Je remplis avec 10 entiers différents. Et à la place, ce que je suis faire est d'écrire à partir arr et la collecte de l'information à partir arr. Et je vais prendre cette information et de le mettre dans le fichier. Donc, au lieu d'être à partir de le fichier dans la mémoire tampon, Maintenant, nous allons partir la mémoire tampon dans le fichier. Donc, il est juste l'inverse. Donc encore une fois, comme avant, nous pouvons ont aussi un morceau de tas de mémoire que nous avons dynamiquement alloué et lire à partir de cette et d'écrire que dans le fichier. Et nous avons aussi une seule variable capable de contenir un octet de l'information, comme un caractère. Mais encore une fois, nous avons besoin de passer à l'adresse de cette variable quand on veut lire. Donc, nous pouvons écrire l'information nous trouvons à cette adresse le pointeur de fichier, PTR. Il ya beaucoup d'autres fonctions d'E / S grande fichiers que faire des choses différentes en plus ceux dont nous avons parlé aujourd'hui. Un couple de ceux vous pourriez trouver utiles sont fgets et fputs, qui sont l'équivalent de fgetc et fputc mais pour la lecture une chaîne unique à partir d'un fichier. Au lieu d'un seul caractère, il va lire une chaîne entière. fprintf, qui permet essentiellement vous utilisez printf écrire dans le fichier. Donc, comme vous pouvez faire la la substitution de variable en utilisant Les espaces réservés pour cent i et pour cent d, et ainsi de suite, avec printf vous pouvez de même prendre la chaîne de printf et quelque chose d'impression comme ça pour un fichier. fseek-- si vous avez un lecteur DVD est l'analogie que je prends habituellement ici-- est un peu comme l'aide de votre rembobinage et avance rapide boutons pour déplacer le film. De même, vous pouvez déplacer le fichier. Une des choses à l'intérieur que la structure de fichier que c crée pour vous est un indicateur d'où vous êtes dans le fichier. Êtes-vous à la très commençant à zéro octet? Êtes-vous à l'octet 100, octet 1000, et ainsi de suite? Vous pouvez utiliser fseek de se déplacer arbitrairement cet indicateur avant ou en arrière. Ftell et, encore une fois similaire à un lecteur de DVD, est comme une petite horloge qui indique vous combien de minutes et vous secondes sont dans un film en particulier. De même, ftell vous explique comment le nombre d'octets que vous êtes dans le fichier. feof est une version différente de détecter si vous avez atteint la fin du fichier. Et ferror est une fonction que vous pouvez utiliser pour détecter si quelque chose doit mal tourné travail avec un fichier. Encore une fois, ceci est juste rayer la surface. Il ya encore beaucoup plus de fichiers I / O fonctions dans la norme io.h. Mais ce ne sera probablement vous commencé à travailler avec des pointeurs de fichiers. Je suis Doug Lloyd. Ceci est CS50.