>> JASON HIRSCHHORN: Bienvenue, tout le monde, à la semaine 6.
Je suis heureux de vous voir tous en vie et bien après Quiz 0, parce que je sais que
était un peu rude.
Mais heureusement, vous tous fait incroyablement bien.
Et ce qui est merveilleux.
Si vous êtes dans mon article, j'ai donné plus de vous soutenir déjà vos tests.
>> Un couple d'entre vous, je vais rencontrer après la classe.
Et si vous êtes un étudiant d'extension et vous n'avez pas reçu votre quiz dos
encore, votre carte de TF travaille probablement sur elle et le classement, et va le récupérer
sous peu.
Alors mes étudiants de vulgarisation qui sont regarder en ce moment - nous l'espérons vivre -
Je vais faire vos tests peu de temps ainsi.
>> Notre ordre du jour d'aujourd'hui est comme suit.
Tout d'abord, nous allons passer en revue certains ressources qui CS50 vous offre.
Nous allons passer en revue Quiz 0, et Je vais répondre à toutes les questions qui que ce soit
a propos de problèmes particuliers.
Et puis, nous allons nous rendre sur fichier I / O et le problème mis 5.
Ces deux derniers sujets auront l'essentiel de l'article aujourd'hui.
>> Je mets cette liste chaque semaine comme un rappel pour vous tous, mais de cœur
section, nous avons seulement 90 minutes - nous ne sont pas en mesure de couvrir tout ce que je
aimerait couvrir pour vous les gars.
Mais nous avons une tonne de ressources pour vous dessinez sur que vous apprenez à connaître
le matériel et le travail par votre problème fixe.
>> Un rappel que j'ai en ligne un texte boîte, mis en place pour vous à remplir si vous
avoir une rétroaction pour moi, à la fois positif et
constructive, sur la section.
Cette URL est situé ici.
Alors s'il vous plaît, prenez un moment si vous avez une informations, que ce soit pendant section,
ou après, ou après vous regardez la vidéo en ligne, à me donner votre avis.
J'apprécie vraiment tout et tout.
>> Donc, j'ai eu des petites conversations avec beaucoup de mon
les étudiants tout au long de la semaine - que je remets quiz dos, parler de la
Bien sûr, de voir comment vous faites.
Et un thème est venu sur et plus en parler - dans
particulier -
problème fixe.
Et j'ai encapsulé ce thème sur la carte en ce moment.
>> Essentiellement, il ya une différence entre la mise en quelque chose qui est
fait correctement et quelque chose qui est bien fait.
La plupart des gens ont fait fantastique en termes d'exactitude -
De 5 ou 4 est sur tous les psets.
La plupart des gens sont ceux de tous les temps.
>> Cependant, juste parce que vous avez fait quelque chose de bien ne veut pas dire que vous avez
fait quelque chose avec autant d'élégance, ou efficace, ou plus proprement que vous
aurait pu le faire.
Et c'est ce que la conception -
et à un degré moindre, le style -
axes sont pour.
Donc, je vous poussais tout, et d'autres facteurs de transcription poussent les gars, non seulement à son tour
dans les choses qui sont correctes, mais se transforment dans les choses qui sont bien codées.
>> Ne pas faire inutilement POUR boucles, pas recalculer les variables si
vous n'avez pas à.
Par exemple, en regardant en arrière à problème posé 4, lors du placement des briques sur le
écran, chaque ligne - chaque brique dans un ligne donnée a la même coordonnée y -
la même hauteur de coordonnées.
>> Alors que la coordonnée y n'a pas besoin de calculer à l'intérieur de l'habitacle
boucle FOR imbriquée que vous avez probablement utilisé de mettre ces briques sur l'écran.
Il ne doit être calculé chaque temps vous avez changé une ligne, ou
déplacé vers le bas une ligne.
Donc, dire s'il ya 10 briques dans une rangée, chaque brique peut avoir le même
coordonnée y, et que y coordonner peut seulement être calculée
une fois pour toutes de ceux-ci.
>> Il n'a pas besoin d'être calculé 10 temps, ni le fait que le calcul nécessité
se passer dans le réel appel de fonction -
le nouvel appel de fonction gracked.
Donc, si c'était un peu déroutant pour vous, plus générique, des choses qui
n'ont pas besoin de se produire à chaque fois vous passez par une boucle POUR devrait pas être
mettre à l'intérieur de la boucle POUR, et ne devrait pas se produire chaque fois que vous allez
à travers la boucle POUR.
>> Un autre bon exemple de conception, nous avons vu à la semaine 3 à 15, vous pouvez conserver
piste de zéro.
Ainsi, lorsque vous initialisez la carte, vous sauver - dans une variable globale, peut-être -
x et y coordonnées du zéro.
Et puis quand vous -
dans votre fonction de déplacement, à chaque fois que vous faites un déménagement réussi, vous mettez à jour le
emplacement du zéro.
>> Cela vous évitera d'avoir à faire boucles for imbriquées à regarder à travers la
monter à chaque fois dans votre fonction de déplacement et trouver le zéro, ou trouver la tuile,
puis vérifier ce qui est à côté de lui.
Au lieu de cela, vous avez l'emplacement de l' zéro, il vous suffit de regarder au-dessus, au-dessous,
et à la gauche et à droite de celui-ci, de trouver la tuile que vous recherchez.
>> Donc, en ce qui concerne les programmes que nous sommes écrit, ils ne sont jamais assez grand
que certains de ces choix de conception sont vraiment à nuire à votre
programme, ou le faire tourner plus lentement, ou peut-être même à court de mémoire.
Mais nous sommes toujours vous pousser gars d'écrire aussi élégant et
code efficace que possible.
>> Donc, si vous finissez par écrire des choses qui ont une beaucoup plus grande
portée, ils seront écrits avec une bonne concevoir en plus d'être correct.
Ainsi, un certain nombre d'entre vous avez apporté cela.
C'est quelque chose que nous sommes à la recherche - quelque chose que nous allons continuer à
vous pousser gars sur.
>> Si jamais vous avez des questions au sujet de la conception de votre programme, n'hésitez pas
à atteindre pour moi, et je suis heureux de marcher à travers votre programme avec vous,
et souligner certains de la conception décisions que vous faites, et vous donner quelques
des suggestions sur la façon de faire de même de meilleures décisions de conception.
>> Nous allons donc passer à parler de Quiz 0.
Avant cela, quelqu'un Pour toute question au sujet de ce
J'ai abordé jusqu'à présent?
>> [Bruissement]
>> JASON HIRSCHHORN: Sept secondes.
OK.
Parlons Quiz 0 pour un peu.
La plupart d'entre vous ont votre Quiz 0 le dos.
Si vous ne le faites pas, je l'espère Vous souvenez-vous un peu.
Mais si vous avez pris Quiz 0, alors vous ont également accès à la version PDF en ligne
les solutions d'échantillon.
>> Quelqu'un at-il des questions avant nous sautons dans le matériel de la semaine sur
un problème particulier sur Quiz 0 -
pourquoi la réponse est ce qu'elle est?
Est ce que quelqu'un confus au sujet de quoi que ce soit?
Même si vous avez le problème de droite, mais vous voulez juste moi d'expliquer un peu
De plus, je suis heureux de le faire maintenant.
>> Alors j'ai demandé à vous les gars pour se préparer avec une certaine
réflexions sur Quiz 0.
Alors, qui voudrait nous faire commencé avec une question ou
commenter Quiz 0?
>> [Papier froissé]
>> JASON HIRSCHHORN: Pas tout le monde fait parfaitement.
Donc, je sais [RIRES]
il doit y avoir quelques questions Quiz 0.
OK.
Oui.
Ompica.
>> OMPICA: Numéro 10.
>> JASON HIRSCHHORN: Numéro 10.
Lequel était le numéro 10?
>> OMPICA: Le -
>> JASON HIRSCHHORN: Je haven't -
>> OMPICA: Le incluent -
>> JASON HIRSCHHORN: Numéro 10 était huit i - écrit huit à i?
>> OMPICA: Ouais.
>> JASON HIRSCHHORN: OK.
Donc, une autre question que vous pourriez avoir demandé est-ce que je prémonitoire?
La réponse est oui.
Dans la section avant le test, j'ai demandé vous les gars pour coder à la fois sterling et
huit à i.
Deux d'entre eux est arrivé à apparaître sur le questionnaire.
Donc, j'espère, vous avez payé attention à cela.
>> Et si vous aviez, vous auriez probablement bien fait sur les deux.
Mais huit à i, nous n'avons pas réellement le code en classe, mais il était, encore une fois,
demandé sur le questionnaire.
Ainsi, un certain nombre de choses à prendre noter lors du codage huit à i.
La première chose, par la question, était que vous avez besoin de vérifier si la chaîne
était égal à zéro.
>> Quelques personnes ont essayé de vérifier plus tard dans le programme de la console si j'ai été -
donc un caractère spécifique dans ce chaîne - était égal à zéro.
Mais rappelez-vous, que nul est essentiellement - il est bon de penser à
null comme un pointeur zéro - un pointeur à zéro -
quelque part dans la mémoire où vous ne pouvez jamais accéder.
>> Donc, si quelque chose est égale à zéro, vous savoir qu'il n'a pas été initialisé,
ou il n'y a rien.
Donc s est une étoile de char, s support i est un caractère.
Il est donc logique de comparer l null, mais pas de la tranche i à null.
Mais encore une fois - de sorte que la première chose que vous étiez censé faire -
assurez-vous que vous avez réellement obtenu une véritable chaîne.
>> Ensuite, vous vouliez passer par chaque caractère dans la chaîne.
Et ce serait comme un support de s i, par exemple, si i est votre itérateur.
Et prendre ce personnage, et obtenir sa valeur réelle.
Vous avez il stocké comme un char, mais la valeur ASCII zéro -
zéro comme un personnage -
n'est pas réellement le nombre entier zéro.
C'est un autre numéro que vous pouvez rechercher dans la table ASCII.
>> Donc, une façon de corriger pour que - probablement la meilleure façon de corriger les
que - est soustrait de lui la valeur de caractère -
zéro comme un personnage.
Apostrophe donc moins, zéro, une autre apostrophe.
Cela prendra quelque nombre vous avez comme un char, et obtenir égal à
le nombre comme un entier réel.
>> Et cela est très similaire à l'approche beaucoup de gens ont pris dans le
problème réglé 2, avec César et Viginere -
ces chiffres, lorsque vous ont été les faisant tourner.
Donc, après vous avez comme un certain nombre de zéro à neuf, alors - selon
où il va dans le nombre final - vous devez multiplier
par une puissance de 10.
>> Certaines personnes déplacées à l'arrière de la avant, et multiplié la personne
nombre par une puissance de 10.
Certaines personnes déplacées de l'avant vers l'arrière -
et donc nous avons pris le plus grand pour les numéros de la première -
et permettrait de sauver ceux qui sont en compteur variable globale.
Et puis à chaque fois par la DE boucle, multipliez ce géant mondial
variable compteur par 10, pour faire espace pour le caractère suivant.
>> Donc, c'était un peu déroutant sans me l'écrire sur la carte.
Mais la solution de l'échantillon est disponible pour vous.
Mais ce sont les grandes choses nous cherchions.
Également une vérification pour s'assurer que chaque caractère individuel était en effet un
caractère entre zéro et neuf, et pas un autre caractère, comme un A,
par exemple.
>> Ce sont les choses que nous cherchions à cette question.
Est-ce que cela répond à votre question?
>> OMPICA: Ouais.
>> JASON HIRSCHHORN: OK.
Y at-il d'autres questions Quiz 0?
Qu'est-ce que sur la compilation?
Tout le monde la compilation droit?
Non.
Il y avait un -
[RIRES]
Une question sur l' processus de compilation?
Wow.
>> [Papier froissé]
>> JASON HIRSCHHORN: Oui.
Michael.
>> MICHAEL: Est-numéro 7 - aléatoire?
>> JASON HIRSCHHORN: Numéro 7.
Numéro 7 a obtenir un nombre entier aléatoire.
Excellent.
Donc, vous êtes donné un entier a et un entier b, et que vous voulez un hasard
entier compris entre a et b.
Nous pouvons réellement écrire celui-ci sur le conseil, car celui-ci
était une ligne de code -
un moyen de le faire.
>> Nous avons donc donné drand comme un fonction que nous pourrions utiliser.
Et qu'est-ce que DRAND -
en supposant qu'il a été ensemencé -
ce qui ne DRAND revenir?
>> MICHAEL: Un flotteur entre 0.0 et 1.0.
>> JASON HIRSCHHORN: Un certain nombre - ouais.
Un nombre entre 0 et 1.
Et si nous avons b et a.
Et puis nous avons notre numéro aléatoire entre 0 et 1 qui nous est donnée par drand.
Certaines personnes ont essayé de mettre b, ou b moins un, ou quelque chose dans les
parenthèses.
Cela signifie qu'ils sont arguments de cette fonction.
>> drand ne prend pas d'arguments - comme getString fait
pas prendre d'arguments.
Donc, c'est juste parenthèse ouverte, près Paren - et qui, elle-même, est
l'appel de fonction.
Et qui vous donne un certain nombre entre 0 et 1.
Bien sûr, nous avons toute une gamme que les nombres peuvent être po
>> Dites, si b est 10 et un est de 5, nous avons vraiment veulent un numéro avec une gamme de 5.
Alors, la prochaine chose que nous devons faire est multiplier par la gamme b moins un.
Donc, en supposant que c'est multiplié.
Et qui nous donnera un certain nombre dans une plage donnée.
Et cette gamme spécifique étant la différence entre b moins un.
>> Et finalement, ça ne lui donner de - dire l'écart entre b moins un
est 5, ça va nous donner un nombre de 0 à 5.
Mais si un est en fait 5, nous avons besoin de renforcer cette gamme jusqu'à l'endroit où il est
en fait censé être, par addition d'un.
Alors qui obtient le droit de logique.
Et puis, auriez-vous une autre question?
>> MICHAEL: Non
Je me sens vraiment stupide maintenant.
[RIRES]
>> JASON HIRSCHHORN: Non
Ne vous sentez pas vraiment stupide.
Un certain nombre de personnes a lutté avec cette question.
Et puis, l'autre question est, drand, vous avez dit, vous donne un flotteur -
retourne un flotteur.
Mais cette fonction fait demandé pour un nombre entier d'être retourné.
>> Vous n'avez pas besoin de lancer cette explicitement à un nombre entier, parce que ce
opérations seront traiter comme tout un flotter - comme un nombre à virgule flottante.
Vous aimez cette volonté - même si ce est un nombre entier, cette volonté
multiplier correctement.
Toute la multiplication fonctionnera.
Vous n'avez pas besoin de le lancer ici.
En fait, vous ne devriez pas le lancer.
>> Qui -
si vous voulez jeter un numéro c'est entre 0 et 1 -
un nombre aléatoire, une virgule flottante -
puis il sera soit uniquement égal à 0 ou 1, de sorte que vous perdrez tout cela précision.
Mais à la fin, quand vous reviendrez, il devient automatiquement
renvoyé comme un entier.
Donc, vous n'avez pas besoin de faire que vous la coulée.
>> Donc, ce fut la réponse à cette question, le numéro 7.
D'autres questions sur Quiz 0?
Ouais, Annie.
>> ANNIE: Quand est-ce que nous utilisons récursif -
quand est-ce que nous utilisons boucles itératives?
>> JASON HIRSCHHORN: Lorsque vous utilisez ne récursive - donc de façon plus générale, l'
avantages et les inconvénients de la récursivité contre une approche itérative.
Quelqu'un peut-il offrir un pro ou un con?
S'il vous plaît?
Ne peut pas tout le monde.
Qui peut offrir un pro ou un con?
>> [Papier froissé]
>> ÉTUDIANT 1: récursif est moins codage - frappe moins?
>> JASON HIRSCHHORN: Donc, en général, récursivité en particulier, une fonction -
ou un algorithme comme fusion sorte - qui se prête
à une approche récursive -
peut-être plus simple de coder de façon récursive.
Et plus de sens de le faire de manière récursive.
Donc, ce serait un pro pour la récursivité.
Autres?
Ouais?
>> ÉTUDIANT 2: Con de récursivité -
Il utilise plus de mémoire.
>> JASON HIRSCHHORN: Donc, tout à fait exact.
Une fonction récursive sera continuer à ajouter stack frames de la pile.
Donc, si vous êtes d'exploitation sur un terrain de numéros, et doivent appeler cette
fonctionner beaucoup, alors vous aurez certainement prendre plus de mémoire, tandis que
une approche itérative mettra seulement un frame de pile sur la pile, car
tout se passe dans une fonction.
>> Tous les autres avantages et les inconvénients?
Ouais.
>> ÉTUDIANT 3: Avantages pour la récursivité.
Vous n'avez pas à déterminer dans progresser combien
Code devait être répété.
Vous pouvez avoir un nombre prédéterminé de fois que vous avez à parcourir, alors
récursivité est mieux, parce que il prend ce résultat.
>> JASON HIRSCHHORN: Je pense que c'est vrai.
Mais je pense que dans les deux cas vous le feriez jamais -
vous auriez probablement obtenir un peu entrée de l'utilisateur.
Ou cette fonction aurait une certaine entrée qui permettrait de déterminer combien de fois il
devrait fonctionner.
Donc, généralement, vous ne seriez pas coder en dur - même dans une approche itérative - comment
à plusieurs reprises que la boucle doit être exécutée.
>> Avez-vous eu une autre vous étiez penser, Annie?
OK.
Donc, ce sont probablement les deux -
le plus grand pro et le plus grand con à un récursive contre
une approche itérative.
OK.
Autre chose sur Quiz 0?
>> Passons.
File I / O. Il est un merveilleux court cette semaine dans le dossier I / O qui, espérons-
vous avez regardé multiple fois, et admiré.
Beaucoup de travail a été en cela, et je n'ai entendu, il est incroyablement utile.
J'ai aussi inclus le lien sur cette diapositive, au cas où vous n'avez pas eu un
chance de regarder 10 fois.
>> Donc, nous allons brièvement passer en revue la grandes étapes de l'ouverture et de travail
avec les fichiers, puis nous allons plonger dans un problème de codage avant
examinant le jeu de problème.
Encore une fois, je vais mettre ceci sur l'écran, mais je vais parler pour
juste une minute de ce que nous sommes faire ici avec le fichier I/O--
qu'est-ce que cela signifie?
>> Cela signifie que nous pouvons créer notre programmes, et alors nos programmes
sortie, et ne pas avoir fait un impact sur le monde en dehors de notre programme.
Mais quand nous commençons à travailler avec des fichiers - à la fois les lire dans la création et
eux - nous pouvons avoir un effet sur la monde en dehors de notre programme.
>> Tout comme si Microsoft Word n'a pas pu d'apporter des documents Word, puis
une fois Microsoft Word cesser de fumer, l'ensemble de votre travail serait parti, et il serait
vraiment inutile.
Nous ne voulons finalement de pouvoir écrire des programmes qui peuvent affecter la
monde autour d'eux, à la fois par la prise en entrées complexes - en termes de fichiers et
via des fichiers, et également de créer intéressante et les sorties convaincantes -
en termes de différents types de fichiers.
>> Donc, c'est pourquoi nous commençons à apprendre à travailler avec des fichiers.
Plus précisément, ce nous faisons est la suivante.
C'est très simple.
Il ya seulement quelques étapes, et ils sont répertoriés ici sur ce code.
Nous allons donc passer par cette ligne de code en ligne.
>> Tout d'abord, vous voyez souligné -
lorsque vous travaillez avec un fichier, quel que soit le type de fichier, il est,
vous devez l'ouvrir.
Et c'est avec un appel à la fonction fopen -
ici.
Vous incluez le nom du fichier.
Si le fichier n'est pas dans votre répertoire, ou le dossier dans lequel ce programme
vie, alors vous devez aussi inclure un chemin où ce fichier est.
>> Nous allons supposer que cette fichier appelé "text.txt" -
un simple document texte - est dans le même dossier que ce programme est.
C'est donc une autre chose à garder à esprit - que si vous voulez ouvrir un fichier
ailleurs, vous avez réellement besoin à inclure son emplacement.
>> Deuxièmement, vous pouvez passer un argument à fopen, et c'est ce que vous voulez faire
avec le fichier.
Il existe trois principaux arguments que vous allez passer à la fonction fopen.
Qui peut me donner les trois?
Qui peut me donner l'un d'eux?
Oui.
>> ÉTUDIANT 4: Le nom de fichier?
>> JASON HIRSCHHORN: Désolé.
Trois arguments principaux, vous pouvez passer comme le second argument de fopen.
Vous avez raison - le nom du fichier est le premier argument.
Mais le second argument de la fonction fopen sont généralement trois cordes, et - oui.
Aleja.
>> ALEJA: A pour l'ajout.
>> JASON HIRSCHHORN: A, si vous voulez ajouter à un fichier qui existe déjà.
>> ÉTUDIANT 5: R pour lecture.
>> JASON HIRSCHHORN: R, si vous envie de lire à partir d'un fichier.
>> ÉTUDIANT 6: W en écriture.
>> JASON HIRSCHHORN: Et avec, si vous voulez écrire dans un fichier.
Donc dans ce cas, nous écrivons dans le fichier, de sorte que nous avons w.
Vous l'ouvrez, vous devez également enregistrer le fichier quelque part, et c'est avec le
code pour le côté gauche de l'opérateur d'affectation -
Je crée un pointeur vers un fichier appelé, dans ce cas, le fichier.
>> Nous n'allons pas à m'inquiéter de ce que tout ce que casquettes chose de fichier est.
Qu'il suffise de dire, c'est une longue flux de zéros et de uns.
Et c'est ainsi que nous allons utiliser et le comprendre.
>> La prochaine chose que nous devons faire - et c'est extrêmement important -
chaque fois que vous ouvrez un fichier -
en fait, chaque fois que vous appelez malloc, pour exemple, et obtenir un peu de mémoire et essayer
et l'enregistrer dans un pointeur, vous avez toujours vouloir vérifier pour s'assurer que cette
fonction n'a pas retourné null.
>> Donc dans ce cas, nous vérifions à faire vous que nous avons effectivement ouvert le
fichier correctement, et il n'y avait aucune erreur dans notre programme.
Ensuite, une fois que nous avons vérifié pour s'assurer que nous avons un fichier de travail, nous pouvons
écrire ou lire, ou ajouter le fichier.
Dans ce cas, je suis tout simplement en train d'imprimer une ligne à ce fichier.
>> Comment je le sais?
Eh bien, je suis en utilisant cette fonction appelé fprintf.
Toutes les fonctions que vous utiliserez lors de l'écriture ou la lecture d', ou
manipulation de fichiers sera similaire à fonctions que vous avez vu avant, mais
commencer par la lettre F, debout pour le fichier.
Et fprintf, contrairement à notre impression normale app, prend un argument supplémentaire,
et qui est le fichier où vous imprimer cette ligne.
>> Je n'ai rien à le droit de ohai.
Je n'ai pas la troisième l'argument à printf -
ou le second argument de printf, la troisième argument de fprintf, parce que je
ne pas avoir d'espaces réservés ici.
Je ne suis pas y compris les variables.
Mais encore une fois, fprintf et tous ces fichiers fonctions qui fonctionnent avec des fichiers
sont généralement allons avoir besoin du fichier sur lequel ils évoluent.
>> Enfin, la dernière chose importante à faire est de fermer le dossier, tout comme
avec - chaque fois que nous malloc quelque chose, nous voulons libérer quelque chose, de peur que nous
avoir une fuite de mémoire - nous voulons de fermer notre fichier.
Si ce programme est sorti sans fermeture le fichier, les chances ne sont rien irait
mal, surtout si elle était un petit fichier.
>> Mais il est certainement bon style de programmation et la pratique de toujours fermer votre fichier
lorsque vous avez terminé de l'utiliser.
Voilà donc les bases de fichier I / O. Vous avez probablement déjà vu ça avant, ou
regardé dans ce court fantastique.
Est-ce que quelqu'un a des questions, avant nous entrons dans une certaine codification de la pratique
problèmes, sur le fichier E / S ou la étapes je suis juste allé sur?
>> [TAPER SOUNDS]
>> JASON HIRSCHHORN: Avez-vous une question, Avi?
>> AVI: Non
>> JASON HIRSCHHORN: OK.
Je vais attendre une autre Sept secondes.
[RIRES]
C'est vraiment un bon pourboire.
Vous les gars n'aiment tout simplement pas poser des questions.
C'est très bien.
OK.
Donc, notre premier problème pratique est, nous sommes va dupliquer la fonction de
un outil de ligne de commande que vous avez probablement utilisé avant - copie -
l'outil de copie.
Si vous tapez cp puis passez deux arguments dans votre terminal, vous pouvez
copier un fichier.
Et c'est ce que nous allons d'écrire en ce moment.
>> Encore une fois, la lecture hors de cette diapositive, je ferais d'écrire un programme qui prend
deux et seulement deux en ligne de commande arguments -
un fichier source et un fichier de destination -
et copie le contenu de la source déposer le fichier de destination
un octet à la fois.
Donc, c'est beaucoup demander.
>> Encore une fois, une bonne approche pour cela est de pas aller directement au code C, mais
décomposer en deux étapes.
Premièrement, pensez à la logique - exactement ce que je vous demande de faire -
et de comprendre tous les étapes à ce problème.
Pas en C, seulement dans certains pseudo, ou même un modèle mental de
ce qui se passe.
>> Ensuite, une fois que vous avez le pseudo-bas, comprendre comment le pseudo-
des cartes sur les outils et les choses que nous avons appris à utiliser en C.
>> Et enfin, une fois que vous avez tout ce que ensemble, vous pouvez coder le problème.
Prenez 5 à 10 minutes à travailler sur ce problème.
Je vais mettre les instructions sauvegarder en une seconde.
Et puis nous allons passer en revue le pseudo-code, et le code
il vit en groupe.
>> Si vous avez des questions pendant que vous êtes travailler sur ce, n'hésitez pas à soulever
votre main, et je viendrai autour et y répondre.
>> ÉTUDIANT 7: Puis-je glisser un morceau de papier?
>> JASON HIRSCHHORN: Quoi de neuf?
>> [TAPER SOUNDS]
>> JASON HIRSCHHORN: OK.
Passons en revue le pseudo-premier, et alors je vais vous donner quelques plus
minutes pour terminer le codage.
>> Qui voudrait me commencer avec la première ligne de
pseudo pour cette fonction?
>> ÉTUDIANT 8: Assurez-vous que vous avez reçu deux fichiers.
>> JASON HIRSCHHORN: OK.
Et si nous ne sommes pas?
>> ÉTUDIANT 8: Je voudrais revenir à 0.
>> JASON HIRSCHHORN: Faut-il revenir 0?
>> ÉTUDIANT 8: Retour a -
suppression.
Désolé.
>> JASON HIRSCHHORN: Ouais.
Probablement pas 0.
Parce que 0 signifie tout était bon.
OK.
C'est donc la première ligne de pseudo-code.
Qui a la deuxième ligne de pseudo?
>> ÉTUDIANT 9: Ouvrez les deux fichiers?
>> JASON HIRSCHHORN: Ouvrez les deux fichiers.
OK?
>> ÉTUDIANT 10: Vérifiez si le fichier est NULL?
>> JASON HIRSCHHORN: Vérifiez vous ne sont NULL.
En aparté -
slash 0 -
est que NULL?
>> ÉTUDIANT 11: Non
>> JASON HIRSCHHORN: Ce n'est pas NULL.
C'est ce qu'on appelle le terminateur NULL.
Il s'agit en fait orthographié avec un seul l.
Donc vérifier quelque chose contre cela - c'est en fait un caractère -
afin de vérifier quelque chose qui est contre pas la même que la vérification pour voir s'il
vaut NULL.
>> Et certaines personnes -
sur leurs questionnaires et leur problème ensembles - ont obtenu le
deux de ceux confondre.
Mais les deux d'entre eux sont en fait différent.
On finit une chaîne -
l'un est un pointeur vers 0.
>> ÉTUDIANT 12: Pourquoi ne pas vérifier assurez-vous que les fichiers ne sont pas NULL
avant de les ouvrir?
>> JASON HIRSCHHORN: Donc ouvert arrêts quelque chose dans ce fichier.
Et si vous revenez ici -
si cette ligne - fopen -
vous donnera une adresse et magasin cette adresse dans le fichier si cela fonctionne.
Si cela ne fonctionne pas, il permet de stocker NULL -
>> ÉTUDIANT 12: Oh.
OK.
Vous avez obtenu.
>> JASON HIRSCHHORN: Dans le fichier.
Donc, vous ne pouvez pas vérifier la valeur NULL avant que vous les avez ouvert.
NULL signifie quelque chose n'a pas fonctionner correctement.
OK.
Donc, assurez-vous que ni dire?
Ou sont?
Que pensons-nous?
Nous irons avec cela.
>> ÉTUDIANT 13: Est.
>> JASON HIRSCHHORN: Est?
Ni est?
>> ÉTUDIANT 13: Est.
>> JASON HIRSCHHORN: OK.
Il semble y avoir une certaine consensus sur ce point.
Ni est NULL.
OK, la prochaine ligne de pseudo.
Qui ne m'a pas encore donné une ligne?
Nous vous attendrons.
Ouais.
>> ÉTUDIANT 14: Vous avez à lire partir du premier fichier?
>> JASON HIRSCHHORN: OK.
>> ÉTUDIANT 14: Ou nous utilisons fscanf ou quelque chose comme ça le premier fichier?
>> JASON HIRSCHHORN: Donc, nous voulons lire le premier fichier et -
Mettons que ici.
Lire à partir du fichier source.
Et puis, que faisons-nous après nous lire le fichier source?
Quelqu'un d'autre?
>> ÉTUDIANT 15: Ecrire en le fichier de destination?
>> JASON HIRSCHHORN: Nous vous écrivons pour le fichier de destination, et -
OK.
Que nous manque?
Quelqu'un d'autre qui ne m'a pas donné une ligne de code encore - de pseudo.
Ouais.
>> ÉTUDIANT 16: Peut-être que vous pouvez toujours vérifier si il ya quelque chose à lire pour,
comme la ligne suivante?
Qui sont comme la ligne suivante, voir si elle existe.
>> [ÉLECTRONIQUE BIP]
>> JASON HIRSCHHORN: Oups.
C'est mon logiciel de journalisation.
Ouais?
>> ÉTUDIANT 16: Ouais.
>> JASON HIRSCHHORN: Alors, donnez à moi encore une fois.
>> ÉTUDIANT 16: Vérifiez si il ya encore une prochaine ligne de la
fichier source à lire.
>> JASON HIRSCHHORN: OK.
Donc, nous ne sommes pas la lecture des lignes - lisaient octets ici -
mais vous avez raison.
Nous voulons lire et à écrire jusqu'à ce que il n'y a pas plus d'octets.
OK.
Et si ceux-ci devraient vraiment être en retrait un peu, parce qu'ils sont là-dessous.
Droite?
Jusqu'à ce que nous sommes hors d'octets, nous allons lire le fichier source et écrire
dans le fichier de destination.
>> Et puis, ce qui est la dernière ligne de pseudo?
Quelqu'un qui n'est pas donné moi quelque chose encore.
>> ÉTUDIANT 17: Fermer les fichiers?
>> JASON HIRSCHHORN: Exactement.
Fermez les fichiers.
Donc, il ya notre pseudo.
Je vais mettre le pseudo dans gedit, et en quelques minutes nous
codera ensemble.
>> OK.
Laissez-nous commencer en tant que groupe.
Nishant, j'ai mon nouveau fichier.
Je viens d'ouvrir cette place.
Untitled document 1.
Quelle est la première chose que je dois faire?
>> Nishant: Inclure les bibliothèques?
>> JASON HIRSCHHORN: OK.
Qu'est-ce que les bibliothèques?
>> Nishant: stdio.h, stdlib.h, je crois?
>> JASON HIRSCHHORN: OK.
Quelle est stdlib pour?
>> Nishant: j'ai oublié.
>> JASON HIRSCHHORN: OK.
Donc inclure stdio.
Que dois-je faire avant même Je commence le codage?
>> Nishant: Donnez votre tête?
>> JASON HIRSCHHORN: Comment puis-je l'obtenir coloré?
>> [VOIX interposition]
>> Nishant: Comment obtenez-vous il de couleur?
>> JASON HIRSCHHORN: Comment puis-je le codage couleur?
>> Nishant: Je ne sais pas.
Oh.
Enregistrer.
>> JASON HIRSCHHORN: Save.
Oui.
Je dois enregistrer en tant que. C.
Donc, l'enregistrer sur le bureau comme cp.c.
Sweet.
Et si je veux obtenir un style plein des points, que dois-je
inclure au sommet?
>> Nishant: Vous pouvez écrire votre nom, du programme, et dans le but
du programme ainsi?
>> JASON HIRSCHHORN: On dirait bien.
Excellent.
Donc, vous nous avez commencé parfaitement.
# Include -
nous allons aussi écrire -
OK.
Donc, je pense que je suis prêt à se rendre.
Qui a la première ligne de code pour moi - ou les premières lignes de code qui
il faudra pour satisfaire notre première commenter en pseudo-code?
Vous.
>> ÉTUDIANT 18: Devrait-il pas int argc, char * et argv?
>> JASON HIRSCHHORN: Je pense que vous avez raison.
Changeons de int principales, parenthèse ouverte, int argc, virgule, char * argv?
Comme ça?
>> ÉTUDIANT 18: Supports.
>> JASON HIRSCHHORN: Supports.
Ouvrir support, ferme la parenthèse, près parent.
Parfait.
Maintenant, je peux prendre des arguments de ligne de commande.
OK.
Nous assurer que nous sommes donné deux fichiers.
Vous pouvez me donner aussi.
>> ÉTUDIANT 18: Si argc -
celui-ci ne correspond pas à 3.
>> JASON HIRSCHHORN: Si paren ouvertes argc ne pas égal à 3?
>> ÉTUDIANT 18: Ouais, vous revenez 1 ou quoi que ce soit.
>> JASON HIRSCHHORN: Désolé.
>> ÉTUDIANT 18: Retour 1 ou quoi que ce soit.
>> JASON HIRSCHHORN: Retour 1.
OK?
Grand.
Ouvrez les deux fichiers.
Qui peut m'aider à ouvrir les fichiers?
Qui ne m'a pas encore donné le code?
Kurt?
>> KURT: Donc, tous les bouchons F-I-L-E source d'étoiles.
>> JASON HIRSCHHORN: Je vais de prendre les voyelles.
Ce sont cool.
C'est comme Tumblr.
>> ÉTUDIANT 18: Equals fopen -
>> JASON HIRSCHHORN: Égal fopen?
>> ÉTUDIANT 18: Ouvert parenthèse, argv, parenthèse ouverte.
>> JASON HIRSCHHORN: Attendez.
Désolé.
Ouvrir parenthèse.
OK.
>> ÉTUDIANT 18: Ouais.
Argv sous 1.
>> JASON HIRSCHHORN: Sous 1?
>> ÉTUDIANT 18: Ouais.
Argv parenthèse ouverte 1 -
Oui.
Et puis virgule, puis double ouverte citation, r, guillemet,
proches parenthèse, point-virgule.
>> JASON HIRSCHHORN: Sweet.
Et que dire de l'autre?
>> ÉTUDIANT 18: Très semblable, mais de S-R-C, vous appelez ce D-S-T.
>> JASON HIRSCHHORN: Oo!
J'aime cela.
>> ÉTUDIANT 18: Just D-S-T. Ouais.
Et puis argv, parenthèse ouverte, 2.
Ouais.
Et puis w au lieu de r.
Ouais.
>> JASON HIRSCHHORN: Très bien.
Suivant quelques lignes.
Aussi, si quelqu'un a des choses à ajouter à lignes que nous avons fait, n'hésitez pas à
Ajoutez ainsi.
Assurez-vous n'est ni NULL.
Qui peut me donner le code que j'ai besoin de s'assurer que la ligne de pseudo?
Archer.
>> ARCHER: Si src égal égaux NULL ou dst égal égaux
NULL, puis vous revenez -
>> JASON HIRSCHHORN: Quoi?
>> ARCHER: Retour 2?
>> JASON HIRSCHHORN: Retour 2.
Donc, si parenthèse ouverte src égale vaut NULL, ou -
tout ce que thing's - pipe?
Pipe?
Nous l'appellerons tuyau.
Tuyau, tuyau, dst égal égaux NULL, retour 2.
OK?
Jusqu'à ce que nous sommes hors d'octets -
nous sorte de sauté sur cette étape de la partie de pseudo-code pour aller ici.
>> Mais jusqu'à ce que nous sommes hors d'octets - qu'est-ce que cela ressemble?
Quel type de structure C -
mais je n'utilise pas le mot structure, parce que nous allons commencer à utiliser
que dans d'autres cas -
mais C outil fait que cela ressemble?
>> ÉTUDIANT 19: Une boucle.
>> JASON HIRSCHHORN: Une boucle.
Sonne comme une boucle.
Alors, qui peut me donner la première ligne du code de la boucle ici?
Vous pouvez également choisir le type de boucle que vous voulez, si vous me donnez
cette ligne de code.
Il existe trois types.
Vous pouvez donc choisir.
Je dirais un de ceux.
Avi.
Lequel voulez-vous?
>> AVI: POUR.
>> JASON HIRSCHHORN: POUR.
>> AVI: int i est égal à zéro.
>> JASON HIRSCHHORN: OK.
>> AVI: Cette partie, je ne suis pas sûr.
Mais i est inférieur à la taille de la source d'étoiles?
Je ne suis pas sûr de cela.
>> JASON HIRSCHHORN: OK.
>> AVI: Parce que vous voulez que le taille d'un fichier, non?
>> JASON HIRSCHHORN: Donc, ce ne sera probablement pas nous donner la taille de l'effectif
déposer en octets.
Alors quoi d'autre pourrions-nous faire?
Quel est l'autre type de boucle?
Ou devrions-nous nous en tenir à la boucle POUR?
>> ÉTUDIANT 20: Pourriez-vous faire une boucle WHILE?
Et puis, ce que vous faites est it! -
parce que nous avons un char * pour le fichier.
Donc, si nous gardons juste incrémentation que jusqu'à ce que nous allions trouver le caractère NULL à
la fin de celui-ci?
Ou non, n'est-ce pas la façon dont les fichiers de travail?
>> JASON HIRSCHHORN: Donc, nous pouvons garder incrémenter le char *
jusqu'à ce qu'on trouve la valeur NULL -
>> ÉTUDIANT 20: Essentiellement continuer caractère par caractère jusqu'à ce que nous avons atteint
la fin du fichier.
>> JASON HIRSCHHORN: Oui.
C'est ce que nous voulons faire.
Nous voulons continuer à lire, caractère par caractère, jusqu'à ce que nous arrivons à
la fin du fichier.
>> ÉTUDIANT 20: Ouais.
Trouver -
quelle est la fin ou stop à la fin d'un fichier texte.
>> JASON HIRSCHHORN: OK.
Ainsi, lorsque nous arrivons à la fin du fichier - comment savons-nous que nous avons atteint
la fin d'un fichier?
Si je vous appelle -
donc revenons en arrière.
Qu'est-ce qu'une fonction?
Allons à cette ligne ici.
Lire à partir du fichier source.
Qui peut me donner cette ligne de code?
>> ÉTUDIANT 21: fscanf?
>> JASON HIRSCHHORN: fscanf.
OK.
Que faire si je veux lire, très spécifiquement, un octet?
>> ÉTUDIANT 21: Je ne sais pas.
>> JASON HIRSCHHORN: OK.
Encore plus simple que fscanf - ce qui est un -
Je veux lire à partir d'un fichier source?
Lire à partir d'un fichier source.
Ce qui est une fonction - ouais.
>> ÉTUDIANT 22: C'est fread?
>> JASON HIRSCHHORN: Fread.
Je pense que nous allons coller avec que l'un pour l'instant.
Quel genre d'arguments ne fread prendre?
>> ÉTUDIANT 22: Probablement le type de fichier, puis l'emplacement dans le fichier?
>> JASON HIRSCHHORN: Que puis-je saisir ici de comprendre ce type d'arguments
fread prend?
>> ÉTUDIANTS DE NOMBREUSES: Homme fread.
>> JASON HIRSCHHORN: Homme fread et fwrite.
On dirait qu'ils traînent ensemble.
Donc fread prend combien arguments?
>> ÉTUDIANT 23: Quatre.
>> JASON HIRSCHHORN: Il faut quatre arguments.
Il prend un pointeur, une taille, et que chose, ce qui est bizarre, et certains fichiers.
OK?
Lisons à ce sujet ici.
"La fonction fread lit n memb éléments de données, chaque taille octets
de long, depuis le flux pointé par écouter, de les stocker à l'emplacement
donnée par le pointeur ".
>> Donc, quatre arguments.
Pourquoi dois-je copier non seulement cela, et collez-le ici.
OK.
Alors, qui peut commencer à remplir ces arguments pour moi?
Avi.
>> AVI: Sortez le vide.
Mettez juste src.
Sortez pointeur et l'étoile.
Mettez src.
Puis -
>> JASON HIRSCHHORN: Je vais arrêter Vous êtes là, parce que c'est incorrect.
Vous avez raison de src, mais où devrait src aller?
>> [VOIX interposition]
>> JASON HIRSCHHORN: Il devrait aller ici.
C'est la src - notre src est un type.
Voyons ici.
Cette demande pour un type FILE *, nous effectivement les voir plus souvent comme ça.
Donc, cette demande pour un argument de type de fichier * appelé ruisseau qui est src.
OK?
>> Quelle est la taille de choses ne nous voulons lire?
Je vous ai donné ce dans le la description du problème.
>> ÉTUDIANT 24: Un octet à la fois.
>> JASON HIRSCHHORN: Un octet.
Quelle est la taille d'un octet?
Sa taille est en octets, de sorte que je peux mettre là?
>> ÉTUDIANT 25: Une.
>> JASON HIRSCHHORN: One.
Droite.
Sa taille est en octets de l'unité, si 1 est 1 octet.
Combien dois-je envie de lire à la fois.
>> ÉTUDIANT 26: Un?
>> JASON HIRSCHHORN: Une chose.
Je veux lire une chose de taille 1, une bouchée à la fois.
Et où puis-je l'ai mis, une fois que j'ai lu?
>> ÉTUDIANT 27: Destination?
>> JASON HIRSCHHORN: Je ne peux pas mettre tout droit dans la destination.
>> ÉTUDIANT 28: Tu vas vente dans un troisième pointeur?
>> ÉTUDIANT 27: Pour la destination.
>> JASON HIRSCHHORN: OK.
Ouais.
>> ÉTUDIANT 29: Vous pouvez déclarer quelque chose à agir comme un stockage temporaire plus tôt.
>> JASON HIRSCHHORN: OK.
Donne-moi ça.
>> ÉTUDIANT 29: Un autre fichier pointeur, peut-être?
>> JASON HIRSCHHORN: OK.
Donc, ce n'est étoile vide -
c'est un type void étoiles, si ce n'est pas le à être un pointeur de fichier.
Et si je lis un octet, où serait un bon endroit
pour stocker un octet?
>> ÉTUDIANT 29: Un tableau?
>> JASON HIRSCHHORN: un tableau.
OK.
Et quoi d'autre est quelque chose qui est juste la taille d'un octet?
>> ÉTUDIANT 30: Un char *?
>> ÉTUDIANT 29: Ouais.
>> JASON HIRSCHHORN: Un char * n'est pas un octet.
>> ÉTUDIANT 29: Un car.
>> JASON HIRSCHHORN: Un char est un octet.
Droite?
Alors appelons ce tampon est un générique nom utilisé pour ces choses pour stocker
quelque chose de temporaire.
Je crée donc un tampon.
Droite?
Mais il prend un void *.
Alors peut-être que vous avez raison, qu'il devrait être un tampon de taille 0.
Il stocke donc un -
droite.
>> Parce que ce droit ici - omble tampon est un personnage, mais
cela prend un void * -
un pointeur.
Donc, je pourrais le faire et maintenant tampon est un pointeur.
Que pouvais-je faire?
>> ÉTUDIANT 31: Mettez une étoile à côté du type char.
>> JASON HIRSCHHORN: je pouvais ont créé ce char *.
OK.
Qu'est-ce que c'est une autre chose que je pouvais faire?
Ou allons-y avec celui-ci.
Char * tampon, de sorte que ce que je mets ici?
>> ÉTUDIANT 31: Buffer.
>> JASON HIRSCHHORN: Buffer.
Tampon est un pointeur sur un caractère.
Et à cet endroit, nous mettons un octet de quelque chose que nous avons lu.
Ouais.
Avi.
>> AVI: Juste une question rapide.
Voulez-vous malloc tampon?
>> JASON HIRSCHHORN: Qui peut répondre à cette question?
>> ÉTUDIANT 32: Eh bien, il n'a pas vraiment Point à tout moment, donc -
>> JASON HIRSCHHORN: Mais faire nous voulons malloc il?
>> ÉTUDIANT 32: Si vous deviez le faire que Ainsi, je pense que, oui, parce que vous aurez besoin
un endroit pour qu'il pointe vers.
>> JASON HIRSCHHORN: Avons-nous avoir à malloc il?
>> ÉTUDIANT 33: Si vous allez utiliser à l'extérieur de la boucle.
>> JASON HIRSCHHORN: Allons-nous utiliser à l'extérieur de la boucle?
>> ÉTUDIANT 34: Oui.
>> ÉTUDIANT 35: Attendez.
Voulons-nous déclarer dans la boucle au-delà de?
>> JASON HIRSCHHORN: Donc je suppose que nous avons quelque temps boucle de pseudo ici que nous sommes
à essayer de comprendre, que nous n'avons pas encore appris à.
Nous n'avons pas besoin de malloc il.
Nous évoluons dans le principal, il va seulement pour être utilisé à l'intérieur de cette boucle.
Il n'a pas besoin d'exister en dehors de ce produit.
>> Ainsi, il peut s'agir d'une variable locale.
Vous avez un pointeur vers une variable locale.
>> ÉTUDIANT 36: Mais ce n'est pas pointant à quelque chose.
>> JASON HIRSCHHORN: Non, ce n'est pas initialisée à rien.
Mais nous n'allons pas l'utiliser aussi.
Nous allons mettre quelque chose dans la première fois nous l'utilisons.
Alors que semble OK.
Donc nous n'avons pas besoin de malloc ici.
Et je pense que c'est OK comme c'est.
OK.
Nous avons la ligne fread.
Faisons la ligne suivante.
>> Si nous voulons écrire dans un fichier, ce qui est une bonne fonction à utiliser pour le faire?
>> ÉTUDIANT 37: fwrite?
>> ÉTUDIANT 38: fprintf?
>> JASON HIRSCHHORN: fprintf est un.
Quel est l'autre?
>> ÉTUDIANT 39: fwrite.
>> JASON HIRSCHHORN: fwrite.
Et pour nos fins, fwrite, que nous avons vu ici, c'est
probablement le meilleur choix.
Il prend quatre arguments ainsi.
Nishant, peut vous donner moi les arguments?
>> Nishant: cours au premier pour être juste tampon.
>> JASON HIRSCHHORN: OK.
>> Nishant: Le second de juste aller à 1.
Troisième va être 1.
Et le quatrième va être dst.
>> JASON HIRSCHHORN: Quelqu'un at-il Pour toute question sur cette ligne?
Cela semble bon.
OK.
Alors maintenant, il semble que la seule chose que nous sommes manquant - en fait, écrivons
cette dernière ligne.
Fermez les fichiers.
Qui peut nous finir l'écriture ces deux dernières lignes?
Oui.
Désolé, quel est votre nom?
>> LUCY: Lucy.
>> JASON HIRSCHHORN: Lucy.
>> LUCY: src fFerme puis destination fclose.
>> JASON HIRSCHHORN: fclose, parenthèse ouverte, src, proches parenthèse, point-virgule.
Et fclose -
ouais?
>> LUCY: Open parenthèses, dst et puis point-virgule.
>> JASON HIRSCHHORN: Très bien.
Et que dois-je inclure à la fin?
>> LUCY: Retour 0.
>> JASON HIRSCHHORN: Retour 0.
Dois-je?
Juste une question.
Faut-il inclure la rentabilité 0?
>> ÉTUDIANTS DE NOMBREUSES: Non
>> JASON HIRSCHHORN: Non
Principal fait automatiquement si vous arrivez à la fin.
Mais je pense qu'il est bon de inclure explicitement.
Surtout quand on y retourne l'autre les choses tout au long du programme.
OK.
C'est ce qui nous manque -
TOUT quoi?
Qui peut penser à une -
a une certaine idée de ce que les choses pourrait aller là-bas?
Même si c'est seulement dans certains pseudo comme langue?
>> Que sommes-nous vraiment - ce voulons-nous aller jusqu'à?
Ouais, Lucy.
>> LUCY: La fin du fichier.
>> JASON HIRSCHHORN: La fin du fichier.
Alors, que voulez-vous dire par la fin du fichier?
>> LUCY: Une fois que vous atteignez le fin du fichier, arrêter.
>> JASON HIRSCHHORN: OK.
Donc, une fois que nous arrivons à la fin du fichier.
Comment savons-nous que nous avons atteint la fin du fichier?
>> ÉTUDIANT 40: Je pense tampon sera mis à NULL.
>> ÉTUDIANT 41: Buffer est déclarée à l'intérieur de la boucle.
>> JASON HIRSCHHORN: Donc vous pensez tampon sera mis à NULL.
Pourquoi serait tampon être mis à NULL?
>> ÉTUDIANT 40: Parce que quand vous fread, vous essayez de mettre
rien dans le tampon.
>> JASON HIRSCHHORN: OK.
Donc, vous fread penser -
quand nous sommes arrivés à la fin de la fichier, ce qui est fread va faire?
Je pense que c'est la question nous avons à comprendre.
Qu'est-ce que fread faire?
Est-il mis NULL dans un tampon, ou faut-il faire autre chose?
Comment pouvons-nous comprendre de quoi il ne?
>> ÉTUDIANT 42: Man.
>> JASON HIRSCHHORN: Man.
Alors regardons ici.
Valeur de retour.
En cas de succès, fread et fwrite retourner le nombre d'articles lus ou écrits.
Ce nombre est égal au nombre d'octets transféré que lorsque la taille est 1.
En cas d'erreur, ou la fin de l' fichier est atteinte, la valeur de retour est un
court nombre d'éléments ou 0.
>> Donc, pour nos fins, si atteint fread la fin du fichier, et lit à partir de
la fin du fichier, il n'y a rien à gauche à lire, ce que ça va revenir?
>> ÉTUDIANT 43: Zero?
>> JASON HIRSCHHORN: Quoi?
>> ÉTUDIANT 43: Zero?
>> JASON HIRSCHHORN: zéro.
Il va retourner zéro.
Nous savons donc que fread, lorsque nous avons atteint la fin du fichier, va
pour revenir à zéro.
Comment pouvons-nous utiliser à notre avantage?
>> AVI: Vous pouvez déclarer une variable en dehors de la boucle de contrôle dite.
Si le contrôle est égale à -
pour l'instant - un.
>> JASON HIRSCHHORN: OK.
>> AVI: Et puis vous pouvez mettre un SI déclaration juste après fread dire si
fread est égale à zéro -
pas.
>> JASON HIRSCHHORN: Qui peut aider à Avi?
>> AVI: Quelle est la valeur retourné par fread?
>> JASON HIRSCHHORN: Nous venons de est allé là-dessus.
>> AVI: Comment vous le représentez-vous?
>> JASON HIRSCHHORN: il revient donc - nous allons regardez ici - il renvoie une
size_t, qui est essentiellement un nombre entier.
Donc, il renvoie un entier.
Et dans notre cas, il sera retourner 1 ou 0 -
1 si elle disait une chose - un octet, et 0 si nous avons atteint la fin.
Donc, si fread -
ouais?
>> ÉTUDIANT 45: Vous ne pouvez pas vous suffit de mettre le plein fread (buffer, 1, 1, src) dans l'
tout en boucle?
>> JASON HIRSCHHORN: Donc, vous proposez Ce faisant, il en?
>> [VOIX interposition]
>> JASON HIRSCHHORN: Attendez.
Donc, nous débarrasser de cela.
Vous proposez donc de mettre fread dans là?
Que devrions-nous aller aussi si vous voulez faire cela?
>> ÉTUDIANT 45: Le tampon en dehors.
>> JASON HIRSCHHORN: Nous devrions également déplacer ce ici.
>> ÉTUDIANT 45: Mais est-ce que cesse faire avancer?
>> [VOIX interposition]
>> JASON HIRSCHHORN: OK.
C'est donc ce que Okshar proposé.
Nous créons notre tampon.
Nous TOUT fread, fwrite nous.
Pensées à ce sujet?
>> ÉTUDIANT 46: Ma seule question est, serait il fait exécuter la commande fread?
>> JASON HIRSCHHORN: Grande question.
Lorsque vous mettez un appel de fonction l'intérieur d'un état, est-ce que
appel de fonction exécuter?
Nous avons vu des exemples de cela avant.
Droite?
>> ÉTUDIANT 46: OK.
Ouais.
Donc, il fait exécuter.
>> JASON HIRSCHHORN: Nous avons vu des choses comme ça avant, où nous avons une
appel de fonction à l'intérieur d'un état.
Est-ce que cet appel de fonction exécuter?
Oui.
Donc, la réponse est oui.
Cet appel de fonction sera exécutée.
Mais encore une fois, est-ce ce que nous voulons?
>> Ce qui est une façon, nous pourrions comprendre si c'est ce que nous voulons?
>> ÉTUDIANTS DE NOMBREUSES: l'exécuter?
>> JASON HIRSCHHORN: Nous pourrions exécuter.
Mais avant de faire cela, nous avons pu raisonner aussi par ce biais.
Si -
dire que nous avons un octet dans notre fichier, nous aurons ici,
nous allons arriver à ce code.
Ce sera exécuté.
fread retourne un octet et stocker dans la mémoire tampon.
Et ce sera évalué à 1, droite, après il retourne 1.
>> Ainsi, alors que 1.
Est-ce que cela veut dire le code à l'intérieur la boucle WHILE exécute?
>> ÉTUDIANT 47: Ouais.
C'est vrai.
>> JASON HIRSCHHORN: Oui.
1 est vrai.
Ce n'est pas 0.
Ainsi, le code à l'intérieur ici exécutera.
Nous allons donc écrire que.
Nous allons revenir à cette ligne une fois de plus.
Maintenant, nous avons -
nous sommes à la fin de notre dossier.
Nous lisons à la fin de notre fichier, parce que nous n'avions qu'un seul octet en elle.
>> Fread retourne 0, les magasins quelque chose dans le tampon.
Je ne sais vraiment pas ce que il stocke dans un tampon.
Nous pourrions probablement voir pour voir ce qu'il fait.
Que je ne sais vraiment pas.
Nous ne savons pas, qui se soucie de ce il stocke dans un tampon?
Mais il ne retourne 0.
Et volonté, tout 0 exécuter?
>> TOUT 0 ne sera pas exécuter.
Alors que nous passons ici.
Alors soyons un spectacle de mains si ce est le code que nous devrions courir, ou si nous
devrait faire des changements en premier.
Donc, si vous pensez - vous devez voter.
Si vous pensez que nous devrions exécuter ce code tel quel, s'il vous plaît, levez la main.
>> OK.
Il ya une -
avez-vous une question, une préoccupation?
Ouais.
>> ÉTUDIANT 48: Après nous passons tampon à l'extérieur de la boucle, nous faisons
avoir à malloc il?
>> JASON HIRSCHHORN: Grande question.
Après nous passons tampon en dehors de la boucle, avons-nous à malloc il?
C'est une question de portée.
Si on initialise tampon en dehors de cette boucle, il sera exister
à l'intérieur de la boucle?
>> ÉTUDIANTS DE NOMBREUSES: Oui.
>> JASON HIRSCHHORN: Oui.
Son champ d'application couvre l'intérieur de la boucle, et, vraiment, rien en dessous de l'intérieur
de ce code, y compris la choses à l'intérieur ici.
Donc nous n'avons pas besoin de malloc il.
C'est une variable locale, et son champ d'application comprend encore la boucle.
>> ÉTUDIANT 49: Avons-nous besoin de le libérer?
>> JASON HIRSCHHORN: Avons-nous besoin de tampon libre?
>> ÉTUDIANT 49: Oui, si nous ne faisons pas malloc.
>> JASON HIRSCHHORN: Avons-nous besoin de tampon libre?
Nous ne le faisons pas.
Là encore, il s'agit d'une variable locale, donc nous n'avons pas besoin de le libérer.
OK.
Voyons ce qui se passe.
Il est donc non initialisée.
C'est ce quelque chose qui Marcus a proposé plus tôt.
Nous avons donc cette erreur, variable tampon est initialisée lorsque utilisé ici.
>> Comment pouvons-nous résoudre ce problème?
>> ÉTUDIANT 50: malloc il?
>> ÉTUDIANT 51: Equals NULL?
>> ÉTUDIANT 52: Dites tampon est égal à NULL.
>> JASON HIRSCHHORN: OK.
On dirait bien.
Nous l'avons maintenant.
Créons quelque chose pour essayer de copie.
Donc, nous avons notre fichier texte.
Comment pouvons-nous lancer ce programme?
Ouais.
>> ÉTUDIANT 53: Vous pouvez le faire point réduire cp, test.txt.
Et puis, vous pouvez nommer un autre fichier qui il va stocker dans.
>> JASON HIRSCHHORN: OK.
Nous l'appellerons out.txt.
Cool?
Faute Seg.
Réflexions sur la faute de segment?
C'est très bien.
Comment pouvons-nous savoir où le défaut de segment est?
Qu'est-ce?
>> ÉTUDIANT 54: Gdb.
>> JASON HIRSCHHORN: Gdb.
Nous courons gdb en écrivant gdb point barre, le nom de notre programme.
Aucun des arguments de ligne de commande là-bas.
Nous allons définir un point d'arrêt au principal.
Si je veux commencer à gdb, je fais quoi?
>> ÉTUDIANT 55: R.
>> JASON HIRSCHHORN: R. Et puis quoi?
>> ÉTUDIANT 55: Les arguments?
>> JASON HIRSCHHORN: Puis le arguments de ligne de commande.
Passons en revue.
N est juste me prend ligne par ligne.
Je vais aller jusqu'à Je reçois de ma faute de segment.
Il ya de ma faute de segmentation.
Il ressemble à fread causé mon segment faute.
Je sais fread causé ma faute de segmentation, parce que c'était la
ligne que nous venons exécuté.
>> Et la seule chose qui était se passe dans cette ligne -
deux choses se passaient.
Fread allait, et puis nous avons été faire quelques vérifications de TOUT.
Je suis prêt à parier que le TOUT contrôle ne causait pas de ma faute de segmentation.
Très probablement, fread était provoquant ma faute de segment.
Je vois aussi quelque chose ici, memcopy.
>> Copie de la mémoire.
On dirait que le déplacement de la mémoire un endroit à l'autre.
Sonne comme quelque chose qui se passerait dans fread, peut-être un peu de mémoire
passer d'ici à là.
Passons en revue ce nouveau.
Comment puis-je le démarre plus et le relancer?
Ouais.
>> ÉTUDIANT 56: Avez-vous besoin de mettre une esperluette avant tampon?
>> JASON HIRSCHHORN: Donc esperluette avant tampon me donner l'adresse de
tampon, qui est un char *.
Courons à travers ce une fois de plus.
Comment puis-je passer en revue une fois de plus?
>> ÉTUDIANT 57: Pouvez-vous juste type d'exécution à nouveau?
>> JASON HIRSCHHORN: Il suffit de taper à nouveau terme.
Donc, nous n'allons pas exécuter cette ligne.
Alors tampon est un pointeur NULL.
Corriger?
Il pointe vers - Voyons.
Si nous avons notre -
dresser un tableau rapide de ce.
Tout le monde peut voir si J'écris ici?
>> Ainsi, dans la pile, on a un locale variable et elle est appelée tampon, et
c'est un pointeur sur un caractère.
Quelle adresse est ce charbon à?
>> ÉTUDIANT 58: 0x0.
>> JASON HIRSCHHORN: Droit.
C'est ce que c'est.
Ici, tampon à l'intérieur, est stocké 0x0.
C'est ce que nous avons - le configuration que nous avons en ce moment.
Donc cette ligne, fread, met quelque chose de la source où?
Dans cette zone ou cette boîte?
Quelle boîte?
Boîte ou boîte de droite à gauche?
Cette case de droite.
>> Il suit le pointeur, et le met ici.
Quand nous essayons de mémoire tactile à l'emplacement 0, qu'avons-nous?
Une erreur de segmentation.
C'est l'erreur que nous avons maintenant.
Ouais.
>> ÉTUDIANT 59: N'avez-vous pas de mettre un tampon de star?
Ou pas?
Pour fread?
>> JASON HIRSCHHORN: Donc fread prend un pointeur.
Donc, il passe dans un tampon.
Et puis ça va dé-référence quelque part à l'intérieur de fread.
Mais encore une fois, nous avons vu, il prend un pointeur.
Nous n'avons pas besoin de passer tampon étoiles.
Ce serait passer il tout ce qui est ici.
Et ce serait probablement nous donner une erreur parce que nous sommes dé-référencement il.
>> Droite?
Lorsque nous de-référence de ce pointeur, quand nous essayons d'accéder à cet emplacement,
nous obtenons une erreur - notre faute de segmentation.
Donc -
oops.
Nous allons arrêter de gdb.
Notre ligne -
notre problème - est juste ici sur cette ligne.
Et c'est un problème parce que de cette ligne.
>> Comment pouvons-nous créer une zone de est accessible en fread.
Droite?
Nous devons créer une boîte qui est un octet grand, la taille d'un caractère.
Mais nous avons besoin de cette boîte soit accessible lorsque cette fonction est exécutée.
Alors, où -
ouais.
Des idées?
>> ÉTUDIANT 60: Il suffit de régler comme caractère aléatoire.
Il suffit de faire égaux tampons carac le caractère.
Et puis, lorsque vous y avez tampon -
>> JASON HIRSCHHORN: Attendez.
Char buffer?
Donc, pas d'étoile?
>> ÉTUDIANT 60: Ouais.
Sortez l'étoile.
Égal à un caractère aléatoire.
>> JASON HIRSCHHORN: OK.
Alors donnez-moi un.
>> ÉTUDIANT 60: Comme un ou quelque chose.
Et puis, quand vous avez tampon là, vous utilisez un -
>> ÉTUDIANT 61: Star?
Oh non, l'esperluette.
>> ÉTUDIANT 60: Utiliser l'esperluette.
>> JASON HIRSCHHORN: OK.
Et qu'en est-il dans fwrite?
>> ÉTUDIANT 60: Utiliser l'esperluette nouveau.
>> JASON HIRSCHHORN: Très bien.
Donc votre idée est, nous allons créer un char et mettre quelque chose dedans, puis
écrire que l'omble.
>> ÉTUDIANT 60: Ouais.
>> JASON HIRSCHHORN: Qu'est-ce les gens pensent?
>> ÉTUDIANT 62: Il est alambiquée.
>> JASON HIRSCHHORN: OK.
Tirons-le.
Alors, cette fois, je vais tirer cela dans rouge sur la pile ici, puis nous
devront -
ooh!
Désolé.
Alors, cette fois, nous avons quelque chose qui s'appelle tampon, et il est sur la pile.
Corriger?
Et nous économisons en un, d'abord.
>> Ensuite, nous avons notre appel à fread.
Qu'est-ce que fread fait est qu'il prend un octet de notre dossier et met quelque part.
Il met dans quelle que soit la chose pointe vers.
Eh bien, avant que nous ayons cette adresse -
0x0.
Maintenant quelle adresse devons-nous?
>> ÉTUDIANT 63: Quel que soit le tampon d'adresse est.
>> JASON HIRSCHHORN: Quel que soit le tampon d'adresse est.
Il va probablement être quelque chose comme ça.
Probablement vais commencer par un b et une f, puis encore six autres
chiffres hexadécimaux.
Indifférent.
Certains adresse.
Et nous passons cette adresse po
>> Et nous allons mettre notre seul octet chose à cette adresse.
Nous allons donc mettre notre seul octet chose à l'intérieur ici.
Et puis nous allons écrire de ce qui est toujours à l'intérieur ici.
Quelqu'un at-il des questions à ce sujet?
Qui pense que ce code fonctionne?
>> Levez la main si vous pensez ce code ne fonctionnera.
Vous avez à prendre une position.
Et qui pense que ce code ne fonctionnera pas?
Levez la main.
Tout le monde devrait être levant la main.
OK.
Michael, où êtes-vous debout?
>> MICHAEL: Je ne peux pas décider.
En quelque sorte dans le milieu.
>> JASON HIRSCHHORN: Vous êtes dans le milieu.
Choisissez un.
>> MICHAEL: Je vais devoir foi et dire qu'il va travailler.
>> JASON HIRSCHHORN: OK.
Vous avez la foi et dire que cela fonctionne?
Qu'est-il arrivé?
>> [VOIX interposition]
>> JASON HIRSCHHORN: Pas de défaut de segment.
Comment pouvons-nous vérifier si deux choses sont égales?
Deux fichiers sont égaux.
>> ÉTUDIANT 64: Diff.
>> JASON HIRSCHHORN: Diff.
Contrôles diff pour les différences entre les deux dossiers, et si elle retourne
rien, ils sont identiques.
Et si nous nous ouvrons, nous obtenons notre fichier.
Alors que c'était la bonne solution.
Revenons à une fois de plus.
En fait, nous n'avons même pas besoin de l'initialiser.
>> Il serait sans doute chercher un peu propre si vous n'avez pas mis
quelque chose au hasard là-dedans.
Le point étant, vous avez besoin pour créer peu d'espace pour stocker quelque chose de
fread et prendre quelque chose de fwrite.
Et cette chose a dû être un locale variable sur la pile - vous
aurait pu malloc de l'espace.
>> Donc, nous pourrions avoir malloc écrit ici, et
qui aurait travaillé.
Et puis nous avons stockons nos choses quelque part sur le tas.
Mais c'est en fait, probablement, la solution la plus élégante.
Il suffit de créer un peu d'espace sur la pile pour que ces choses vont.
>> J'aurais deux autres commentaires.
Si vous deviez prendre son tour dans ce domaine, et puis obtenir marqué sur ce point, mes commentaires
serait la suivante.
Ce 1 est ici, pour moi, regardez comme nombres magiques.
Cette 1, en termes de fread, logique.
C'est le nombre de choses pour lire ou écrire.
>> Mais celui-ci devrait ici probablement quelque chose d'autre.
Alors, quelle est une solution?
>> ÉTUDIANT 65: Taille de l'octet.
>> JASON HIRSCHHORN: Comme ça?
>> ÉTUDIANT 65: Taille de l'omble.
>> JASON HIRSCHHORN: Taille de l'omble.
Ouais, l'octet n'est pas un type.
Donc, la taille des œuvres char.
Nous pourrions avoir, au sommet de notre code, # défini que.
Appelé quelque chose BYTE et c'est vraiment un caractère.
En fait, une approche encore mieux aurait pu être ce -
uint.
Quelqu'un sait-il ce que c'est?
>> Désolé.
Je l'ai arrière.
Attendez, non.
Quel chemin faut-il aller?
Quelqu'un sait-il ce que c'est?
Ouais.
>> ÉTUDIANT 67: Censé aider à normaliser dans les choses de systèmes qui
avoir - comme des entiers non signés qui ont de 8 octets?
>> JASON HIRSCHHORN: C'est tout à fait exact.
Sur des machines différentes, la taille d'un caractère -
généralement pas un caractère.
Chars sont généralement un octet.
Mais la taille des autres types de données sont différentes tailles sur un ordinateur 32 bits
par rapport à une machine 64 bits.
Un uint8_t est toujours 8 bits -
toujours un octet.
>> Et j'ai besoin de comprendre que fichier int en-tête standard.
Alors maintenant, cela aurait probablement été la meilleure façon d'écrire le code.
Donc je me débarrasser des nombres magiques.
Et j'ai aussi une plus logique tapez pour le tampon.
Ce n'est pas simplement un char, il est un octet, qui est ce que nous attendons qu'il soit.
>> Et ici, nous avons fait été un peu plus robuste.
Nous ne demandons pas un char, qui -
peut-être, qui sait - peut-être un autre taille sur des machines différentes.
Nous sommes en train de dire que c'est exactement un octet, toujours, quoi qu'il arrive.
Et si nous regardons ici, nous faisons cp.
Uh-oh.
Qu'est-il arrivé?
>> ÉTUDIANT 68: Il peut être activé.
>> JASON HIRSCHHORN: Quoi?
>> ÉTUDIANT 69: Est-ce?
>> ÉTUDIANT 70: Vous ne l'avez pas définir comme un type.
>> ÉTUDIANT 71: Mais il devrait être défini dans la norme.
>> ÉTUDIANT 72: Qu'est-ce qui se passe?
>> ÉTUDIANT 73: Devrait être définir tous les bouchons?
>> JASON HIRSCHHORN: il n'est donc pas # define.
En fait, dans ce cas, je suis allez utiliser typedef.
Parce que nous utilisons comme un type en un seul endroit.
Donc dans ce cas, nous voulons effectivement typedef comme nous l'impression d'un nouveau type
octet, et il est, pour l'essentiel, ce.
C'est un peu différent de # define.
>> Et maintenant, notre code fonctionne parfaitement.
Donc, encore une fois, # define prend quelque chose, remplace partout
l'autre chose.
C'est juste une macro -
raccourci pour se débarrasser des nombres magiques.
Mais dans ce cas, parce que nous sommes l'utiliser comme un type -
ici -
afin pour que cela fonctionne, nous avons besoin à typedef quelque octet est.
>> Et nous le définir ici.
Ce n'est pas une structure, c'est en fait juste un entier non signé.
C'est un octet.
Ce code sera disponible en ligne, et vous devriez tous avoir en ce moment.
>> Donc, nous avons -
parfait -
13 minutes pour aller problème réglé sur 5.
Je veux marcher à travers copy.c ensemble, et puis nous parlerons brièvement
sur les autres parties du problème posé.
Alors permettez-moi m'arrête copy.c.
Et le truc cool, c'est que nous avons fait déjà écrit beaucoup de ce code.
>> Le code que nous avons écrit littéralement juste est sorti de là où j'étais
écrit cela sur mon propre.
Mais ce n'est copy.c, constitue le fondement pour les deux premières parties de
le problème posé pour whodunit.c, qui vous devez écrire, et resize.c.
Recover.c, qui est le troisième et dernier partie de l'ensemble du problème, n'est pas
basé sur de ce fichier.
>> Vous allez avoir besoin d'écrire ce fichier, nous vous donnons un modèle pour que
déposer, mais il n'a rien à voir avec copy.c.
Mais parce que copy.c est le fondement de les deux premières parties, nous allons
à marcher à travers elle maintenant, si vous avez un bon sens de ce qu'il fait.
>> Et les commentaires donnent certains de loin.
Nous avons déjà écrit une partie de cette.
Tout d'abord, nous nous assurons nous obtenons trois arguments.
Ensuite, nous rappelant le nom du fichier.
Donc nous avons sauté cette étape lorsque nous avons codé notre truc -
quand notre cp.
Mais ici, ils font un peu plus propre.
>> Ils vérification pour s'assurer que deux fichiers sont bonnes, en
Outre les ouvrir.
Nous avons écrit tout ce code en ce moment, donc je suis ne vais pas m'attarder sur ce code.
Est à côté des choses qui est spécifique à les types de fichiers que nous utilisons, qui
sont des fichiers bitmap.
Fichiers bitmap ont des métadonnées qui leur sont associés.
>> Donc, le premier couple d'octets vous dire sur le fichier.
Ils ne sont pas les couleurs de le pixel dans l'image.
Ils vous disent sur le fichier.
Et si vous lisez l'ensemble du problème, vous aurez beaucoup plus d'informations
sur quels types de structures de métadonnées sont inclus avec des bitmaps.
>> Mais c'est pourquoi nous avons cette première ensemble de - ce code ici.
Nous lisons les métadonnées -
deux morceaux de métadonnées - le fichier tête et l'en-tête d'information.
Et nous vérifions certaines parties de celui-ci à assurez-vous qu'il est un fichier bitmap vrai
avant de poursuivre.
>> Et encore une fois, ce sont des détails que nous n'ont pas besoin d'aller dans maintenant.
Si vous lisez l'ensemble du problème, vous comprendrez les.
Longue histoire courte, ils sont tout simplement dire, il s'agit d'un fichier bitmap, et
ce qui confirme que.
>> Ensuite, nous écrivons les dans le fichier de rupture.
Nous voyons ici.
Nous écrivons pour le pointeur sur.
Ensuite, nous sommes déterminer rembourrage.
Encore une fois, comme c'est la particularité de un fichier bitmap, quelques lignes comprennent
un rembourrage à la fin.
Et si vous lisez l'ensemble du problème, vous en apprendrez plus sur rembourrage.
C'est la formule pour trouver rembourrage.
>> Important de se rappeler -
lorsque vous modifiez la taille d'un bitmap déposer, les changements de remplissage.
Lorsque vous modifiez la taille d'un déposer, les changements de remplissage.
Il ne va jamais être supérieur à 3 -
ça va être de 0 à 3 inclus.
Mais lorsque vous modifiez la taille de quelque chose, les changements de rembourrage.
>> Si je n'ai qu'un seul pixel de cette ligne, je besoin de trois octets de remplissage, car
chaque ligne doit être un multiple de quatre octets dans un fichier bitmap.
Mais si je double il, de passer d'un pixel à deux pixels, chacun d'eux,
disons, est un octet, alors j'ai besoin de deux octets de remplissage pour faire
que égal à quatre.
>> Alors, quand je change la taille de quelque chose, J'ai besoin de changer le montant
de rembourrage que j'ai.
Cela fait-il sens à tout le monde?
Ensuite, nous parcourons chaque rangée, ou à travers toutes les lignes.
Et puis nous parcourons chaque colonne de chaque ligne.
Nous traitons ce bitmap comme une grille, comme nous avons traité
le conseil dans 15.
>> Comme nous avons traité les briques quand nous les faire imprimer sur l'écran.
Une grille de lignes et de colonnes.
Puis - nous avons vu cela.
Nous avons en fait juste codé cela.
Nous avons créé un espace de stockage temporaire.
Nous lisons dans là, et puis nous écrire.
C'est exactement ce que nous venons de faire.
>> Ensuite, parce que j'ai dit chaque ligne se termine par une partie de rembourrage, nous
sauter que rembourrage -
l'ancienne rembourrage.
Et puis nous ajoutons de nouveau.
Dans ce cas, nous créons exactement le même fichier.
Nous ne faisons que copier.
Donc, cette ligne est un peu ridicule.
Nous pourrions littéralement juste mettre le rembourrage po
>> Mais si vous changez la taille du fichier, voulez-vous toujours cette ligne?
Donc, si nous changeons la taille d'un fichier, voulons-nous encore à sauter
sur le vieux rembourrage?
>> ÉTUDIANT 74: Oui.
>> JASON HIRSCHHORN: nous faisons donc.
Parce que ce, encore une fois, offres avec le fichier source.
Nous ne nous soucions pas le rembourrage à partir du fichier source.
Nous voulons aller à la ligne suivante.
Mais nous n'avons pas simplement remettons l'ancien quantité de remplissage.
Nous devons remettre l' nouvelle quantité de remplissage.
>> Alors, quand nous allons changer la taille d'un fichier, nous voulons toujours aller sur le
rembourrage dans l'ancien fichier - ce qui nous lisons depuis.
Mais ce que nous écrit, nous allons avoir besoin de remettre un peu différente
nombre de rembourrage qui nous avons déterminé.
Ouais.
>> ÉTUDIANT 75: L'ordre de ces deux lignes n'a pas d'importance, non?
Parce que vous manipulez différents fichiers.
>> JASON HIRSCHHORN: Exactement.
L'ordre de ces deux lignes n'a pas d'importance.
Nous écrivons cette ligne.
C'est ici pour le fichier nous écrit.
C'est important, si nous obtenons l' bonne quantité de rembourrage.
Ce doit composer avec le fichier en.
Nous voulons aller directement sur le rembourrage.
>> Nous ne voulons pas de lire -
si nous lisons un octet à la fois, nous ne se soucient pas de ces octets de remplissage.
Nous voulons passer à la ligne suivante.
Enfin, tout comme Lucy donné pour nous, nous fermons les fichiers et retourner 0.
C'est donc copy.c.
Et nous avons écrit - nous avons passé la plupart de section écrivant ceci, essentiellement.
>> Vous avez fait cela.
Donc, j'espère que vous avez un bon sens de ce qui se passe ici.
La grande différence, honnêtement, est juste cette première partie qui traite de
particularités de fichiers bitmap.
Donc, je n'ai que ma diapositive suivante, que devons-nous faire?
Eh bien, nous allons réfléchir à polar.
>> Et pour quelqu'un qui a lu par le problème réglé, que faisons-nous
besoin de faire en polar?
Simplement.
Aleja.
>> ALEJA: Pouvez-vous prendre la partie de chaque pixel qui dénote rouge.
Et puis -
sorte de?
>> JASON HIRSCHHORN: OK.
Alors, prenez la part de chaque pixel qui dénote rouge.
C'est proche, mais pas la totalité.
>> ÉTUDIANT 76: Eh bien, il ya différentes façons de le faire.
>> JASON HIRSCHHORN: OK.
Donnez-moi une seule façon.
>> ÉTUDIANT 76: Prenez tout le rouge, et alors mettre l'accent sur le bleu et le vert.
>> JASON HIRSCHHORN: OK.
Donc, compte tenu de ces deux façons -
il semble que nous lui donnons un pixel, il a un niveau de rouge, bleu et vert.
Nous voulons changer les niveaux relatifs de le rouge, le bleu et le vert, selon
sur ce pixel.
Où dans ce code devrions-nous changer le rouge par rapport, bleu, et vert
les niveaux d'un pixel donné.
Après nous avons lu -
avant que nous écrivons?
Donnez-moi le numéro de ligne.
>> ÉTUDIANTS DE NOMBREUSES: 83.
>> JASON HIRSCHHORN: 83.
Donc ici.
Pour polar, le code que vous devez écriture devrait tous aller là.
Et c'est le seul code vous devez écrire.
Parce que, comme nous l'avons entendu, tout ce que vous devez faire est de changer les bleu relative,
les niveaux de rouge, vert et de chaque pixel.
>> Vous l'avez lu dans, et maintenant vous êtes aller à écrire.
Comment puis-je obtenir - si j'ai cette chose appelé triple, ici, et il est de
tapez RGBTRIPLE -
bien, si nous avons examiné dans bmp.h, ce qui est RGBTRIPLE?
>> ÉTUDIANT 77: C'est une structure.
>> JASON HIRSCHHORN: RGBTRIPLE est une structure.
Nous voyons que jusque ici.
Et si je voulais l'accès, par exemple, le niveau rouge de la structure, comment puis-je
accéder au niveau rouge de cette structure?
>> [CLASSE MURMURES]
>> ÉTUDIANT 78: RGBTRIPLE.rgbtred?
>> JASON HIRSCHHORN: Est-ce exact?
>> ÉTUDIANT 79: Il devrait être triple point, au lieu de RGBTRIPLE point?
>> JASON HIRSCHHORN: Triple.
Triple est la variable locale, de sorte ici, il n'y a pas de pointeurs ici.
Donc, nous utilisons simplement la notation par points.
Cela me donnera le niveau de rouge.
Si je veux changer, je viens de mettre en il égale à quelque chose de différent.
Encore une fois, cette ligne de code accède cette variable à l'intérieur de cette structure, et
nous pouvons mettre à quelque chose de nouveau.
>> Donc, pour polar, encore une fois, ce n'est, en substance, ce que nous devons faire.
Très simple.
Il suffit de changer quelques niveaux relatifs, et c'est là que le code va.
Redimensionner, d'autre part, est un peu plus compliqué.
En fait, redimensionnement est probablement le plus délicate partie de ce problème réglé.
Nous avons trois minutes pour aller au-dessus.
>> Mais encore une fois, nous avons déjà écrit plus de ce code, de sorte que nous
devrait être assez familier.
Quelles sont les choses que nous voulons faire dans redimensionner, si vous avez lu au cours de la
problème réglé?
Si vous me les donnez, nous peut en parler.
Quelles sont les choses que nous voulons faire?
>> ÉTUDIANT 80: verticalement -
si vous avez de redimensionner horizontalement il, mais redimensionner verticalement aussi bien?
>> JASON HIRSCHHORN: Donc un si on nous donne pixel, et nous voulons redimensionner en un
facteur de deux, il doit maintenant être redimensionnée horizontalement et redimensionnée
verticalement.
Cela fait-il sens?
Ouais.
Alors que c'est probablement la plus grand défi.
Et nous en parlerons dans une seconde.
Ouais.
>> ÉTUDIANT 81: La façon dont je pensais avez-vous été besoin de l'afficher -
>> JASON HIRSCHHORN: Attendez.
Ne nous dites pas ce que vous avez fait.
Nous allons parler de logique.
>> ÉTUDIANT 81: OK.
Quelle était la question?
>> JASON HIRSCHHORN: Vous venez de levé la main.
Il n'était pas question.
Permettez-moi de présenter.
Permettez-moi de discuter brièvement.
Donc, nous avons un pixel, nous voulons reproduire, à la fois horizontalement et
verticalement.
Donc, idéalement, ce que nous faisons ici, c'est que nous lire dans notre pixel, nous l'écrivons
mais beaucoup de fois.
>> Mais nous avons notre truc ici, parce alors nous voulons passer à la
ligne suivante et écrire à l' au début de la ligne suivante.
Donc, si nous voulons reproduire à la fois horizontalement et verticalement, ce qui est
une bonne façon de le faire -
un bon cependant de faire cela?
Donc nous n'avons pas besoin de chercher constamment autour de notre fichier de placer les choses.
>> Cette question pourrait ne pas avoir fait sens, mais je pense que un
répondre à cela aidera.
>> ÉTUDIANT 82: Créer un tableau?
>> JASON HIRSCHHORN: Alors réfléchissons de chaque fichier comme une ligne.
Pensons en termes de lignes.
Si nous avons notre première ligne de notre petit image, nous pouvons faire de cette ligne
dans une grande ligne d'une grande image, puis reproduire cette ligne mais
plusieurs fois il a besoin pour être reproduit, plutôt que d'aller pixel par pixel,
qui obtient déroutant quand le traitement des dossiers.
>> Parce que si nous avions -
Je suis à court d'espace.
Si c'est notre fichier, et nous l'avons un pixel, et nous voulons mettre
là, nous avons encore des choses qui ont besoin d'aller là-bas quand nous sommes
l'écriture et la création de notre nouveau fichier -
notre dossier, c'est deux fois plus grand.
>> Mais il est vraiment difficile avec des fonctions de fichiers pour sauter autour de nouvelles lignes
comme ça, et puis revenir ici et mettre les choses là-dedans.
Il est presque impossible de faire quelque chose comme ça, si cela fait sens.
Donc, si nous pensons en termes de lignes, nous pouvons prendre notre ligne, puis le mettre -
reproduire rangées verticalement.
>> Et c'est ainsi que nous traitons avec le redimensionnement verticalement plutôt qu'horizontalement.
C'était un peu rapide, et un peu déroutant.
Malheureusement, notre temps est écoulé.
Je vais rester à l'extérieur pour ceux d'entre vous ici qui ont des questions au sujet de la
ensemble de problèmes, y compris les récupérer.
>> Donc, nous allons lever la séance pour le moment.
Et encore une fois, si vous avez des questions, nous pouvons discuter l'extérieur.