1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> CONFÉRENCIER: Jusqu'à présent, il est probable que la plupart de vos programmes 3 00:00:07,870 --> 00:00:10,170 ont été un peu éphémère. 4 00:00:10,170 --> 00:00:13,310 Vous exécutez un programme comme Mario ou Greedy. 5 00:00:13,310 --> 00:00:17,350 Il fait quelque chose, il invite peut-être l'utilisateur pour certaines informations, 6 00:00:17,350 --> 00:00:20,400 imprimer une certaine sortie à l'écran, mais alors quand votre programme est fini, 7 00:00:20,400 --> 00:00:23,252 il n'y a vraiment aucune preuve il il n'a jamais été exécuté en premier lieu. 8 00:00:23,252 --> 00:00:25,960 Je veux dire, bien sûr, vous pourriez avoir laissé il ouvrir dans la fenêtre de terminal, 9 00:00:25,960 --> 00:00:29,770 mais si vous désactivez votre écran, il ya vraiment aucune preuve qu'il existait. 10 00:00:29,770 --> 00:00:33,720 Nous ne disposons pas d'un moyen de stockage informations persistantes, des informations 11 00:00:33,720 --> 00:00:36,890 qui existe après notre programme a cessé de fonctionner, 12 00:00:36,890 --> 00:00:39,241 ou avons-nous pas jusqu'à ce point. 13 00:00:39,241 --> 00:00:41,490 Heureusement cependant, c fait nous fournir la capacité 14 00:00:41,490 --> 00:00:44,220 pour ce faire en mettant en œuvre quelque chose appelé 15 00:00:44,220 --> 00:00:48,330 un fichier, une structure que, fondamentalement, représente un fichier que vous souhaitez doubler 16 00:00:48,330 --> 00:00:53,826 cliquez sur votre ordinateur, si vous êtes utilisé pour un environnement graphique utilisateur. 17 00:00:53,826 --> 00:00:55,700 En général, lorsque l'on travaille avec c, nous sommes en fait 18 00:00:55,700 --> 00:00:59,965 va travailler avec pointeurs vers files-- fichier stars-- 19 00:00:59,965 --> 00:01:02,090 sauf pour un peu lorsque nous parlons d'un couple 20 00:01:02,090 --> 00:01:04,560 des fonctions que travailler avec des pointeurs de fichiers. 21 00:01:04,560 --> 00:01:08,990 Vous ne devez pas avoir vraiment creusé trop profondément dans la compréhension des pointeurs 22 00:01:08,990 --> 00:01:09,730 eux-mêmes. 23 00:01:09,730 --> 00:01:12,870 Il ya un peu Teeny où nous allons en parler, 24 00:01:12,870 --> 00:01:18,090 mais le fichier général des pointeurs et pointeurs, tandis que interdépendants, 25 00:01:18,090 --> 00:01:20,290 ne sont pas exactement la même chose. 26 00:01:20,290 --> 00:01:22,440 >> Maintenant, qu'est-ce que je veux dire quand Je dis données persistantes? 27 00:01:22,440 --> 00:01:23,650 Qu'est-ce que les données persistantes? 28 00:01:23,650 --> 00:01:25,232 Pourquoi nous soucions-nous à ce sujet? 29 00:01:25,232 --> 00:01:27,190 Supposons, par exemple, que vous exécutez un programme 30 00:01:27,190 --> 00:01:29,850 ou si vous avez réécrit une programme qui est un jeu, 31 00:01:29,850 --> 00:01:32,960 et vous voulez garder une trace de l'ensemble des mouvements de l'utilisateur 32 00:01:32,960 --> 00:01:36,620 de sorte que peut-être si quelque chose va mal, vous pouvez consulter le fichier après le match. 33 00:01:36,620 --> 00:01:39,970 Voilà ce que nous entendons lorsque nous parler de données persistantes. 34 00:01:39,970 --> 00:01:43,930 >> Au cours de l'exécution de votre programme, un fichier est créé. 35 00:01:43,930 --> 00:01:45,680 Et lorsque votre programme a cessé de fonctionner, 36 00:01:45,680 --> 00:01:48,689 ce fichier existe toujours sur votre système. 37 00:01:48,689 --> 00:01:50,230 Et nous pouvons regarder et examiner. 38 00:01:50,230 --> 00:01:53,670 Et si ce programme serait mis à ont créé des données persistantes, 39 00:01:53,670 --> 00:01:57,390 il existe des données après le programme a terminé l'exécution. 40 00:01:57,390 --> 00:02:02,320 >> Maintenant, toutes ces fonctions qui travaillent avec la création et la manipulation de fichiers 41 00:02:02,320 --> 00:02:04,940 de diverses façons vivre dans io.h standard, 42 00:02:04,940 --> 00:02:08,210 qui est un fichier d'en-tête vous avez probablement été la livre 43 00:02:08,210 --> 00:02:10,910 y compris au sommet de la jolie bien tous vos programmes 44 00:02:10,910 --> 00:02:14,130 car il contient l'un des la plupart des fonctions utiles pour nous, 45 00:02:14,130 --> 00:02:16,130 printf, qui permet également de vit en io.h. norme 46 00:02:16,130 --> 00:02:20,400 Donc, vous ne devez pas inclure marteler tous les fichiers supplémentaires probablement 47 00:02:20,400 --> 00:02:23,540 afin de travailler avec des pointeurs de fichiers. 48 00:02:23,540 --> 00:02:29,980 >> Maintenant, chaque fonction de pointeur de fichier, ou O, sortie chaque fichier I / entrée 49 00:02:29,980 --> 00:02:33,310 fonction, accepte comme une de ses paramètres ou des entrées 50 00:02:33,310 --> 00:02:35,822 un pointer-- de fichier, sauf pour un, fopen, qui 51 00:02:35,822 --> 00:02:38,280 est ce que vous utilisez pour obtenir le fichier pointeur en premier lieu. 52 00:02:38,280 --> 00:02:41,010 Mais après que vous avez ouvert la fichier et vous obtenez des pointeurs de fichiers, 53 00:02:41,010 --> 00:02:43,510 vous pouvez ensuite les transmettre comme arguments aux diverses fonctions 54 00:02:43,510 --> 00:02:46,720 nous allons parler aujourd'hui, ainsi que beaucoup d'autres 55 00:02:46,720 --> 00:02:48,520 de sorte que vous pouvez travailler avec des fichiers. 56 00:02:48,520 --> 00:02:50,980 >> Donc, il ya six jolie ceux de base communs 57 00:02:50,980 --> 00:02:52,870 que nous allons parler aujourd'hui. 58 00:02:52,870 --> 00:02:57,160 fopen et son compagnon fonction fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 et son fputc fonction de compagnon, et fread et sa fonction de compagnon, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Donc, nous allons aller droit au but. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- que fait-il? 63 00:03:07,050 --> 00:03:10,050 Eh bien, il ouvre un fichier et il vous donne un pointeur de fichier à elle, 64 00:03:10,050 --> 00:03:14,000 de sorte que vous pouvez ensuite utiliser ce pointeur du fichier comme argument 65 00:03:14,000 --> 00:03:16,730 à tout de l'autre fichier de fonctions d'E / S. 66 00:03:16,730 --> 00:03:19,100 La chose la plus importante à retenir avec fopen 67 00:03:19,100 --> 00:03:24,222 est que, après avoir ouvert le déposer ou fait un appel comme celui là, 68 00:03:24,222 --> 00:03:26,930 vous devez vérifier pour vous assurer que le pointeur que vous avez obtenu de retour 69 00:03:26,930 --> 00:03:28,320 est pas égal à null. 70 00:03:28,320 --> 00:03:31,320 Si vous ne l'avez pas regardé la vidéo sur pointeurs, cela pourrait ne pas donner un sens. 71 00:03:31,320 --> 00:03:35,639 Mais si vous essayez de déréférencer un rappel de pointeur nul, 72 00:03:35,639 --> 00:03:38,180 votre programme sera probablement souffrir une segmentation [inaudible]. 73 00:03:38,180 --> 00:03:40,540 Nous voulons nous assurer que nous obtenu un pointeur de retour légitime. 74 00:03:40,540 --> 00:03:43,665 La grande majorité du temps nous allons avoir obtenu un pointeur légitime retour 75 00:03:43,665 --> 00:03:45,280 et il ne sera pas un problème. 76 00:03:45,280 --> 00:03:46,760 >> Alors, comment pouvons-nous lançons un appel à fopen? 77 00:03:46,760 --> 00:03:48,051 Il ressemble beaucoup à cela. 78 00:03:48,051 --> 00:03:52,690 Étoiles du fichier ptr-- PTR étant un générique nommer pour le fichier pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 et nous passons deux choses, un nom de fichier et une opération, nous voulons entreprendre. 80 00:03:57,300 --> 00:04:01,690 Donc, nous pourrions avoir un appel qui ressemble this-- ptr fichier étoiles 1 est égal à fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 Et l'opération, je l'ai choisi est r. 83 00:04:07,020 --> 00:04:08,639 >> Alors, que pensez-vous r est ici? 84 00:04:08,639 --> 00:04:11,180 Quels sont les types de choses que nous pourrait être en mesure de le faire à des fichiers? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Donc, r est l'opération qui nous choisir quand nous voulons lire un fichier. 87 00:04:17,500 --> 00:04:20,260 Donc, nous le ferions essentiellement lorsque nous faisons un appel comme celui- 88 00:04:20,260 --> 00:04:25,440 être nous obtenir un pointeur de fichier de telle sorte que nous pourrions alors lire les informations 89 00:04:25,440 --> 00:04:27,770 de file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> De même, nous pourrions ouvrir le fichier 2.txt pour l'écriture et pour que nous puissions passer ptr2, 91 00:04:34,190 --> 00:04:38,210 Le pointeur de fichier, je l'ai créé ici, comme un argument pour toute fonction qui 92 00:04:38,210 --> 00:04:40,080 écrit des informations dans un fichier. 93 00:04:40,080 --> 00:04:43,767 Et même à l'écriture, il ya également la possibilité de joindre une. 94 00:04:43,767 --> 00:04:45,600 La différence entre l'écriture et l'ajout 95 00:04:45,600 --> 00:04:50,920 étant que lorsque vous écrivez dans un fichier, si vous effectuez un appel à la fonction fopen pour l'écriture 96 00:04:50,920 --> 00:04:54,761 et que ce fichier existe déjà, il est va écraser le fichier entier. 97 00:04:54,761 --> 00:04:56,510 Il va commencer au tout début, 98 00:04:56,510 --> 00:04:58,820 Suppression de toutes les informations qui est déjà là. 99 00:04:58,820 --> 00:05:02,210 >> Alors que si vous l'ouvrez pour annexer, il ira à la fin du fichier 100 00:05:02,210 --> 00:05:04,340 si il ya déjà dans le texte ou informations qu'il contient, 101 00:05:04,340 --> 00:05:06,040 et il sera alors commencer l'écriture à partir de là. 102 00:05:06,040 --> 00:05:08,570 Donc, vous ne perdrez pas de la informations que vous avez fait avant. 103 00:05:08,570 --> 00:05:12,110 Que vous voulez écrire ou ajouter sorte de dépend de la situation. 104 00:05:12,110 --> 00:05:16,840 Mais vous savez probablement ce que le bonne opération est le moment venu. 105 00:05:16,840 --> 00:05:18,020 Voilà donc fopen. 106 00:05:18,020 --> 00:05:18,930 >> Qu'en est-il fclose? 107 00:05:18,930 --> 00:05:21,600 Eh bien, assez simplement, fclose accepte simplement le pointeur de fichier. 108 00:05:21,600 --> 00:05:24,000 Et comme vous vous en doutez, il ferme ce fichier. 109 00:05:24,000 --> 00:05:29,270 Et une fois que nous avons fermé un fichier, nous ne pouvons pas effectuer plus fichier fonctions d'E / S, 110 00:05:29,270 --> 00:05:31,420 lire ou écrire, sur ce fichier. 111 00:05:31,420 --> 00:05:36,444 Nous devons rouvrir le déposer une autre fois pour 112 00:05:36,444 --> 00:05:38,610 continuer à travailler avec à l'aide de fonctions d'E / S. 113 00:05:38,610 --> 00:05:41,520 Donc moyens FCLOSE nous fait travailler avec ce fichier. 114 00:05:41,520 --> 00:05:44,690 Et tout ce que nous devons adopter en est le nom d'un pointeur de fichier. 115 00:05:44,690 --> 00:05:50,010 Donc, il ya un couple glisse, nous fopened fichier texte 1 point pour la lecture 116 00:05:50,010 --> 00:05:52,854 et que nous avons attribué pointeur de fichier ptr1. 117 00:05:52,854 --> 00:05:55,020 Maintenant, nous avons décidé que nous sommes fait la lecture de ce fichier. 118 00:05:55,020 --> 00:05:56,561 On n'a pas besoin d'en faire plus avec elle. 119 00:05:56,561 --> 00:05:58,890 Nous ne pouvons tout simplement ptr1 fclose. 120 00:05:58,890 --> 00:06:01,950 Et de même, pourrions-nous fclose les autres. 121 00:06:01,950 --> 00:06:02,450 Bien. 122 00:06:02,450 --> 00:06:03,700 Voilà donc l'ouverture et la fermeture. 123 00:06:03,700 --> 00:06:05,780 Ce sont les deux base le début des opérations. 124 00:06:05,780 --> 00:06:08,050 >> Maintenant, nous voulons effectivement faire des choses intéressantes, 125 00:06:08,050 --> 00:06:11,940 et la première fonction que nous allons voir qui va le faire est fgetc-- 126 00:06:11,940 --> 00:06:14,110 déposer obtenir un caractère. 127 00:06:14,110 --> 00:06:17,350 Voilà ce que fgetc général se traduirait. 128 00:06:17,350 --> 00:06:20,190 Son but dans la vie est de lire le caractère suivant, 129 00:06:20,190 --> 00:06:22,079 ou si cela est votre très premier appel à fgetc 130 00:06:22,079 --> 00:06:23,870 pour un fichier particulier, le premier caractère. 131 00:06:23,870 --> 00:06:26,210 Mais alors après cela, vous obtenez le prochain, 132 00:06:26,210 --> 00:06:31,500 le caractère très prochaine de ce fichier, et le stocke dans une variable de caractère. 133 00:06:31,500 --> 00:06:34,490 Comme nous l'avons fait ici, char ch égale fgetc, 134 00:06:34,490 --> 00:06:36,389 passer dans le nom d'un pointeur de fichier. 135 00:06:36,389 --> 00:06:38,180 Encore une fois, il est très important ici de rappeler 136 00:06:38,180 --> 00:06:41,430 que, pour avoir cette opération réussit, 137 00:06:41,430 --> 00:06:45,690 le pointeur de fichier lui-même a dû été ouvert en lecture. 138 00:06:45,690 --> 00:06:50,589 Nous ne pouvons pas lire un caractère à partir d'un fichier pointeur que nous avons ouvert pour l'écriture. 139 00:06:50,589 --> 00:06:52,630 Voilà donc l'un des limitations de la fonction fopen, non? 140 00:06:52,630 --> 00:06:55,470 Nous avons pour restreindre nous seulement à effectuer 141 00:06:55,470 --> 00:06:57,710 une opération avec un pointeur de fichier. 142 00:06:57,710 --> 00:07:00,220 Si nous voulions lire et écrire à partir du même fichier, 143 00:07:00,220 --> 00:07:03,840 nous aurions ouvert deux séparés pointeurs de fichiers à la même file-- 144 00:07:03,840 --> 00:07:05,670 l'un pour la lecture, l'un pour l'écriture. 145 00:07:05,670 --> 00:07:08,400 >> Encore une fois, la seule raison Je soulever cette question est maintenant 146 00:07:08,400 --> 00:07:11,920 parce que si nous allons faire un appel à fgetc, ce fichier pointeur dű 147 00:07:11,920 --> 00:07:14,172 été ouvert en lecture. 148 00:07:14,172 --> 00:07:15,880 Et puis, assez simplement, tout ce que nous devons faire 149 00:07:15,880 --> 00:07:17,546 est passe dans le nom du fichier pointeur. 150 00:07:17,546 --> 00:07:21,060 Donc ch omble égale ptr1 fgetc. 151 00:07:21,060 --> 00:07:23,200 >> Cela va nous faire la prochaine character-- 152 00:07:23,200 --> 00:07:25,575 ou encore, si tel est le premier fois que nous avons fait cet appel, 153 00:07:25,575 --> 00:07:29,750 le premier character-- de quelque fichier est pointé par ptr1. 154 00:07:29,750 --> 00:07:32,210 Rappelons que ce fut fichier texte 1 point. 155 00:07:32,210 --> 00:07:36,490 Il obtiendra le premier caractère de cette et nous les stockons dans le ch variable. 156 00:07:36,490 --> 00:07:37,941 Assez simple. 157 00:07:37,941 --> 00:07:40,190 Donc, nous avons seulement regardé à trois fonctions et déjà nous 158 00:07:40,190 --> 00:07:43,070 peut faire quelque chose assez soignée. 159 00:07:43,070 --> 00:07:46,320 >> Donc, si nous prenons cette capacité d'obtenir un personnage 160 00:07:46,320 --> 00:07:48,943 et on boucle it-- donc nous continuer à obtenir caractères 161 00:07:48,943 --> 00:07:51,390 à partir d'un fichier au- encore et maintenant nous over-- 162 00:07:51,390 --> 00:07:54,500 peut lire chaque simple le caractère d'un fichier. 163 00:07:54,500 --> 00:07:58,670 Et si nous imprimons tous les personnages immédiatement après nous le lisons, 164 00:07:58,670 --> 00:08:01,960 nous avons maintenant lire un fichier et imprimé son contenu à l'écran. 165 00:08:01,960 --> 00:08:05,610 Nous avons effectivement concaténées ce fichier sur l'écran. 166 00:08:05,610 --> 00:08:09,670 Et qui est ce que le Linux commande cat fait. 167 00:08:09,670 --> 00:08:13,250 >> Si vous tapez chat dans le nom du fichier, il permet d'imprimer sur la totalité du contenu 168 00:08:13,250 --> 00:08:15,160 du fichier dans la fenêtre de votre terminal. 169 00:08:15,160 --> 00:08:19,010 Et donc cette petite boucle ici, seulement trois lignes de code, 170 00:08:19,010 --> 00:08:23,270 mais il duplique en fait la commande cat Linux. 171 00:08:23,270 --> 00:08:25,210 Donc, cette syntaxe pourrait regarder un peu bizarre, 172 00:08:25,210 --> 00:08:26,670 mais voici ce qui se passe ici. 173 00:08:26,670 --> 00:08:31,460 Bien ch égale fgetc, ptr est pas égale à EOF-- il est toute une bouchée, 174 00:08:31,460 --> 00:08:34,669 mais nous allons décomposer tout Il est donc clair sur la syntaxe. 175 00:08:34,669 --> 00:08:37,169 Je l'ai consolidés, elle pour des raisons d'espace, 176 00:08:37,169 --> 00:08:39,049 même si elle est un peu syntaxiquement délicate. 177 00:08:39,049 --> 00:08:41,194 >> Donc cette partie du chef verte maintenant, que fait-il? 178 00:08:41,194 --> 00:08:42,860 Eh bien, voilà tout notre appel de fgetc, non? 179 00:08:42,860 --> 00:08:44,530 Nous avons vu cela avant. 180 00:08:44,530 --> 00:08:49,500 Il est l'obtention d'un caractère du fichier. 181 00:08:49,500 --> 00:08:53,220 Puis nous comparons ce que caractère contre EOF. 182 00:08:53,220 --> 00:08:57,470 EOF est une valeur spéciale qui est défini dans io.h standard, qui 183 00:08:57,470 --> 00:08:59,390 est le caractère de fin de fichier. 184 00:08:59,390 --> 00:09:03,450 Donc, fondamentalement, ce qui va se passer est cette boucle va lire un caractère, 185 00:09:03,450 --> 00:09:07,445 le comparer à du folklore, la caractère de fin de fichier. 186 00:09:07,445 --> 00:09:10,070 Si elles ne correspondent pas, donc nous avons pas atteint la fin du fichier, 187 00:09:10,070 --> 00:09:11,490 nous imprimons ce personnage hors. 188 00:09:11,490 --> 00:09:13,740 Ensuite, nous allons revenir à la à partir de la boucle à nouveau. 189 00:09:13,740 --> 00:09:18,310 Nous aurons un caractère, vérifions contre EOF, imprimer, etc. 190 00:09:18,310 --> 00:09:21,094 Ainsi de suite, une boucle à travers de cette façon 191 00:09:21,094 --> 00:09:22,760 jusqu'à ce que nous avons atteint la fin du fichier. 192 00:09:22,760 --> 00:09:24,593 Et puis en ce moment, nous avons imprimé 193 00:09:24,593 --> 00:09:26,210 sur l'intégralité du contenu du fichier. 194 00:09:26,210 --> 00:09:29,450 Encore une fois, nous avons seulement vu fopen, fclose, et fgetc 195 00:09:29,450 --> 00:09:34,950 et déjà nous pouvons le reproduire une commande de terminal Linux. 196 00:09:34,950 --> 00:09:38,850 >> Comme je l'ai dit au début, nous avions fgetc et fputc, 197 00:09:38,850 --> 00:09:41,860 et fputc était le compagnon fonction de fgetc. 198 00:09:41,860 --> 00:09:44,880 Et donc, comme vous pouvez l'imaginer, il est l'équivalent de l'écriture. 199 00:09:44,880 --> 00:09:49,440 Il nous permet d'écrire une seul caractère dans un fichier. 200 00:09:49,440 --> 00:09:53,290 >> Encore une fois, la mise en garde étant, tout simplement comme il était avec fgetc, le fichier 201 00:09:53,290 --> 00:09:56,660 que nous écrivant à dű ętre ouvert en écriture ou en ajout. 202 00:09:56,660 --> 00:10:00,820 Si nous essayons et utilisons fputc sur un fichier que nous avons ouvert pour la lecture, 203 00:10:00,820 --> 00:10:02,760 nous allons souffrir un peu d'une erreur. 204 00:10:02,760 --> 00:10:04,440 Mais l'appel est assez simple. 205 00:10:04,440 --> 00:10:08,000 capitale fputc Un ptr2, tout cela va se faire est qu'il est 206 00:10:08,000 --> 00:10:12,040 va écrire la lettre en A dans le fichier 2 points 207 00:10:12,040 --> 00:10:14,760 texte, qui est le nom de la fichier qui nous avons ouvert et assigné 208 00:10:14,760 --> 00:10:17,280 le pointeur à ptr2. 209 00:10:17,280 --> 00:10:20,430 Donc, nous allons écrire une Une capitale à déposer 2 texte de dot. 210 00:10:20,430 --> 00:10:24,592 Et nous écrirons une exclamation Pointer vers un fichier 3 points 211 00:10:24,592 --> 00:10:27,330 texte, qui a été pointée par ptr3. 212 00:10:27,330 --> 00:10:29,730 Encore une fois, assez simple ici. 213 00:10:29,730 --> 00:10:32,727 >> Mais maintenant, nous pouvons faire autre chose. 214 00:10:32,727 --> 00:10:34,560 Nous avons cet exemple Nous allions plus 215 00:10:34,560 --> 00:10:38,950 d'être en mesure de reproduire le chat Commande de Linux, celui qui imprime 216 00:10:38,950 --> 00:10:40,500 à l'écran. 217 00:10:40,500 --> 00:10:43,510 Eh bien, maintenant que nous avons la capacité à lire les caractères à partir de fichiers 218 00:10:43,510 --> 00:10:46,590 et écrire des caractères dans les fichiers, pourquoi ne nous substituons pas juste que 219 00:10:46,590 --> 00:10:50,720 appeler à printf avec un appel à fputc. 220 00:10:50,720 --> 00:10:54,090 >> Et maintenant, nous avons dupliqué cp, une commande très basique Linux 221 00:10:54,090 --> 00:10:59,100 dont nous avons parlé long chemin Il ya dans le Linux commandes vidéo. 222 00:10:59,100 --> 00:11:01,070 Nous avons effectivement dupliqué ce droit ici. 223 00:11:01,070 --> 00:11:04,790 Nous lecture d'un caractère et alors nous sommes écrit ce personnage à un autre fichier. 224 00:11:04,790 --> 00:11:07,660 La lecture d'un fichier, l'écriture à un autre, encore et encore 225 00:11:07,660 --> 00:11:11,350 et encore jusqu'à ce que nous avons atteint EOF. 226 00:11:11,350 --> 00:11:14,250 Nous avons à la fin de la déposer nous essayons de copier. 227 00:11:14,250 --> 00:11:18,500 Et que nous aurons tous écrits des personnages que nous devons le fichier 228 00:11:18,500 --> 00:11:19,500 que nous écrivant à. 229 00:11:19,500 --> 00:11:24,270 Donc, cela est cp, la commande de copie Linux. 230 00:11:24,270 --> 00:11:26,550 >> Au tout début de cette vidéo, je devais la mise en garde 231 00:11:26,550 --> 00:11:29,840 que nous allions parler un peu de pointeurs. 232 00:11:29,840 --> 00:11:32,480 Voici précisément où nous en sommes allons parler de pointeurs 233 00:11:32,480 --> 00:11:34,800 en plus de déposer des pointeurs. 234 00:11:34,800 --> 00:11:37,870 Donc, cette fonction semble un peu effrayant. 235 00:11:37,870 --> 00:11:39,120 Il a obtenu plusieurs paramètres. 236 00:11:39,120 --> 00:11:40,430 Il ya beaucoup de choses ici. 237 00:11:40,430 --> 00:11:42,760 Il ya beaucoup de différents les couleurs et les textes. 238 00:11:42,760 --> 00:11:47,100 Mais vraiment, il est juste le version générique de fgetc 239 00:11:47,100 --> 00:11:50,110 qui nous permet d'obtenir tout quantité d'informations. 240 00:11:50,110 --> 00:11:53,560 Il peut être un peu inefficace si nous sommes obtenir caractères un à la fois, 241 00:11:53,560 --> 00:11:55,770 itérer le fichier un caractère à la fois. 242 00:11:55,770 --> 00:12:00,230 Serait-il pas agréable d'obtenir 100 à un moment ou 500 à la fois? 243 00:12:00,230 --> 00:12:03,250 >> Eh bien, fread et sa fonction de compagnon fwrite, dont nous parlerons 244 00:12:03,250 --> 00:12:05,490 dans un second, nous permettent de faire exactement cela. 245 00:12:05,490 --> 00:12:08,480 Nous pouvons lire une quantité arbitraire de l'information à partir d'un fichier 246 00:12:08,480 --> 00:12:10,290 et nous le stocker quelque part temporairement. 247 00:12:10,290 --> 00:12:12,980 Au lieu d'être en mesure de simplement l'adapter à une seule variable, 248 00:12:12,980 --> 00:12:15,790 nous pourrions avoir besoin de le stocker dans un tableau. 249 00:12:15,790 --> 00:12:19,980 Et donc, nous passons sur quatre arguments pour fread-- un pointeur 250 00:12:19,980 --> 00:12:23,940 à l'endroit où nous sommes aller à stocker des informations, 251 00:12:23,940 --> 00:12:29,180 la taille de chaque unité d'information sera, combien d'unités d'informations 252 00:12:29,180 --> 00:12:35,192 nous voulons acquérir, et à partir de quel fichier que nous voulons pour les obtenir. 253 00:12:35,192 --> 00:12:37,150 Probablement mieux illustré avec un exemple ici. 254 00:12:37,150 --> 00:12:41,640 Donc, disons que nous déclarons un tableau de 10 entiers. 255 00:12:41,640 --> 00:12:45,080 Nous venons déclarés sur les empiler arbitrairement int arr 10. 256 00:12:45,080 --> 00:12:46,970 Voilà donc assez simple. 257 00:12:46,970 --> 00:12:51,970 Maintenant, ce que nous faisons est le bien frecall est que nous sommes en train de lire taille de int 258 00:12:51,970 --> 00:12:54,180 fois 10 octets d'informations. 259 00:12:54,180 --> 00:12:59,040 Taille de int être four-- qui est la taille d'un entier c. 260 00:12:59,040 --> 00:13:02,790 >> Donc, ce que nous faisons est que nous lisons 40 octets d'une valeur de l'information 261 00:13:02,790 --> 00:13:05,850 à partir du fichier pointé par ptr. 262 00:13:05,850 --> 00:13:08,600 Et nous allons stocker les 40 octets quelque part 263 00:13:08,600 --> 00:13:12,080 où nous avons mis de côté 40 octets d'une valeur de mémoire. 264 00:13:12,080 --> 00:13:15,970 Heureusement, nous avons déjà fait par déclarant arr, ce tableau là. 265 00:13:15,970 --> 00:13:19,770 Qui est capable de retenue 10 unités sur quatre octets. 266 00:13:19,770 --> 00:13:22,860 Donc au total, elle peut contenir 40 octets valeur de l'information. 267 00:13:22,860 --> 00:13:26,540 Et nous sommes maintenant en train de lire 40 octets de l'information à partir du fichier, 268 00:13:26,540 --> 00:13:30,330 et nous allons stocker dans arr. 269 00:13:30,330 --> 00:13:35,470 >> Rappel de la vidéo sur les pointeurs que le nom d'un tableau, comme arr, 270 00:13:35,470 --> 00:13:38,370 est vraiment juste un pointeur à son premier élément. 271 00:13:38,370 --> 00:13:43,680 Alors, quand nous passons arr là, nous sont, en fait, en passant dans un pointeur. 272 00:13:43,680 --> 00:13:46,120 >> De même que nous pouvons faire this-- nous ne faisons pas nécessairement 273 00:13:46,120 --> 00:13:51,200 besoin pour sauver notre tampon sur la pile. 274 00:13:51,200 --> 00:13:54,990 Nous pourrions également allouer dynamiquement Un tampon de ce type, en utilisant malloc. 275 00:13:54,990 --> 00:13:57,340 Rappelez-vous, lorsque nous allouer dynamiquement la mémoire, 276 00:13:57,340 --> 00:14:00,550 nous économisons sur le tas, pas la pile. 277 00:14:00,550 --> 00:14:02,110 Mais il est encore un tampon. 278 00:14:02,110 --> 00:14:06,810 >> Il reste, dans ce cas, est tenant 640 octets d'informations 279 00:14:06,810 --> 00:14:09,230 car une double prend huit octets. 280 00:14:09,230 --> 00:14:11,570 Et nous demandons 80 d'entre eux. 281 00:14:11,570 --> 00:14:13,770 Nous voulons avoir l'espace de tenir 80 chambres doubles. 282 00:14:13,770 --> 00:14:17,210 Ainsi, la figure 8 est 80 fois 640 octets d'informations. 283 00:14:17,210 --> 00:14:21,880 Et cet appel à fread est collecte 640 octets d'informations 284 00:14:21,880 --> 00:14:27,770 à partir du fichier pointé par PTR et le stockant maintenant dans arr2. 285 00:14:27,770 --> 00:14:32,770 >> Maintenant, nous pouvons également traiter fread tout comme un appel à fgetc. 286 00:14:32,770 --> 00:14:37,140 Dans ce cas, nous essayons juste de obtenir un caractère du fichier. 287 00:14:37,140 --> 00:14:40,070 Et nous ne devons pas un tableau contenant un caractère. 288 00:14:40,070 --> 00:14:43,170 Nous pouvons simplement stocker dans une variable de caractère. 289 00:14:43,170 --> 00:14:46,390 >> Le hic, cependant, est que quand nous avons juste une variable, 290 00:14:46,390 --> 00:14:50,290 nous avons besoin de passer dans le Adresse de cette variable 291 00:14:50,290 --> 00:14:52,550 parce que le rappel premier argument de fread 292 00:14:52,550 --> 00:14:59,210 est un pointeur vers l'emplacement mémoire et où nous voulons stocker les informations. 293 00:14:59,210 --> 00:15:01,550 Encore une fois, le nom d'un tableau est un pointeur. 294 00:15:01,550 --> 00:15:04,200 Donc, nous ne devons faire ensemble esperluette. 295 00:15:04,200 --> 00:15:07,270 Mais c, le caractère c ici, est pas un tableau. 296 00:15:07,270 --> 00:15:08,390 Il est juste une variable. 297 00:15:08,390 --> 00:15:11,840 Et donc nous avons besoin de passer un esperluette c pour indiquer 298 00:15:11,840 --> 00:15:15,350 que ce est l'adresse où nous voulons à stocker un octet de cette information, 299 00:15:15,350 --> 00:15:20,479 celui-ci que caractère nous recueillons de ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- je vais passer en revue cela un peu plus 301 00:15:22,270 --> 00:15:25,440 quickly-- est à peu près la exact équivalent de fread 302 00:15:25,440 --> 00:15:27,720 sauf qu'il est pour l'écriture la place de la lecture, tout simplement 303 00:15:27,720 --> 00:15:31,610 comme le other-- nous avons eu ouverte et à proximité, obtenir un caractère, 304 00:15:31,610 --> 00:15:32,530 écrire un caractère. 305 00:15:32,530 --> 00:15:35,040 Maintenant, il est arbitraire obtenir quantité d'information, 306 00:15:35,040 --> 00:15:37,170 quantité arbitraire droit à l'information. 307 00:15:37,170 --> 00:15:39,790 Ainsi, tout comme avant, nous pouvons avoir un tableau de 10 entiers 308 00:15:39,790 --> 00:15:43,210 où nous avons déjà informations stockées, peut-être. 309 00:15:43,210 --> 00:15:46,580 >> Il était probablement quelques lignes de code qui devrait aller entre ces deux 310 00:15:46,580 --> 00:15:49,990 où je remplis avec l'arr quelque chose de significatif. 311 00:15:49,990 --> 00:15:51,880 Je remplis avec 10 entiers différents. 312 00:15:51,880 --> 00:15:54,920 Et à la place, ce que je suis faire est d'écrire à partir arr 313 00:15:54,920 --> 00:15:58,600 et la collecte de l'information à partir arr. 314 00:15:58,600 --> 00:16:02,390 Et je vais prendre cette information et de le mettre dans le fichier. 315 00:16:02,390 --> 00:16:05,410 >> Donc, au lieu d'être à partir de le fichier dans la mémoire tampon, 316 00:16:05,410 --> 00:16:08,790 Maintenant, nous allons partir la mémoire tampon dans le fichier. 317 00:16:08,790 --> 00:16:10,580 Donc, il est juste l'inverse. 318 00:16:10,580 --> 00:16:16,680 Donc encore une fois, comme avant, nous pouvons ont aussi un morceau de tas de mémoire 319 00:16:16,680 --> 00:16:19,600 que nous avons dynamiquement alloué et lire à partir de cette 320 00:16:19,600 --> 00:16:21,570 et d'écrire que dans le fichier. 321 00:16:21,570 --> 00:16:24,900 >> Et nous avons aussi une seule variable capable de contenir un octet 322 00:16:24,900 --> 00:16:27,200 de l'information, comme un caractère. 323 00:16:27,200 --> 00:16:29,830 Mais encore une fois, nous avons besoin de passer à l'adresse de cette variable 324 00:16:29,830 --> 00:16:31,840 quand on veut lire. 325 00:16:31,840 --> 00:16:35,280 Donc, nous pouvons écrire l'information nous trouvons à cette adresse 326 00:16:35,280 --> 00:16:39,050 le pointeur de fichier, PTR. 327 00:16:39,050 --> 00:16:41,630 >> Il ya beaucoup d'autres fonctions d'E / S grande fichiers 328 00:16:41,630 --> 00:16:44,650 que faire des choses différentes en plus ceux dont nous avons parlé aujourd'hui. 329 00:16:44,650 --> 00:16:46,450 Un couple de ceux vous pourriez trouver utiles 330 00:16:46,450 --> 00:16:50,840 sont fgets et fputs, qui sont l'équivalent 331 00:16:50,840 --> 00:16:56,190 de fgetc et fputc mais pour la lecture une chaîne unique à partir d'un fichier. 332 00:16:56,190 --> 00:16:59,020 Au lieu d'un seul caractère, il va lire une chaîne entière. 333 00:16:59,020 --> 00:17:02,940 fprintf, qui permet essentiellement vous utilisez printf écrire dans le fichier. 334 00:17:02,940 --> 00:17:05,619 Donc, comme vous pouvez faire la la substitution de variable en utilisant 335 00:17:05,619 --> 00:17:09,900 Les espaces réservés pour cent i et pour cent d, et ainsi de suite, avec printf 336 00:17:09,900 --> 00:17:14,690 vous pouvez de même prendre la chaîne de printf et quelque chose d'impression 337 00:17:14,690 --> 00:17:16,800 comme ça pour un fichier. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- si vous avez un lecteur DVD est l'analogie que je prends habituellement ici-- 339 00:17:20,720 --> 00:17:23,109 est un peu comme l'aide de votre rembobinage et avance rapide 340 00:17:23,109 --> 00:17:25,819 boutons pour déplacer le film. 341 00:17:25,819 --> 00:17:28,369 De même, vous pouvez déplacer le fichier. 342 00:17:28,369 --> 00:17:30,250 Une des choses à l'intérieur que la structure de fichier 343 00:17:30,250 --> 00:17:34,270 que c crée pour vous est un indicateur d'où vous êtes dans le fichier. 344 00:17:34,270 --> 00:17:36,420 Êtes-vous à la très commençant à zéro octet? 345 00:17:36,420 --> 00:17:39,290 Êtes-vous à l'octet 100, octet 1000, et ainsi de suite? 346 00:17:39,290 --> 00:17:44,340 Vous pouvez utiliser fseek de se déplacer arbitrairement cet indicateur avant ou en arrière. 347 00:17:44,340 --> 00:17:46,744 >> Ftell et, encore une fois similaire à un lecteur de DVD, 348 00:17:46,744 --> 00:17:49,660 est comme une petite horloge qui indique vous combien de minutes et vous secondes 349 00:17:49,660 --> 00:17:52,480 sont dans un film en particulier. 350 00:17:52,480 --> 00:17:56,990 De même, ftell vous explique comment le nombre d'octets que vous êtes dans le fichier. 351 00:17:56,990 --> 00:18:00,210 feof est une version différente de détecter si vous avez 352 00:18:00,210 --> 00:18:01,700 atteint la fin du fichier. 353 00:18:01,700 --> 00:18:03,600 Et ferror est une fonction que vous pouvez utiliser 354 00:18:03,600 --> 00:18:06,959 pour détecter si quelque chose doit mal tourné travail avec un fichier. 355 00:18:06,959 --> 00:18:08,750 Encore une fois, ceci est juste rayer la surface. 356 00:18:08,750 --> 00:18:12,730 Il ya encore beaucoup plus de fichiers I / O fonctions dans la norme io.h. 357 00:18:12,730 --> 00:18:16,620 Mais ce ne sera probablement vous commencé à travailler avec des pointeurs de fichiers. 358 00:18:16,620 --> 00:18:17,640 Je suis Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Ceci est CS50. 360 00:18:19,750 --> 00:18:21,669