>> JASON Hirschhorn: Bine ai venit, toată lumea, la Săptămâna 6.
Mă bucur să vă văd pe toți în viață și bine după Quiz 0, pentru că știu că
a fost un pic cam dur.
Dar, din fericire, voi toți a facut incredibil de bine.
Și, astfel, care este minunat.
Dacă sunteți în secțiunea mea, m-am dat cel mai mult de ai sprijini deja teste tale.
>> Un cuplu de tine, mă întâlnesc după clasă.
Și dacă ești un student extindere și nu ați primit chestionar înapoi
totuși, TF ta este, probabil, de lucru pe ea și clasificare-l, și-l va primi înapoi
la scurt timp.
Astfel încât elevii mei de extensie, care sunt uitam chiar acum - sperăm trăi -
Eu va primi chestionare de în scurt timp, de asemenea.
>> Agenda noastră pentru ziua de azi este după cum urmează.
În primul rând, vom trece peste unele resurse care CS50 oferă pentru tine.
Vom trece peste Quiz 0 viitoare, și Voi răspunde la orice întrebări pe nimeni
are despre probleme specifice.
Și atunci, vom merge peste fișier I / O și problema stabilit 5.
Aceste ultimele două subiecte vor lua la cea mai mare parte a secțiunii de azi.
>> Am pus această listă în fiecare săptămână ca un memento pentru voi toți, dar de bază
secțiune, avem doar 90 minute - ne nu sunt în măsură să acopere tot ceea ce am
ar plăcea să acopere pentru voi.
Dar avem o tona de resurse pentru să se bazeze pe ca vei ajunge sa cunosti
materialul și munca prin seturi de problema ta.
>> Un memento că am un text on-line box, creat pentru tine să completați dacă
au nici un feedback pentru mine, atât pozitive, cât și
constructiv, despre secțiune.
Că URL-ul este situat chiar aici.
Asa ca te rog, ia un moment în cazul în care aveți orice feedback-ul, dacă în timpul secțiune,
sau după, sau după ce te uiți video on-line, să-mi dea feedback-ul dumneavoastră.
Apreciez orice și tot de ea.
>> Deci, am avut conversații mici cu o mulțime de meu
elevii pe tot parcursul săptămânii - așa cum am mână teste spate, vorbind despre
Desigur, văd cum te descurci.
Și o temă a venit de-a lungul și peste în a vorbi despre - în
special -
seturi de probleme.
Și am încapsulate ca temă pe placa chiar acum.
>> În esență, există o diferență între cotitură în ceva care este
făcut în mod corect și ceva că se face bine.
Cei mai mulți oameni au făcut fantastic în termeni de corectitudine -
5 sau 4 de pe toate psets.
Cei mai mulți oameni devin cele tot timpul.
>> Cu toate acestea, doar pentru că ai făcut ceva bine nu inseamna ca ai
face ceva la fel de elegant, sau eficient, sau la fel de curat ca tine
ar fi putut face.
Și asta e ceea ce de proiectare -
și într-o mai mică măsură, stil -
axe sunt pentru.
Deci, eu sunt tu tot impinge, precum și alte TFS sunt împingând voi, la rândul său, nu numai
în lucruri care sunt corecte, dar transforma în lucrurile care sunt codificate bine.
>> Nu face inutile pentru bucle, Nu recalcularea variabile dacă
tu nu trebuie sa.
De exemplu, privind înapoi la problema stabili 4, atunci când plasarea cărămizi pe
ecran, fiecare rând - fiecare cărămidă într-un rând având în vedere are aceeasi coordonata y -
coordona aceeași înălțime.
>> Astfel încât y-și coordoneze nu au nevoie să calculează în interiorul interior
imbricate pentru bucla pe care ați folosit probabil pentru a pune aceste cărămizi de pe ecran.
Este nevoie doar să se calculeze în fiecare timp ai schimbat un rând, sau
sa mutat în jos un rând.
Deci, spun că dacă există 10 de cărămizi într-o rând, fiecare caramida poate avea aceeași
y-coordona, și că y-și coordoneze poate fi calculată doar
o dată pentru totdeauna de cei.
>> Ea nu are nevoie să fie calculată 10 ori, nici nu care au nevoie de calcul
să se întâmple în real Funcția de apel -
noul apel funcția gracked.
Deci, dacă a fost un pic confuz pentru tu, mai generic, lucruri care
nu trebuie să se întâmple de fiecare dată te duci printr-o buclă FOR nu ar trebui să fie
a pus în interiorul bucla FOR, și nu ar trebui să se întâmplă de fiecare dată când merge
prin bucla FOR.
>> Un alt exemplu bun design-am văzut în Săptămâna 3 de 15, ai putea ține
track de la zero.
Deci, atunci când vă inițializa bord, vă salva - într-o variabilă globală, poate -
x și y-coordonata zero.
Și apoi ori de câte ori -
în funcția mișcare, ori de câte ori face o mutare de succes, vă actualizați
locație de la zero.
>> Care le-ar salva de la a fi nevoie să facă imbricate PENTRU bucle să se uite prin
bordul de fiecare dată în funcția mișcare și găsi la zero, sau găsi tigla,
și apoi a verifica ceea ce este lângă ea.
În schimb, veți avea nevoie de a la zero, poti sa te uiti chiar de mai sus, mai jos,
și la stânga și la dreapta de ea, pentru a găsi tigla pe care o căutați.
>> Deci, în ceea ce privește programele suntem scris, ei nu sunt suficient de mari
că unele dintre aceste decizii de proiectare sunt într-adevăr de gând să împiedice dvs.
program sau să-l rula mai lent, sau poate chiar a alerga afară de memorie.
Dar suntem încă impinge voi să scrie la fel de elegant și
cod eficient posibil.
>> Deci, dacă se termină de scris lucruri care au o mult mai mare
domeniul de aplicare, acestea vor fi scrise cu bună proiectare în afară de a fi corect.
Astfel încât un număr de ai a adus asta.
Asta e ceva ce căutăm - ceva ce am de gând să continue să
te împinge tipi pe.
>> Dacă aveți vreodată orice întrebări cu privire la proiectare a programului dumneavoastră, nu ezitați
pentru a ajunge la mine, și eu sunt fericit să plimbare prin programul cu tine,
și subliniază unele din proiectare deciziile le-ați făcut, și vă va oferi unele
sugestii cu privire la modul de a face chiar decizii de design mai bune.
>> Așa că am de gând să se mute pe pentru a vorbi despre Quiz 0.
Înainte de a face acest lucru, nu oricine aveți întrebări cu privire la ceea ce
Am acoperit până acum?
>> [Fosnet NOISE]
>> JASON Hirschhorn: Șapte secunde.
OK.
Hai sa vorbim despre Quiz 0 pentru un pic.
Cele mai multe dintre voi au Quiz dvs. 0 înapoi.
Dacă nu, sperăm vă amintiți-l un pic.
Dar dacă v-ați luat Quiz 0, atunci au, de asemenea, acces la PDF on-line în
soluțiile de eșantion.
>> Are cineva întrebări înainte de a sărim în materie săptămânii despre
o problemă deosebită pe Quiz 0 -
de ce răspunsul este ceea ce este?
E cineva confuz despre ceva?
Chiar dacă ai problema corect, dar doar ar dori-mi să explic un pic
mai mult, eu sunt fericit să facă acest lucru acum.
>> Deci, am cerut ca voi să vin pregătit cu unele
gânduri despre Quiz 0.
Deci, care ar dori să ne ducă a început cu o întrebare sau
comment despre Quiz 0?
>> [Fosnet HÂRTIE]
>> JASON Hirschhorn: Nu toată lumea a făcut perfect.
Deci, eu știu [râde]
trebuie să existe câteva întrebări despre Quiz 0.
OK.
Da.
Ompica.
>> OMPICA: Number 10.
>> JASON Hirschhorn: Number 10.
Care unul a fost numărul 10?
>> OMPICA: -
>> JASON Hirschhorn: I Nu ai mai dat -
>> OMPICA: includ -
>> JASON Hirschhorn: Numărul 10 a fost de opt să i - scris opt la i?
>> OMPICA: Da.
>> JASON Hirschhorn: OK.
Deci, o altă întrebare ai putea avea a întrebat a fost eu spusele?
Răspunsul este da.
În secțiunea înainte de testul, l-am întrebat voi a codifica atât Sterling și
opt la i.
Ambele dintre ele sa întâmplat cu apar pe testul.
Deci, sperăm, ați plătit atenție la acest lucru.
>> Și dacă ați avut, atunci ar trebui probabil, face bine pe cei doi.
Dar opt la i, nu am făcut-o de fapt codul de ea în clasă, dar a fost, din nou,
a întrebat pe testul.
Deci, un cuplu de lucruri pentru a lua rețineți atunci când codificare opt la i.
Primul lucru, pe întrebarea, a fost care ai nevoie pentru a verifica dacă șirul
a fost egal cu zero.
>> Un cuplu de oameni au încercat să verifice mai târziu în cadrul programului, dacă s bracket am fost -
deci un caracter specific în care string - a fost egal cu zero.
Dar amintiți-vă, că nul este în esență - e bine să se gândească de
nul ca un indicator de zero - un pointer la zero -
undeva în memorie în cazul în care niciodata nu poti accesa.
>> Deci, dacă ceva este egal cu zero, te știu că nu a fost inițializat,
sau nu e nimic acolo.
Deci, s este o stea char, e suport i este un char.
Deci are sens pentru a compara s la null, dar nu s suport i la null.
Dar, din nou - pentru ca a fost primul lucru care ar fi trebuit să facă -
verificați pentru a vă asigura că aveți de fapt, primit un șir adevărat.
>> Apoi, a vrut să meargă prin fiecare personaj în șir.
Și astfel, care ar fi ca un suport s Eu, de exemplu, în cazul în care i este iterator ta.
Și să ia acest caracter, și obține valoarea sa reală.
L-ați stocat ca un char, dar valoarea ASCII de la zero -
zero, ca un personaj -
nu este de fapt întreg zero.
Este un alt număr pe care îl puteți căuta în tabelul ASCII.
>> Deci, un mod de a corecta pentru ca - probabil cel mai bun mod de a corecta pentru
care - se scade din ea valoarea de caractere -
zero, ca un personaj.
Citat singur astfel minus, la zero, un alt citat singur.
Care va lua orice număr aveți ca un char, și să-l egal cu
numărul ca un întreg real.
>> Și care este foarte similar cu abordarea o mulțime de oameni au luat în
problema set 2, cu Cezar și Viginere -
aceste cifre, atunci când Au fost ei de rotație.
Deci, după ce-l au ca un număr de la zero la nouă, apoi - în funcție de
unde se duce în numărul final - aveți nevoie pentru a se multiplica
cu o putere de 10.
>> Unii oameni sa mutat de la spate pentru a față, și multiplicat individul
număr de o putere de 10.
Unii oameni sa mutat de la față și în spate -
și așa au cea mai mare comanda numere în primul rând -
și s-ar salva pe cei într-o variabila contra global.
Și apoi de fiecare dată prin FOR buclă, înmulțiți că gigant global
contracara variabilă de 10, pentru a face spațiu pentru char următor.
>> Astfel că a fost un pic confuz, fără mi-l scriu pe tablă.
Dar soluția de probă este disponibil pentru tine.
Dar acestea au fost lucrurile mari am fost în căutarea pentru.
De asemenea, o verificare pentru a se asigura că fiecare caracter individual a fost într-adevăr o
caracter între zero și nouă, și nu un alt personaj, ca un A,
de exemplu.
>> Acestea au fost lucrurile pe care le caută de la această întrebare.
Asta răspunde la întrebarea dvs.?
>> OMPICA: Da.
>> JASON Hirschhorn: OK.
Sunt acolo orice alte întrebări despre Quiz 0?
Ce despre compilarea?
Toată lumea compilarea corect?
Nu.
Au existat o -
[Râde]
Orice întrebări cu privire la procesul de compilare?
Wow.
>> [Fosnet HÂRTIE]
>> JASON Hirschhorn: Da.
Michael.
>> MICHAEL: Este numărul 7 - aleator?
>> JASON Hirschhorn: Numarul 7.
Număr de 7 a fost de a obține un număr întreg aleator.
Excelent.
Deci ai dat un întreg o și o întreg b, și doriți o întâmplare
număr întreg între a și b.
Putem scrie de fapt, aceasta în bord, deoarece acesta
a fost o linie de cod -
O modalitate de a face acest lucru.
>> Deci, suntem dat drand ca o Funcția am putea folosi.
Și ce drand -
presupunând că aceasta a fost însămânțată -
ce drand întoarce?
>> MICHAEL: Un flotor între 0.0 și 1.0.
>> JASON Hirschhorn: O serie - da.
Un număr între 0 și 1.
Și așa ne-au b și o.
Și apoi ne-am număr nostru aleatoriu între 0 și 1 ne-a dat de drand.
Unii oameni au încercat să pună b, sau b minus o, sau ceva în interiorul celor
paranteze.
Asta ar însemna că acestea sunt argumente pentru această funcție.
>> drand nu ia nici un argument - ca getString nu
nu ia nici un argument.
Deci, este doar paren deschise, aproape paren - și care, în sine, este
apelul funcției.
Și care vă oferă un număr între 0 și 1.
Desigur, avem o gamă întreagă că numerele pot fi inch
>> Spun, în cazul în care b este de 10 și o este de 5, am într-adevăr Vreau un număr cu o gamă de 5.
Deci, urmatorul lucru ce trebuie să facem este multiplica acest lucru prin gama b minus.
Deci, presupunând că este înmulțit.
Și că ne va da un număr într-un interval dat.
Și că anumit interval fiind cel diferență între b minus o.
>> Și, în sfârșit, că acesta va da doar de la - spune intervalul dintre b minus un
este 5, care ne-o da număr de la 0 la 5.
Dar în cazul în care un este, de fapt 5, avem nevoie pentru a stimula acest interval de până la în cazul în care este
de fapt, ar trebui să fie, prin adăugarea unei.
Astfel că devine dreptul de logică.
Și apoi, ai avea o altă întrebare?
>> MICHAEL: Nu.
Mă simt foarte prost acum.
[Râde]
>> JASON Hirschhorn: Nu.
Nu te simti cu adevarat prost.
Un număr de oameni au luptat cu această întrebare.
Și apoi, cealaltă întrebare este, drand, ai spus, vă oferă un float -
returneaza un float.
Dar această funcție, de fapt cerut pentru un întreg să fie returnat.
>> Nu aveți nevoie pentru a arunca această explicit la un număr întreg, deoarece acestea
operațiuni se va trata ca toate o float - ca un număr în virgulă mobilă.
Ca această voință - chiar dacă acest lucru este un număr întreg, aceasta va
fi multiplicate în mod corect.
Toate multiplicarea va funcționa.
Nu aveți nevoie să-l arunca aici.
De fapt, tu nu ar trebui să arunce.
>> Care ar fi -
dacă v-ar arunca un număr care este între 0 și 1 -
un număr aleator, un punct plutitor -
atunci acesta va fi fie doar 0 sau 1, așa veți pierde toate astea precizie.
Dar la sfârșitul anului, atunci când te vei întoarce, devine în mod automat
trimis înapoi ca un întreg.
Deci, nu aveți nevoie pentru a face care te turnare.
>> Deci, aceasta a fost răspunsul la această întrebare, numărul 7.
Orice alte întrebări cu privire la Quiz 0?
Da, Annie.
>> ANNIE: Când folosim recursiv -
când folosim bucle iterative?
>> JASON Hirschhorn: Când utilizați recursiv - cu atât mai mult, în general,
argumente pro și contra de recursivitate față o abordare iterativ.
Poate cineva oferi un pro sau un con?
Te rog?
Nu poate nimeni.
Cine poate oferi un pro sau un con?
>> [Fosnet HÂRTIE]
>> STUDENT 1: recursive este mai puțin codificare - mai puțin de dactilografiere?
>> JASON Hirschhorn: Deci, în general, recursivitate mai ales, o funcție -
sau un algoritm ca îmbinare fel - care se pretează
la o abordare recursiv -
ar putea fi mai simplă de cod recursiv.
Și doar face mai mult sens să o fac recursiv.
Astfel că ar fi un pro la recursivitate.
Altele?
Da?
>> STUDENT 2: Con de recursivitate -
Acesta utilizează mai multă memorie.
>> JASON Hirschhorn: Deci, exact dreapta.
O funcție recursivă va păstra adăugarea stivă cadre de stiva.
Deci, dacă sunteți de operare pe un lot de numere, și trebuie să numim această
funcționează foarte mult, atunci cu siguranță va ia mai mult de memorie, în timp ce
o abordare iterativ se va pune numai un singur stiva cadru pe stiva, deoarece
totul se întâmplă într-o singură funcție.
>> Orice alte argumente pro și contra?
Da.
>> STUDENT 3: Pro pentru recursivitate.
Nu trebuie să determine în avans de câte ori
cod trebuit să fie repetate.
Puteți avea un număr predeterminat de ori pe care le au de a repeta, atunci
recursivitate este mai bine, pentru că este nevoie de acest rezultat.
>> JASON Hirschhorn: Eu cred că e adevărat.
Dar cred că, în ambele cazuri, v-ar niciodată -
v-ar lua, probabil, unele intrare de la utilizator.
Sau această funcție ar avea unele de intrare care ar determina de câte ori se
ar trebui să ruleze.
Deci, în general, nu ar fi codul de greu - chiar și într-o abordare iterativ - cum
de multe ori că bucla ar trebui să fie executați.
>> Ai avut un alt erai gândesc, Annie?
OK.
Deci, acestea sunt, probabil, cele două -
cea mai mare pro și cea mai mare con la un recursiv față
o abordare iterativ.
OK.
Orice altceva pe Quiz 0?
>> Să trecem mai departe.
Fișier I / O. Există o scurtă minunat în această săptămână la dosar I / O, care, sperăm,
ați vizionat mai multe ori, și admirat.
O mulțime de muncă a intrat în asta, și am auzit că este incredibil de util.
Am inclus, de asemenea, link-ul pe acest diapozitiv, în cazul în care nu au avut un
sansa de a ma uit la ea de 10 ori.
>> Deci, vom merge pe scurt peste pași importanți pentru deschidere și de lucru
cu fișiere, și apoi vom se arunca cu capul într-o problemă de codificare înainte
examinarea setul problemă.
Deci, din nou, am de gând să pun asta pe ecran, dar am de gând să vorbesc pentru
doar un minut despre ceea ce suntem a face aici cu fișier I/O--
Ce înseamnă asta?
>> Asta înseamnă că ne putem crea noi programe, și apoi au programele noastre
ieșire, și nu au făcut nici un impact asupra lumea din afara programului nostru.
Dar atunci când vom începe să lucreze cu fișiere - atât citindu-le în și crearea de
le - putem avea un anumit efect asupra lume în afara programului nostru.
>> La fel ca în cazul în care Microsoft Word nu a fost în măsură să facă orice documente Word, apoi
o dată Microsoft Word renuntat, toate de dvs. lucru s-ar fi plecat, și că ar fi
într-adevăr să fie inutil.
În cele din urmă vrem să fie în măsură să scrie programe care pot afecta
lumea din jurul lor, atât prin luarea în intrări complexe - în termeni de fișiere și
prin fișiere, și, de asemenea, crearea de interesant și ieșiri convingătoare -
în ceea ce privește diferite tipuri de fișiere.
>> Deci, de aceea încep să învăța cum să lucreze cu fișiere.
Mai exact, ce ce facem este după cum urmează.
Este foarte simplu.
Există doar o pereche de pași, și ele sunt listate aici, pe acest cod.
Așa că am de gând să treacă prin aceasta linie de cod de linie.
>> În primul rând, veți vedea evidențiat -
atunci când lucrați cu un fișier, indiferent de tipul de fișier este,
aveți nevoie să-l deschidă.
Și că este cu un apel la fopen -
chiar aici.
Includeți numele fișierului.
Dacă fișierul nu este în directorul dumneavoastră, sau folderul în care acest program
viața, atunci ai nevoie de asemenea să includă o cale de a în cazul în care acel fișier este.
>> Vom presupune că această fișier numit "text.txt" -
un document text simplu - este în același folder ca acest program este.
Deci, acesta este un alt lucru de a păstra în minte - că, dacă doriți să deschideți un fișier
în altă parte, de fapt, ai nevoie de pentru a include locația sa.
>> În al doilea rând, se poate trece un argument pentru fopen, și asta e ceea ce vrei să faci
cu fișierul.
Există trei principalele argumente care ai de gând să treacă la fopen.
Cine poate da-mi cele trei?
Cine poate da-mi unul dintre ei?
Da.
>> STUDENT 4: Numele de fișier?
>> JASON Hirschhorn: Îmi pare rău.
Trei principalele argumente puteți trece ca al doilea argument pentru fopen.
Ai dreptate - numele fișierului este primul argument.
Dar al doilea argument pentru fopen sunt în general trei siruri de caractere, și - da.
Aleja.
>> Aleja: A pentru adăugare.
>> JASON Hirschhorn: A, dacă doriți să adăuga la un fișier care există deja.
>> STUDENT 5: R pentru citire.
>> JASON Hirschhorn: R, dacă Vreau să citesc dintr-un fișier.
>> STUDENT 6: W pentru scriere.
>> JASON Hirschhorn: Și w, dacă Vreau să scrie într-un fișier.
Deci, în acest caz, ne scrii la dosar, așa că avem w.
Îl deschideți, va trebui, de asemenea, pentru a salva fișier undeva, și că este cu
cod pentru partea stângă a operatorul de atribuire -
Creez un pointer la un fișier numit, în acest caz, fișier.
>> Nu suntem de gând să vă faceți griji ceea ce aceasta toate capacele lucru FILE este.
Este suficient să spunem, acesta este un lung flux de zero si unu.
Și asta este modul în care vom opera aceasta și să înțelegeți.
>> Următorul lucru pe care trebuie să facem - și acest lucru este incredibil de important -
de fiecare dată când deschideți un fișier -
în fapt, ori de câte ori te sun malloc, pentru exemplu, și de a lua unele de memorie și încercați
și salvați-l într-un pointer, întotdeauna doriți să verificați pentru a vă asigura că
Funcția nu a returnat null.
>> Deci, în acest caz, ne sunt de verificare pentru a face sigur că suntem de fapt deschis
dosar corect, și nu a existat nici o eroare în programul nostru.
Apoi, odată ce ne-am verificat pentru a se asigura că avem un fișier de lucru, putem
scrie, sau de a citi de la, sau adăuga la dosar.
În acest caz, eu sunt pur și simplu de imprimare o linie la acest dosar.
>> Cum știu asta?
Ei bine, eu sunt, folosind această funcție numit fprintf.
Toate funcțiile care le va folosi atunci când scris sau citit de la, sau
manipularea de fișiere va fi similar cu Funcțiile le-ați văzut înainte, dar
începe cu litera F, în picioare pentru fișier.
Și fprintf, spre deosebire de imprimare noastră normală app, are un argument suplimentar,
și că este dosarul în care ați doriți să imprimați această linie la.
>> Nu am nimic de a dreptul de ohai.
Nu am de-al treilea argument pentru printf -
sau al doilea argument pentru printf, al treilea argument pentru fprintf, pentru că am
nu au nici substituenți aici.
Eu nu sunt, inclusiv orice variabile.
Dar, din nou, fprintf si toate acestea fișier funcții care operează cu fișiere
sunt, în general, avea nevoie de fișierul pe care ele funcționează.
>> În cele din urmă, ultimul lucru important de face este de a închide dosarul, la fel ca
cu - ori de câte ori ne-am malloc ceva, ne-o dorim pentru a elibera ceva, ca nu cumva să
avea o scurgere de memorie - ne-o dorim pentru a închide dosarul nostru.
În cazul în care acest program a ieșit fără închidere fișierul, șansele sunt nimic nu ar merge
greșit, mai ales în cazul în care a fost un fișier mic.
>> Dar este cu siguranță bun stil de codificare și practica de a închide întotdeauna fișierul
atunci când ați terminat utilizarea acestuia.
Astfel că este elementele de bază de dosar I / O. Ați văzut, probabil că înainte, sau
privit-o în acel scurt fantastic.
Are cineva întrebări, înainte de vom merge în unele de codificare practică
probleme, despre fișier I / O sau pași tocmai m-am dus peste?
>> [Scrieți SUNETE]
>> JASON Hirschhorn: Îți au o întrebare, Avi?
>> AVI: Nu.
>> JASON Hirschhorn: OK.
Am de gând să aștepte un alt șapte secunde.
[Râde]
Acesta este un sfat foarte bun.
Voi pur și simplu nu-mi place să pună întrebări.
Asta e bine.
OK.
Deci, problema noastră în primul rând practică este, suntem O să duplicat funcția de
un instrument de linie de comandă, care, probabil, folosit înainte - copie -
instrumentul de copiere.
Dacă tastați cp și apoi să-l dați două argumente în terminalul dumneavoastră, puteți
copia un fișier.
Și asta este ceea ce vom pentru a scrie chiar acum.
>> Deci, din nou, citind de pe acest diapozitiv, mi-ar vă pentru a scrie un program care are
două și numai două linie de comandă argumente -
un fișier sursă și un fișier destinație -
și copiază conținutul sursei fișier pentru fișierul destinație
un octet la un moment dat.
Astfel că o mulțime de a cere.
>> Din nou, o abordare de bun pentru acest lucru este de a nu merge direct la codul C, dar
rupe-l jos într-o pereche de pași.
În primul rând, gândiți-vă la logica - exact ceea ce îți cer să faci -
și să înțeleagă toate a pași pentru această problemă.
Nu în C, doar în unele pseudocod, sau chiar un model mental de
ceea ce se întâmplă.
>> Apoi, odată ce ați pseudocod în jos, dau seama cum pseudocod
hărți pe instrumente și lucrurile pe care le-ați învățat să folosească în C.
>> Și, în cele din urmă, odată ce ai toate că împreună, puteți cod problema.
Ia 5 la 10 minute pentru a lucreze la această problemă.
Voi pune instrucțiunile înapoi într-o secundă.
Și apoi vom trece peste pseudocod, și codul
trăi ca un grup.
>> Dacă aveți orice întrebări în timp ce sunteți lucrează la acest lucru, nu ezitați să ridice
mâna ta, și voi veni în jurul și le răspund.
>> STUDENT 7: Pot să treceți o bucată de hârtie?
>> JASON Hirschhorn: Care-i treaba?
>> [Scrieți SUNETE]
>> JASON Hirschhorn: OK.
Să trecem peste pseudocod în primul rând, și atunci eu voi da un cuplu mai mult
minute pentru a termina codificare.
>> Cine ar vrea să-mi încep cu prima linie de
pseudocod pentru această funcție?
>> STUDENT 8: Verificați pentru a vă asigura că s-au dat două fișiere.
>> JASON Hirschhorn: OK.
Și dacă nu suntem?
>> STUDENT 8: Mi-ar întoarce 0.
>> JASON Hirschhorn: Ar trebui să ne întoarcem 0?
>> STUDENT 8: Întoarceți-o -
decupare.
Scuze.
>> JASON Hirschhorn: Da.
Probabil că nu 0.
Deoarece 0 înseamnă totul a fost bine.
OK.
Deci asta e prima linie de pseudocod.
Care are de-a doua linie de pseudocod?
>> STUDENT 9: Open ambele fișiere?
>> JASON Hirschhorn: Deschideți ambele fișiere.
OK?
>> STUDENT 10: Verificați pentru a vedea dacă fișierul este NULL?
>> JASON Hirschhorn: Verificați pentru a vă sigur că nici nu sunt NULL.
Ca o paranteza -
slash 0 -
este ca NULL?
>> STUDENT 11: Nu.
>> JASON Hirschhorn: Asta nu e NULL.
Care este numit terminator nul.
Este de fapt scris cu un singur litru.
Deci, verificarea ceva împotriva că - care este de fapt un personaj -
astfel verificarea ceva împotriva care este nu la fel ca verificare pentru a vedea dacă acesta
este egal cu NULL.
>> Și unii oameni -
pe teste lor și problema lor Seturi - au luat
doi dintre cei confuz.
Dar cele două din acestea sunt în fapt diferite.
Unul se încheie un șir -
unul este un pointer la 0.
>> STUDENT 12: De ce nu te-ai verifica la asigurați-vă că fișierele nu sunt NULL
înainte de a le deschide?
>> JASON Hirschhorn: Deci deschis salvează ceva în acel fișier.
Și dacă te întorci aici -
astfel încât această linie - fopen -
vă va oferi o adresă și magazin că adresa în fișier dacă acesta funcționează.
În cazul în care nu funcționează, ea va stoca NULL -
>> STUDENT 12: Oh.
OK.
Te-am prins.
>> JASON Hirschhorn: În fișier.
Deci, nu se poate verifica pentru NULL înainte de a le-ați deschis.
NULL înseamnă ceva nu funcționeze corect.
OK.
Deci, asigurați-vă că nu este?
Sau sunt?
Ce credem?
Vom merge cu asta.
>> STUDENT 13: Este.
>> JASON Hirschhorn: Este?
Nici nu este?
>> STUDENT 13: Este.
>> JASON Hirschhorn: OK.
Se pare că avem ceva consens cu privire la acest lucru.
Nici nu este NULL.
OK, următoarea linie de pseudocod.
Care nu mi-a dat o linie încă?
Ne va aștepta pentru tine.
Da.
>> STUDENT 14: Trebuie să citi de la primul fișier?
>> JASON Hirschhorn: OK.
>> STUDENT 14: Sau vom folosi fscanf sau ceva de genul că primul fișier?
>> JASON Hirschhorn: Deci, vrem să citit de la primul fișier și -
să punem asta aici.
Citi din fișierul sursă.
Și atunci, ce facem după ce ne-am citi din fișierul sursă?
Altcineva?
>> STUDENT 15: Scrieți în fișierul destinație?
>> JASON Hirschhorn: Noi scriem pentru a fișierul destinație, și -
OK.
Ce altceva ne lipsește?
Cineva care nu mi-a dat o linie de cod dar - din pseudocod.
Da.
>> STUDENT 16: Poate puteți verifica oricând dacă nu e ceva de citit pentru,
cum ar fi linia următoare?
Că sunt ca următoarea linie, a se vedea dacă există.
>> [ELECTRONIC BEEP]
>> JASON Hirschhorn: Oops.
Acesta este software-ul meu jurnalizarea.
Da?
>> STUDENT 16: Da.
>> JASON Hirschhorn: Deci da -mi-o mai mult timp.
>> STUDENT 16: Verificați dacă există încă o viitoare linie de la
fișier sursă pentru a citi.
>> JASON Hirschhorn: OK.
Așa că nu sunteți de lectură linii - citeau bytes aici -
dar ai dreptate.
Vrem să citească și să scrie până nu mai sunt bytes.
OK.
Și astfel încât acestea ar trebui să fie într-adevăr indentat un pic, pentru că sunt sub acolo.
Corect?
Până când nu mai avem de bytes, vom citi din fișierul sursă și de a scrie
la fișierul destinație.
>> Și atunci, ceea ce este ultimul linie de pseudocod?
Cineva care nu a dat mi ceva încă.
>> STUDENT 17: Închideți fișierele?
>> JASON Hirschhorn: Exact.
Închideți fișierele.
Deci nu e pseudocod nostru.
Am de gând să pună în pseudocod gedit, și în câteva minute am
va codifica aceasta împreună.
>> OK.
Să ne începe ca un grup.
Nishant, am noul meu dosar.
Tocmai am deschis asta.
Untitled Document 1.
Care este primul lucru pe care ar trebui să facă?
>> Nishant: Includeți biblioteci?
>> JASON Hirschhorn: OK.
Ce biblioteci?
>> Nishant: stdio.h, stdlib.h, cred?
>> JASON Hirschhorn: OK.
Ce este stdlib pentru?
>> Nishant: Am uitat.
>> JASON Hirschhorn: OK.
Așa includ stdio.
Ce trebuie să fac, chiar înainte Am început de codificare?
>> Nishant: Scrieți un antet?
>> JASON Hirschhorn: Cum Nu voi fi o culoare?
>> [VOCI interpune]
>> Nishant: Cum ai luat de culoare?
>> JASON Hirschhorn: Cum Nu am culoare de codificare?
>> Nishant: Nu știu.
Oh.
Salva.
>> JASON Hirschhorn: Salvați.
Da.
Ar trebui să-l salvați ca. C..
Deci, salvați-l pe desktop ca cp.c.
Dulce.
Și dacă doriți să obțineți stil complet de puncte, ceea ce ar trebui să am
includ în partea de sus?
>> Nishant: Ai putea scrie numele dvs., numele a programului, precum și în scopul
a programului, precum și?
>> JASON Hirschhorn: Arată bine.
Excelent.
Deci, ne-am început perfect.
# Include -
vom scrie, de asemenea -
OK.
Deci, eu cred că eu sunt gata pentru a merge.
Cine are prima linie de cod pentru mine - sau primele linii de cod care
se va lua pentru a satisface primul nostru comment in pseudocod?
Te.
>> STUDENT 18: N-ar trebui sa fie int argc, și apoi char * argv?
>> JASON Hirschhorn: Cred că ai dreptate.
Să schimbați-l la int principale paren, deschise, int argc, virgulă, char * argv?
Ca asta?
>> STUDENT 18: Console.
>> JASON Hirschhorn: Console.
Deschis suport, suport aproape, aproape părinte.
Perfect.
Acum pot lua argumente în linia de comandă.
OK.
Asigurați-vă că suntem dat două fișiere.
Poti sa-mi dai la fel de bine.
>> STUDENT 18: Dacă argc -
acesta nu este egal 3.
>> JASON Hirschhorn: Dacă paren deschise argc nu egal 3?
>> STUDENT 18: Da, vă întoarceți 1 sau nimic.
>> JASON Hirschhorn: Îmi pare rău.
>> STUDENT 18: Înapoi 1 sau nimic.
>> JASON Hirschhorn: Înapoi 1.
OK?
Mare.
Deschideți ambele fișiere.
Cine mă poate ajuta deschide ambele fișiere?
Care nu mi-a dat codul încă?
Kurt?
>> KURT: Deci, toate capacele sursă F-I-L-E stele.
>> JASON Hirschhorn: am de gând pentru a scoate vocalele.
Cei care sunt cool.
E ca Tumblr.
>> STUDENT 18: Egal fopen -
>> JASON Hirschhorn: Egal fopen?
>> STUDENT 18: paren deschise, argv, suport deschis.
>> JASON Hirschhorn: Așteaptă.
Scuze.
Deschis paren.
OK.
>> STUDENT 18: Da.
Argv sub 1.
>> JASON Hirschhorn: Sub 1?
>> STUDENT 18: Da.
Argv suport deschis 1 -
Da.
Și apoi virgulă, iar apoi deschis dublu Citat, r, citat dublu,
paren apropiate, punct și virgulă.
>> JASON Hirschhorn: dulce.
Și ce despre celălalt?
>> STUDENT 18: Foarte asemănător, dar în schimb S-R-C, ai numi D-S-T.
>> JASON Hirschhorn: Oo!
Îmi place asta.
>> STUDENT 18: Doar D-S-T. Da.
Și apoi argv, suport deschis, 2.
Da.
Apoi w în loc de r.
Da.
>> JASON Hirschhorn: Mare.
Câteva viitoare de linii.
De asemenea, în cazul în care cineva are lucruri pentru a adăuga la Liniile pe care le-am făcut, nu ezitați să
adăuga aceste, de asemenea.
Verificați dacă nu este NULL.
Cine poate da-mi codul trebuie să asigure că linia de pseudocod?
Archer.
>> Arcaș: Dacă src egal la egal la egal NULL sau dst egal la egal la egal
NULL, atunci te vei întoarce -
>> JASON Hirschhorn: Ce?
>> Arcaș: Înapoi 2?
>> JASON Hirschhorn: Înapoi 2.
Deci, dacă paren deschis src egal este egal cu NULL, sau -
indiferent că thing's - țeavă?
Țeavă?
Vom numi țeavă.
Țevi, conducte, DST egal la egal la egal NULL, întoarce 2.
OK?
Până când nu mai avem de bytes -
am cam sarit peste acest pas de la partea pseudocod pentru a merge la aici.
>> Dar până nu mai avem de bytes - ceea ce sună ca?
Ce tip de structura C -
dar eu nu folosesc structura de cuvânt, pentru că vom începe să utilizați
că, în alte cazuri -
dar instrument C se pare ca?
>> STUDENT 19: O buclă.
>> JASON Hirschhorn: o buclă.
Pare a fi o buclă.
Deci, cine-mi poate da prima linie a codului bucla chiar aici?
De asemenea, puteți alege ce fel de buclă vrei, dacă-mi dai
această linie de cod.
Există trei feluri.
Ai de a alege.
Aș sugera una dintre cele.
Avi.
Pe care o vrei?
>> AVI: FOR.
>> JASON Hirschhorn: FOR.
>> AVI: int i este egal cu zero.
>> JASON Hirschhorn: OK.
>> AVI: Această parte nu sunt sigur.
Dar i este mai mică decât dimensiunea de sursă stele?
Nu sunt sigur de asta.
>> JASON Hirschhorn: OK.
>> AVI: Pentru că vrei mărime de imagine, nu?
>> JASON Hirschhorn: Deci acest lucru, probabil, nu se va ne da dimensiunea reală
fișier în bytes.
Deci, ce altceva am putea face?
Ceea ce este un alt tip de buclă?
Sau ar trebui să stai cu bucla FOR?
>> STUDENT 20: Ai putea face o buclă în timp ce?
Și apoi, ce ai face este Asa ai -
pentru că avem un char * pentru fișierul.
Deci, dacă ne-am ține incrementarea că până când vom găsi caracterul NULL la
la sfârșitul anului acesta?
Sau nu, este că nu cum functioneaza fișiere?
>> JASON Hirschhorn: Deci, putem păstra incrementarea char *
până când vom găsi NULL -
>> STUDENT 20: ține esență merge caracter cu caracter, până ne-am lovit
sfârșitul fișierului.
>> JASON Hirschhorn: Da.
Deci, asta e ceea ce vrem să facem.
Ne dorim pentru a păstra lectură, caracter de caracter, până când vom ajunge la
sfârșitul fișierului.
>> STUDENT 20: Da.
Găsi -
ceea ce este sfarsitul sau de oprire semnul la sfârșitul unui fișier text.
>> JASON Hirschhorn: OK.
Așa că atunci când vom ajunge la sfârșitul fișierului - cum știm noi că am ajuns
sfârșitul unui fișier?
Dacă sun -
deci haideți să pas înapoi.
Ce este o funcție?
Să mergem la această linie aici.
Citi din fișierul sursă.
Cine poate da-mi că linie de cod?
>> STUDENT 21: fscanf?
>> JASON Hirschhorn: fscanf.
OK.
Ce se întâmplă dacă vreau să citesc, foarte în mod specific, un octet?
>> STUDENT 21: Nu știu.
>> JASON Hirschhorn: OK.
Chiar mai simplu decât fscanf - ceea ce este un -
Vreau să citesc dintr-un fișier sursă?
Citit dintr-un fișier sursă.
Ce este o funcție - Da.
>> STUDENT 22: Este fread?
>> JASON Hirschhorn: fread.
Cred că haideți să rămânem cu care unul pentru acum.
Ce fel de argumente nu fread ia?
>> STUDENT 22: Probabil că tipul de fișier, și apoi locația în dosarul?
>> JASON Hirschhorn: Ce pot sa tip aici să dau seama ce tip de argumente
fread ia?
>> STUDENȚI MULTE: Man fread.
>> JASON Hirschhorn: Man fread și fwrite.
Se pare că stau împreună.
Deci, fread ia cât de multe argumente?
>> STUDENT 23: Patru.
>> JASON Hirschhorn: Este nevoie de patru argumente.
Este nevoie de un pointer, o dimensiune, și că lucru, ceea ce este ciudat, și unele de fișiere.
OK?
Să citim despre asta chiar aici.
"Funcția fread citeste n memb elemente de date, fiecare dimensiune bytes
lung, de la fluxul indicat de flux, stocarea lor la locul
dat de pointer. "
>> Deci, patru argumente.
De ce nu doar să copiați acest lucru, și lipiți-l chiar aici.
OK.
Deci, cine poate începe completarea aceste argumente pentru mine?
Avi.
>> AVI: Scoate vidul.
Pune doar src.
Scoate pointer și steaua.
Pune-src.
Atunci -
>> JASON Hirschhorn: Deci, am de gând să se oprească tu acolo, pentru că e incorect.
Ai dreptate cu src, dar unde ar trebui să meargă src?
>> [VOCI interpune]
>> JASON Hirschhorn: Aceasta ar trebui du-te pe aici.
Asta e src - src nostru este un tip.
Să ne uităm aici.
Acest lucru se cere pentru un tip de fișier *, ne-am de fapt, de obicei, le văd așa.
Deci, acest lucru se cere pentru un argument de tip de fișier * numit flux, care este src.
OK?
>> Ce dimensiune de lucruri fac ne-o dorim pentru a citi?
Ți-am dat acest lucru în Descrierea problemei.
>> STUDENT 24: Un octet la un moment dat.
>> JASON Hirschhorn: Un byte.
Cât de mare este un byte?
Dimensiunea sa este în bytes, deci ce pot pune acolo?
>> STUDENT 25: One.
>> JASON Hirschhorn: One.
Corect.
Dimensiunea sa este în unitate octet, deci 1 este de 1 octet.
Câte vreau să citesc la un moment dat.
>> STUDENT 26: O?
>> JASON Hirschhorn: Un lucru.
Vreau să citesc un singur lucru de dimensiuni 1, o mușcătură la un moment dat.
Și unde am pus-o, o dată ce am citit-o?
>> STUDENT 27: destinație?
>> JASON Hirschhorn: Deci, eu nu pot pune se direct în destinație.
>> STUDENT 28: Vei pune l într un al treilea indicator?
>> STUDENT 27: la destinație.
>> JASON Hirschhorn: OK.
Da.
>> STUDENT 29: Puteți declara ceva la acționează ca un depozit temporar mai devreme.
>> JASON Hirschhorn: OK.
Dă-mi asta.
>> STUDENT 29: Un alt fișier pointer, poate?
>> JASON Hirschhorn: OK.
Deci, aceasta este steaua gol -
este un tip gol stea, așa că nu trebuie să fie un pointer de fișier.
Și dacă am citit un octet, în cazul în care ar fi un loc bun
pentru a stoca un byte?
>> STUDENT 29: O serie?
>> JASON Hirschhorn: Un tablou.
OK.
Și ce altceva este ceva care este dimensiona doar un octet?
>> STUDENT 30: O char *?
>> STUDENT 29: Da.
>> JASON Hirschhorn: A char * nu este un octet.
>> STUDENT 29: A char.
>> JASON Hirschhorn: Un char este un octet.
Corect?
Deci, hai sa numim acest tampon este un generic Numele folosit pentru aceste lucruri pentru a stoca
ceva temporar.
Așa că am crea un tampon.
Corect?
Dar aceasta nu ia un gol *.
Deci, poate că ai dreptate, că acesta ar trebui să fie un tampon de dimensiunea 0.
Deci, se stochează o -
dreapta.
>> Pentru că acest drept aici - char tampon este un personaj, dar
acest lucru are un gol * -
un pointer.
Așa că am putea face acest lucru și acum tampon este un pointer.
Ce altceva puteam face?
>> STUDENT 31: Pune o stea lângă char.
>> JASON Hirschhorn: am putut au creat o char *.
OK.
Ceea ce e un alt lucru pe care l-ar putea face?
Sau să mergem cu asta.
Char * tampon, astfel încât ceea ce am pus aici?
>> STUDENT 31: tampon.
>> JASON Hirschhorn: tampon.
Tampon este un pointer la un char.
Și în acel loc, vom pune un octet de ceva care le-am citit.
Da.
Avi.
>> AVI: Doar o întrebare rapidă.
Vrei să malloc tampon?
>> JASON Hirschhorn: Cine poate răspunde la această întrebare?
>> STUDENT 32: Ei bine, nu prea punct la ceva chiar acum, așa -
>> JASON Hirschhorn: Dar nu vrem să-l malloc?
>> STUDENT 32: Dacă ar fi să-l facă asta un fel, cred că, da, pentru că ai nevoie
un loc pentru el pentru a indica.
>> JASON Hirschhorn: Nu ne-am trebuie să-l malloc?
>> STUDENT 33: Dacă ai de gând să să-l utilizați în afara buclei.
>> JASON Hirschhorn: Mergem la să-l utilizați în afara buclei?
>> STUDENT 34: Da.
>> STUDENT 35: Așteaptă.
Nu vrem să-l declare în bucla de dincolo?
>> JASON Hirschhorn: Deci, cred ca ne-am unele pseudo timp ce bucla aici că suntem
încercând să dau seama, că nu am ajuns la încă.
Nu avem nevoie să-l malloc.
Suntem operează în principal, este doar de gând pentru a fi folosite în interiorul acestei bucle.
Nu trebuie să existe în afara acestei.
>> Deci, poate fi o variabilă locală.
Ai un pointer la o variabilă locală.
>> STUDENT 36: Dar nu e arătând spre nimic.
>> JASON Hirschhorn: Nu, nu este inițializat la nimic.
Dar nu am de gând să-l folosească, de asemenea.
Vom pune ceva în aceasta prima dată când am folosi.
Astfel încât se pare OK.
Deci, nu avem nevoie de malloc aici.
Și cred că e bine așa cum este.
OK.
Avem linia fread.
Să facem următoarea linie.
>> Dacă vrem să scrie într-un fișier, ceea ce este o funcție bun de a folosi pentru a face asta?
>> STUDENT 37: fwrite?
>> STUDENT 38: fprintf?
>> JASON Hirschhorn: fprintf este unul.
Ceea ce este un alt unul?
>> STUDENT 39: fwrite.
>> JASON Hirschhorn: fwrite.
Și pentru scopurile noastre, fwrite, pe care am văzut aici, este
probabil cea mai buna alegere.
Este nevoie de patru argumente, de asemenea.
Nishant, puteți da mi argumentele?
>> Nishant: curs de desfășurare Primul lui să fie tampon doar.
>> JASON Hirschhorn: OK.
>> Nishant: al doilea anii doar de gând să fie 1.
O treime va fi 1.
Iar al patrulea va fi DST.
>> JASON Hirschhorn: Are cineva întrebări cu privire la acea linie?
Asta arată bine.
OK.
Deci, acum, se pare ca un lucru suntem lipsă - de fapt, să scrie
aceasta ultima linie.
Închideți fișierele.
Care ne poate termina de scris aceste ultimele două rânduri?
Da.
Ne pare rău, care e numele tău?
>> LUCY: Lucy.
>> JASON Hirschhorn: Lucy.
>> LUCY: src fclose și apoi destinație fclose.
>> JASON Hirschhorn: fclose, paren deschis, src, paren apropiate, punct și virgulă.
Și fclose -
da?
>> LUCY: Open paranteze, DST și apoi punct și virgulă.
>> JASON Hirschhorn: Mare.
Și ce ar trebui să includă, la sfârșitul?
>> LUCY: Reveniți 0.
>> JASON Hirschhorn: return 0.
Trebuie să?
Doar o întrebare.
Nu trebuie să includă return 0?
>> STUDENȚI MULTE: Nu.
>> JASON Hirschhorn: Nu.
Principal se face în mod automat dacă ajungi la final.
Dar cred că e bine să includ în mod explicit.
Mai ales atunci când vom reveni alte lucrurile pe tot parcursul programului.
OK.
Aceasta este ceea ce ne lipsește -
WHILE ce?
Cine poate gândi la ceva -
are un sentiment de ceea ce lucruri ar putea merge acolo?
Chiar dacă e doar în unele pseudocod ca limbă?
>> Ceea ce suntem cu adevărat - ceea ce vrem să mergem până la?
Da, Lucy.
>> LUCY: sfârșitul de fișier.
>> JASON Hirschhorn: sfârșitul de fișier.
Deci, ce vrei să spui până la sfârșitul de fișier?
>> LUCY: Odată ce ați atins sfârșitul fișierului, opri.
>> JASON Hirschhorn: OK.
Deci, odată ce vom ajunge la sfârșitul fișierului.
Cum știm când ne-am atins sfârșitul fișierului?
>> STUDENT 40: Cred ca tampon va fi setat la NULL.
>> STUDENT 41: Buffer este declarată interiorul buclei.
>> JASON Hirschhorn: Deci, credeți că tampon va fi setat la NULL.
De ce ar tampon fi setat la NULL?
>> STUDENT 40: Pentru că atunci când fread, sunteți încercarea de a pune
nimic în tampon.
>> JASON Hirschhorn: OK.
Deci, te gandesti fread -
când am ajuns la sfârșitul perioadei de fișier, ceea ce este fread de gând să faci?
Cred că e întrebarea trebuie să ne dăm seama.
Ce face fread?
Nu-l pune NULL in tampon, sau nu-l face altceva?
Cum ne putem da seama ce-l are?
>> STUDENT 42: Man.
>> JASON Hirschhorn: Man.
Așa că haideți să ne uităm pe aici.
Întoarce o valoare.
Pe succes, fread și fwrite returnează numărul de elemente citite sau scrise.
Acest număr este egal cu numărul de octeți transferate numai atunci când mărimea este 1.
Dacă apare o eroare, sau cele din urmă a se ajunge la fișier, valoarea returnată este un
numărul scurt element sau 0.
>> Deci, pentru scopurile noastre, în cazul în care ajunge fread la sfârșitul fișierului, și citește din
sfârșitul de fișier, nu a mai rămas nimic pentru a citi, ceea ce se întâmplă să se întoarcă?
>> STUDENT 43: Zero?
>> JASON Hirschhorn: Ce?
>> STUDENT 43: Zero?
>> JASON Hirschhorn: Zero.
Se va reveni la zero.
Deci, noi știm că fread, atunci când ne-am a ajuns la sfârșitul fișierului, se va
pentru a reveni la zero.
Cum putem folosi asta în avantajul nostru?
>> AVI: Puteți declara o variabila in afara buclei numita cec.
Dacă verificare este egal -
de acum - o.
>> JASON Hirschhorn: OK.
>> AVI: Și atunci puteți pune un FI declarație imediat după fread spune dacă
fread este zero -
nr.
>> JASON Hirschhorn: Cine poate ajuta Avi afară?
>> AVI: Care este valoarea returnat de fread?
>> JASON Hirschhorn: Noi doar a trecut peste asta.
>> AVI: Cum o reprezinta?
>> JASON Hirschhorn: Deci, se întoarce - hai uite aici - se întoarce o
size_t, care este în esență un număr întreg.
Deci, se întoarce un întreg.
Și în cazul nostru, se va returna 1 sau 0 -
1 în cazul în care se citesc un singur lucru - un octet, și 0 dacă am ajuns la final.
Deci, dacă fread -
da?
>> STUDENT 45: nu poți pune doar pe deplin fread (tampon, 1, 1, src) în
în timp ce bucla?
>> JASON Hirschhorn: Deci propui face acest lucru într-acolo?
>> [VOCI interpune]
>> JASON Hirschhorn: Stai.
Așa că debarasarea de acest lucru.
Deci, ce propui punerea fread în acolo?
Ceea ce ar trebui să ne mișcăm, de asemenea, dacă vrei să faci asta?
>> STUDENT 45: tampon exterior.
>> JASON Hirschhorn: Ar trebui De asemenea, se mute asta aici.
>> STUDENT 45: Dar face asta în mod constant mutați-l mai departe?
>> [VOCI interpune]
>> JASON Hirschhorn: OK.
Deci, aceasta este ceea ce a propus Okshar.
Noi cream tampon nostru.
Noi TIMP fread, apoi ne-am fwrite.
Gânduri pe aceasta?
>> STUDENT 46: Singura mea întrebare este, ar fi se executa de fapt, fread comanda?
>> JASON Hirschhorn: Marea întrebare.
Când pui un apel de funcție în interiorul unei condiții, face ca
Funcția de apel executa?
Am văzut exemple de acest lucru înainte.
Corect?
>> STUDENT 46: OK.
Da.
Așa că nu executa.
>> JASON Hirschhorn: Am văzut lucruri cum ar fi faptul că înainte, în cazul în care avem o
Funcția de apel în interiorul de o condiție.
Asta apel de funcție executa?
Da.
Deci, răspunsul este da.
Acest apel funcție va executa.
Dar, din nou, este ceea ce ne dorim?
>> Ceea ce este un fel, am putea da seama dacă e ceea ce ne dorim?
>> STUDENȚI MULTE: Rulați-l?
>> JASON Hirschhorn: Am putea să-l rulați.
Dar inainte de a face asta, am putea De asemenea, prin acest motiv.
În cazul în care -
spune ca avem un octet în nostru fișier, vom ajunge la aici,
vom ajunge la acest cod.
Aceasta va rula.
fread va reveni un octet și depozitați-l în tampon.
Și acest lucru se va evalua la 1, drept, după ce se întoarce 1.
>> Deci, în timp 1.
Asta înseamnă că codul de interior bucla WHILE va executa?
>> STUDENT 47: Da.
E adevărat.
>> JASON Hirschhorn: Da.
1 este adevărat.
Nu este 0.
Deci, codul interior aici va executa.
Așa că vom scrie asta.
Ne vom muta înapoi la acest linie, încă o dată.
Acum avem -
suntem la sfârșitul fișierului noastre.
Am citit de la sfârșitul de fișier nostru, pentru că am avut doar un octet în ea.
>> Fread întoarce 0, magazine ceva în tampon.
Sincer, nu știu ce se stochează în tampon.
Probabil ne-am putea uita în sus pentru a vedea ceea ce face.
Că eu sincer nu știu.
Noi nu știm, cui îi pasă ce se stochează în tampon?
Dar ea se întoarce 0.
Și va executa în timp ce 0?
>> TIMP 0 nu se va executa.
Deci, atunci ne vom muta aici.
Deci, haideți să trecem un spectacol de mâini în cazul în care acest lucru este codul ar trebui să ruleze, sau în cazul în care ne-am
ar trebui să facă schimbări în primul rând.
Deci, dacă credeți că - trebuie să voteze.
Dacă credeți că ar trebui să ruleze acest cod ca atare, vă rugăm să ridice mâna.
>> OK.
Există un singur -
ai o intrebare, preocupare?
Da.
>> STUDENT 48: După ce ne-am muta tampon în afara buclei, avem
trebuie să-l malloc?
>> JASON Hirschhorn: Marea întrebare.
După ce ne-am muta tampon în afara buclă, nu trebuie să-l malloc?
Aceasta este o întrebare domeniu.
Dacă vom inițializa tampon în afara din această buclă, va exista
interiorul buclei?
>> STUDENȚI MULTE: Da.
>> JASON Hirschhorn: Da.
Domeniul său de aplicare acoperă interiorul buclei, și, într-adevăr, nimic mai jos de aceasta în interiorul
din acest cod, inclusiv lucrurile în interiorul aici.
Așa că nu trebuie să-l malloc.
Este o variabilă locală, iar domeniul său de aplicare include încă bucla.
>> STUDENT 49: Nu trebuie să-l gratuit?
>> JASON Hirschhorn: Nu ne-am Trebuie să tampon liber?
>> STUDENT 49: Da, dacă noi nu facem malloc.
>> JASON Hirschhorn: Nu ne-am Trebuie să tampon liber?
Noi nu facem.
Din nou, aceasta este o variabilă locală, așa că nu trebuie să-l elibereze.
OK.
Să vedem ce se întâmplă.
Deci, este neinitializata.
Asta a fost ceea ce ceva care Marcus a propus mai devreme.
Deci avem această eroare tampon, variabil este neinitializata atunci când este utilizat aici.
>> Cum putem rezolva această problemă?
>> STUDENT 50: malloc ea?
>> STUDENT 51: Egal cu NULL?
>> STUDENT 52: Spune-tampon este egal cu NULL.
>> JASON Hirschhorn: OK.
Arata bine.
O avem acum.
Să creăm ceva pentru a încerca copierea.
Deci avem fișierul nostru text.
Cum putem rula acest program?
Da.
>> STUDENT 53: Puteți face dot slash cp, test.txt.
Și apoi puteți numi un alt fișier care se va stoca în.
>> JASON Hirschhorn: OK.
Vom numi out.txt.
Rece?
Vina Seg.
Gânduri despre eroarea SEG?
Acest lucru este mare.
Cum putem afla unde vina SEG este?
Ce?
>> STUDENT 54: Gdb.
>> JASON Hirschhorn: Gdb.
Vom rula gdb de scris gdb punct slash, numele programului nostru.
Nu sunt argumente în linia de comandă acolo.
Vom stabili o punct de control la principal.
Dacă vreau să încep gdb, ce să fac?
>> STUDENT 55: R.
>> JASON Hirschhorn: R. Și apoi ce?
>> STUDENT 55: Argumentele?
>> JASON Hirschhorn: Atunci argumente în linia de comandă.
Să se plimbe prin.
N este doar de a lua-mi linie cu linie.
Am de gând să merg până la I a lua vina mea segment.
Nu e vina mea segment.
Se pare ca fread cauzată vina mea seg.
Știu fread cauzate din vina mea SEG, pentru că a fost
linie ne-am executat.
>> Și singurul lucru care a fost întâmplă în acea linie -
două lucruri s-au întâmplat.
Fread mergea, iar apoi am fost face unele verificări WHILE.
Sunt dispus să pariez că în timp ce verificarea nu a fost cauza vina mea segment.
Cel mai probabil, a fost fread cauzând vina mea segment.
Văd, de asemenea, ceva aici, memcopy.
>> Copie de memorie.
Pare a fi în mișcare de memorie de la o locație la alta.
Pare a fi ceva ce s-ar întâmpla în fread, poate unele de memorie
trecerea de la aici pentru a aici.
Să mergem prin asta din nou.
Cum l-am început și-l rulați din nou?
Da.
>> STUDENT 56: Nu aveți nevoie pentru a pune un ampersand înainte de tampon?
>> JASON Hirschhorn: Deci ampersand înainte tampon mi-ar da adresa de
tampon, care este un char *.
Să ne trece prin asta de mai mult timp.
Cum pot rula printr-o încă o dată?
>> STUDENT 57: Poți doar tip alerga din nou?
>> JASON Hirschhorn: introduceți doar alerga din nou.
Deci, noi nu vom executa această linie.
Deci tampon este un pointer NULL.
Corecta?
Se indică spre - să vedem.
Dacă ne-am nostru -
desena o imagine rapidă a acestei.
Poate toata lumea vedea dacă Scriu pe aici?
>> Deci, în stivă, avem un local de variabilă și se numește tampon, și
este un pointer la un char.
Ce adresa e char la?
>> STUDENT 58: 0x0.
>> JASON Hirschhorn: Corect.
Asta e ceea ce este.
Aici, în interiorul tampon, este stocat 0x0.
Asta e ceea ce avem - configurare avem acum.
Deci această linie, fread, pune ceva de la sursa de unde?
În această casetă sau cutia asta?
Care cutie?
Cutie sau caseta din dreapta la stânga?
Această casetă de drept.
>> Rezultă indicatorul, și-l pune în aici.
Când ne-am încerca și memorie tactil la Localizare 0, ceea ce primim?
O eroare de segmentare.
Asta e eroarea avem chiar acum.
Da.
>> STUDENT 59: Nu ai pentru a pune tampon stea?
Sau nu?
Pentru fread?
>> JASON Hirschhorn: Deci fread ia un pointer.
Deci, se trece în tampon.
Și atunci va de-trimitere se undeva în interiorul fread.
Dar, din nou, am văzut, este nevoie de un pointer.
Nu avem nevoie să treacă o tampon stele.
Asta ar fi trecerea aceasta orice e aici.
Și care ar putea, probabil, să ne dea o eroare pentru că suntem de afiliere-o.
>> Corect?
Când ne-am de-trimitere acest indicator, atunci când vom încerca să acceseze această locație,
primim o eroare - vina noastră de segmentare.
Așa -
oops.
Vom iesi din gdb.
Linia noastra -
problema noastră - este corect aici, pe această linie.
Și este o problemă, deoarece din această linie.
>> Cum putem crea o cutie care este accesibil în fread.
Corect?
Avem nevoie de a crea o casetă care este unul octet mare, dimensiunea unui caracter.
Dar avem nevoie de acea cutie să fie accesibile atunci când această funcție executa.
Deci, în cazul în care -
Da.
Orice idei?
>> STUDENT 60: Doar set-l ca orice caracter aleatoriu.
Doar face egal tampon char caracterul.
Și apoi, când ați tampon acolo -
>> JASON Hirschhorn: Așteaptă.
Char tampon?
Deci, nici o stea?
>> STUDENT 60: Da.
Scoate steaua.
Este egal cu un caracter aleatoriu.
>> JASON Hirschhorn: OK.
Deci, da-mi unul.
>> STUDENT 60: Ca o sau ceva.
Și atunci când aveți tampon acolo, să utilizați un -
>> STUDENT 61: Steaua?
Oh, nu, ampersand.
>> STUDENT 60: Utilizarea ampersand.
>> JASON Hirschhorn: OK.
Și ce despre în fwrite?
>> STUDENT 60: Folosiți din nou ampersand.
>> JASON Hirschhorn: În regulă.
Deci, ideea ta este, vom crea un char și a pus ceva în ea, și apoi
scrie că char.
>> STUDENT 60: Da.
>> JASON Hirschhorn: Ce cred oamenii?
>> STUDENT 62: Este complicate.
>> JASON Hirschhorn: OK.
Să-l scoată.
Deci, de data aceasta, am de gând să atragă în acest roșu pe stiva de aici, și apoi ne-am
va avea -
ooh!
Scuze.
Deci, de data aceasta avem ceva numit tampon, și e pe stiva.
Corecta?
Și suntem salvarea într-o, inițial.
>> Apoi, ne-am apelul nostru de a fread.
Ce fread nu este este nevoie de un octet de la fișier nostru și-l pune undeva.
Îl pune în orice Chestia asta arătând spre.
Ei bine, înainte de a avea această adresă -
0x0.
Acum, ce adresa avem?
>> STUDENT 63: Indiferent tampon adresa este.
>> JASON Hirschhorn: Indiferent tampon adresa este.
Este, probabil, va fi ceva de genul asta.
Probabil, va începe cu un b și un F, și apoi au șase alte
cifre hexazecimale.
Nu contează.
Unele adresa.
Și vom trece ca adresa inch
>> Și am de gând să pună o nostru lucru octet la acea adresa.
Așa că am de gând să pună o nostru lucru octet în interiorul aici.
Și apoi vom scrie la ceea ce e tot înăuntru aici.
Are cineva intrebari despre asta?
Cine crede că acest cod va funcționa?
>> Ridicați mâna dacă credeți acest cod va funcționa.
Va trebui să ia o poziție.
Și cine crede că acest cod nu va funcționa?
Ridică mâna.
Toata lumea ar trebui să fie ridicând mâna lor.
OK.
Michael, unde stai?
>> MICHAEL: Eu nu pot decide.
Un fel de la mijloc.
>> JASON Hirschhorn: Esti în mijloc.
Alege una.
>> MICHAEL: Voi avea încredere și spun că va funcționa.
>> JASON Hirschhorn: OK.
Veți avea credință și spun că funcționează?
Ce sa întâmplat?
>> [VOCI interpune]
>> JASON Hirschhorn: Nu vina segment.
Cum putem verifica pentru a vedea dacă două lucruri sunt egale?
Două fișiere sunt egale.
>> STUDENT 64: Dif.
>> JASON Hirschhorn: Dif.
Verificări dif de diferențele dintre două fișiere, iar în cazul în care se întoarce
nimic, sunt identice.
Și dacă ne deschidem, vom obține dosarul nostru.
Astfel că a fost soluția corectă.
Să ne uităm înapoi la el o dată.
Noi de fapt, nici măcar nu trebuie să-l inițializa.
>> Aceasta ar arata, probabil, un pic mai curat, dacă nu ați pus
ceva aleator acolo.
Punctul de a fi, ai nevoie pentru a crea unele spațiu pentru a stoca ceva de la
fread și să ia ceva din fwrite.
Și chestia aia trebuia să fie un local, variabilă în stivă - te
ar fi putut malloc'd spațiu.
>> Așa că de fapt ar putea avea malloc scris aici, și
care ar fi lucrat.
Și apoi ne-ar fi fost de stocare lucrurile noastre undeva pe movila.
Dar acest lucru este, de fapt, probabil, soluția cea mai elegantă.
Doar a crea mai mult spațiu pe stivă pentru aceste lucruri să meargă.
>> Mi-ar avea alte două comentarii.
Dacă ar fi să luați rândul său în acest, și apoi sa inscris la acest lucru, comentariile mele
ar fi după cum urmează.
Aceste 1 e aici, la mine, uita-te cum ar fi numere de magie.
Acest lucru 1, din punct de vedere fread, are sens.
Acesta este numărul de lucruri pentru a citi sau scrie.
>> Dar asta de aici ar trebui să probabil să fie altceva.
Deci, ceea ce este o soluție?
>> STUDENT 65: Dimensiunea de octet.
>> JASON Hirschhorn: Cum ar fi asta?
>> STUDENT 65: Dimensiunea de char.
>> JASON Hirschhorn: Dimensiunea de char.
Da, octet nu este un tip.
Deci, dimensiunea lucrărilor char.
Am putea avea, în partea superioară a codul nostru, # definit ca.
Numit ceva BYTE și este într-adevăr un char.
De fapt, o abordare chiar mai bine ar fi fost aceasta -
uint.
Știe cineva ce este asta?
>> Scuze.
Eu nu dau inapoi.
Așteaptă, nu.
În ce fel se duce?
Știe cineva ce este asta?
Da.
>> STUDENT 67: Ar trebui să ajuta la standardizarea în sisteme de lucruri pe care
au - cum ar fi numere întregi nesemnate care au 8 bytes?
>> JASON Hirschhorn: Asta-i exact dreapta.
Pe mașini diferite, mărimea unui char -
Nu, de obicei, un char.
Caractere sunt, de obicei, un octet.
Dar dimensiunea alte tipuri de date sunt dimensiuni diferite pe o mașină de 32 de biți
comparativ cu o mașină pe 64 de biți.
Un uint8_t este întotdeauna 8 biți -
întotdeauna un octet.
>> Și trebuie să includă care standard de fișier header int.
Deci, acum, acest lucru ar fi fost, probabil, cel mai bun mod de a scrie acest cod.
Așa că am scăpa de numere de magie.
Și am, de asemenea, o mai logic tip de tampon.
Nu este doar un caracter, acesta este un octet, care este ceea ce ne asteptam sa fie.
>> Și aici, ne-am de fapt, a fost un pic mai robust.
Noi nu suntem numindu-l un char, care -
Poate, cine stie - poate fi un alt Dimensiunea pe mașini diferite.
Noi de fapt, spun acest lucru este exact un octet, mereu, indiferent de ce.
Și dacă ne uităm aici, vom face cp.
Uh-oh.
Ce sa întâmplat?
>> STUDENT 68: S-ar putea să fie pornit.
>> JASON Hirschhorn: Ce?
>> STUDENT 69: Este?
>> STUDENT 70: N-ai făcut definesc ca un tip.
>> STUDENT 71: Dar cum ar trebui fi definite în standardul.
>> STUDENT 72: Ce se întâmplă?
>> STUDENT 73: ar trebui să definească fi majuscule?
>> JASON Hirschhorn: Deci nu e # define.
De fapt, în acest caz, sunt va folosi typedef.
Pentru ca suntem o folosesc ca un tip într-o singură locație.
Deci, în acest caz, de fapt, vrem să typedef ca suntem imprimarea unui nou tip de
octet, și este, în esență, aceasta.
Este un pic diferit decât # define.
>> Și acum, codul nostru functioneaza perfect.
Deci, din nou, # define nevoie de ceva, înlocuiește-l peste tot
cu alte lucruri.
E doar un macro -
prescurtare pentru a scăpa de numere magice.
Dar, în acest caz, pentru că suntem folosind-o ca un tip -
chiar aici -
pentru ca aceasta să funcționeze, avem nevoie de a typedef orice byte este.
>> Și suntem o definire chiar aici.
Nu e un struct, este de fapt doar un întreg fără semn.
Este un octet lung.
Acest cod va fi disponibil on-line, și voi toți ar trebui să-l aibă chiar acum.
>> Deci avem -
perfectă -
13 minute la stânga pentru a merge problema pe set 5.
Vreau sa merg prin copy.c împreună, și apoi vom vorbi pe scurt
despre celelalte părți problemei stabilit.
Deci, lasă-mă să trag în sus copy.c.
Și lucrul rece este, de fapt, ne-am deja scris o mulțime de acest cod.
>> Codul am scris literalmente doar a venit de aici, când am fost
scris acest lucru pe cont propriu.
Dar acest lucru este copy.c, stă la baza pentru primele două părți ale
Problema stabilit pentru whodunit.c, care aveți nevoie pentru a scrie, și resize.c.
Recover.c, care este a treia și ultima parte a setului probleme, nu este
bazată pe jos de acest fișier.
>> Ai de gând să nevoie pentru a scrie acest fișier, vă oferim un șablon pentru care
fișier, dar nu are nimic de a face cu copy.c.
Dar, pentru că copy.c este fundamentul pentru primele două părți, vom
sa se plimbe prin ea acum, astfel încât să aibă un bun simt de ceea ce face.
>> Și comentariile dea o parte din ea departe.
Am scris deja o parte din aceasta.
În primul rând, suntem asigurandu avem trei argumente.
Apoi, ne amintim numele fișierului.
Așa că am sărit acest pas, atunci când ne-am codat lucru nostru -
când cp nostru.
Dar aici, ei fac un pic mai curat.
>> Sunt de verificare pentru a vă asigura ambele fișiere sunt bune, în
plus de a le deschide.
Am scris tot acest cod doar acum, așa că eu sunt nu de gând să locuiască pe acest cod.
Următorul este unele chestii, care este specific pentru tipurile de fișiere suntem folosind, care
sunt fișiere bitmap.
Fișiere bitmap au unele metadate asociate cu acestea.
>> Deci, primul cuplu de bytes să vă spun despre fișierul.
Ele nu sunt culorile pixelul în care imaginea.
Ei să vă spun despre fișierul.
Și dacă ai citit prin setul de probleme, vei avea mult mai multe informații
pe ce tipuri de structuri de metadate sunt incluse cu bitmap.
>> Dar de aceea avem această primă set de - acest cod aici.
Citim metadatele -
două bucăți de metadate - fișierul antet și antetul info.
Și noi suntem de verificare unele părți din acesta pentru a asigurați-vă că este un adevărat fișier bitmap
înainte de a continua.
>> Și din nou, acestea sunt detalii noi nu au nevoie pentru a merge în acum.
Dacă ați citit prin setul de probleme, veți înțelege aceste.
Pe scurt, acestea sunt doar că, acesta este un fișier bitmap, și
confirmând faptul că.
>> Apoi, suntem scris cele la fișierul afară.
Vedem că aici.
Vă scriem pentru indicatorul afară.
Apoi, vom determina umplutură.
Din nou, așa cum este particularitate cu un fișier bitmap, unele linii includ
padding la final.
Și dacă ai citit prin setul de probleme, veți afla mai multe despre umplutură.
Aceasta este formula pentru a găsi padding.
>> Important să ne amintim -
atunci când modificați dimensiunea unui bitmap fișier, schimbările de umplutură.
Când modificați dimensiunea unei fișier, schimbările de umplutură.
Acesta nu va fi mai mare de 3 -
va fi 0 la 3, inclusiv.
Dar atunci când modificați dimensiunea de ceva, schimbările de umplutură.
>> Dacă am doar un singur pixel în acel rând, am nevoie de trei bytes de umplutură, pentru că
fiecare rând trebuie să fie multipli de patru bytes lung într-un fișier de tip bitmap.
Dar dacă am dubla, pentru a merge de la un pixel la doi pixeli, fiecare dintre acestea,
să spunem, este un octet, atunci am nevoie doi bytes de umplutură pentru a face
care egal cu patru.
>> Așa că atunci când am schimba dimensiunea de ceva, Am nevoie pentru a schimba valoarea
de umplutură am.
Asta face sens pentru toată lumea?
Apoi, vom repeta pe fiecare rând, sau prin toate rândurile.
Și apoi ne-am repeta prin fiecare coloană în fiecare rând.
Vom trata acest lucru ca bitmap o grilă, așa cum ne-am tratat
bord, în 15.
>> Ca am tratat cărămizi, atunci când le-am imprimat pe ecran.
O grilă de rânduri și coloane.
Atunci - am văzut asta.
Noi de fapt, doar codificat acest lucru.
Am creat unele de stocare temporară.
Am citit acolo, și apoi am scrie.
Acest lucru este exact ceea ce am făcut.
>> Apoi, pentru că i-am spus fiecare linie se termină în niște umplutură, am
săriți peste care padding -
vechi padding.
Și apoi ne-am adauga înapoi.
În acest caz, vom crea același fișier exact.
Noi doar o copiere.
Deci, această linie este un fel de prostie.
Am putea literalmente doar pune umplutura inch
>> Dar dacă vă schimbați dimensiunea fișierului, vrei încă această linie?
Deci, dacă am schimba dimensiunea unui fișier, Nu vrem să săriți
peste padding vechi?
>> STUDENT 74: Da.
>> JASON Hirschhorn: Deci ce facem.
Pentru ca acest lucru, din nou, oferte cu fișierul sursă.
Noi nu le pasă de padding din fișierul sursă.
Vrem să mergem la linia următoare.
Dar noi nu, pur și simplu pune înapoi suma vechi de umplutură.
Avem nevoie de a pune înapoi noua sumă de umplutură.
>> Deci, atunci când vom schimba dimensiunea unui fișier, noi încă mai doresc să săriți peste
padding în fișierul vechi - ceea ce suntem de lectură de la.
Dar ceea ce suntem scris, ne vom la nevoie pentru a pune înapoi unele diferite
număr de umplutură care ne-am stabilit.
Da.
>> STUDENT 75: Ordinea de cei doi Liniile nu contează, nu?
Pentru că te descurci fișiere diferite.
>> JASON Hirschhorn: Exact.
Ordinea acestor două linii nu conteaza.
Vom scrie această linie.
Acest lucru este aici pentru fișierul suntem scris.
Asta e important, așa că am obține dreptul de suma de umplutură.
Acest lucru are de a face cu fișierul în.
Vrem să săriți peste dreapta peste umplutură.
>> Noi nu vrem să citească -
dacă citim un octet la un moment dat, ne-am nu-mi pasă de aceste bytes de umplere.
Vrem pentru a trece la următoarea linie.
În cele din urmă la fel ca Lucy a dat pentru noi, am închide fișierele și a reveni 0.
Deci, aceasta este copy.c.
Și de fapt ne-am scris - am petrecut cea mai mare parte secțiunea scris acest lucru, în esență.
>> Tu ai făcut asta.
Deci, sperăm că aveți un bun simț de ce se întâmplă aici.
Diferența mare, sincer, este doar această primă parte care se ocupă cu
particularități ale fișierelor bitmap.
Așa că am ca urmatorul meu de diapozitive, Ce trebuie să facem?
Ei bine, hai să ne gândim roman sau film polițist.
>> Și pentru cineva care a citit prin problema stabilit, ceea ce facem noi
trebuie să faceți în roman sau film polițist?
Pur și simplu.
Aleja.
>> Aleja: Poți scoate partea fiecărui pixel care denotă roșu.
Și apoi -
un fel de?
>> JASON Hirschhorn: OK.
Astfel încât să ia din partea fiecărui pixeli, care denotă roșu.
Asta-i aproape, dar nu toate de ea.
>> STUDENT 76: Ei bine, nu e moduri diferite de a face acest lucru.
>> JASON Hirschhorn: OK.
Dă-mi un fel.
>> STUDENT 76: Scoate toate roșu, și apoi sublinia albastru și verde.
>> JASON Hirschhorn: OK.
Deci, având în vedere aceste două moduri -
se pare ca și cum am da un pixel, se are un nivel de roșu, albastru și verde.
Vrem să schimbăm nivelurile relative ale roșu, albastru și verde, în funcție de
pe acel pixel.
În cazul în care în acest cod ar trebui să ne schimbăm relativă roșu, albastru și verde
niveluri de un pixel.
După ce l-am citit -
inainte de a le scrie?
Dă-mi numărul liniei.
>> STUDENȚI MULTE: 83.
>> JASON Hirschhorn: 83.
Deci, chiar aici.
De roman sau film polițist, codul de care aveți nevoie pentru a scriere ar trebui să meargă bine acolo.
Și asta e singura codul aveți nevoie pentru a scrie.
Pentru că, așa cum am auzit, tot ce trebuie să faceți este să schimbați aceste albastru relativă,
nivelurile de roșu și verde din fiecare pixel.
>> Ai citit-o în, și acum ești O să-l scrie.
Cum pot obține - dacă am avea acest lucru numita triplu, chiar aici, și este de
tip RGBTRIPLE -
bine, dacă ne-am uitat în bmp.h, ceea ce este RGBTRIPLE?
>> STUDENT 77: Este un struct.
>> JASON Hirschhorn: RGBTRIPLE este o struct.
Vedem că chiar aici.
Și așa, dacă am vrut să accesul, să zicem, nivel roșu de struct, cum fac eu
accesa nivelul roșu de acest struct?
>> [CLASA murmure]
>> STUDENT 78: RGBTRIPLE.rgbtred?
>> JASON Hirschhorn: Este corect?
>> STUDENT 79: Ar trebui să fie triplu punct, în loc de RGBTRIPLE dot?
>> JASON Hirschhorn: Triple.
Triplă este variabila locală, așa aici, nu exista nici indicii aici.
Deci, vom folosi doar notația punct.
Acest lucru va da-mi nivelul de roșu.
Dacă vreau să-l schimbe, doar am stabilit l egal cu ceva diferit.
Deci, din nou, aceasta linie de cod de acces această variabilă în interiorul acestui struct, și
putem stabili la ceva nou.
>> Astfel de roman sau film polițist, din nou, acest lucru este, în esență, ceea ce trebuie să facem.
Foarte simplu.
Doar schimba unele niveluri relative, și acest lucru este în cazul în care codul merge.
Redimensionarea, pe de altă parte, este un pic mai complicată.
De fapt, redimensionare este, probabil, mai delicate parte din această problemă set.
Avem trei minute pentru a merge peste el.
>> Dar, din nou, am scris deja cele mai multe din acest cod, așa că am
ar trebui să fie destul de familiar.
Care sunt unele lucruri pe care vrem să le facem în redimensiona, dacă ați citit pe
set problemă?
Dacă le dai la mine, ne-am poate vorbi despre ele.
Care sunt unele lucruri pe care vrem să facem?
>> STUDENT 80: vertical -
deci va trebui să-l redimensiona orizontal, dar vertical redimensiona, de asemenea?
>> JASON Hirschhorn: Deci, dacă suntem dat un pixel, și vrem să-l redimensiona cu un
factor de doi, acum trebuie să fie redimensionată orizontal și redimensionate
vertical.
Asta face sens?
Da.
Așa că, probabil, cea mai mare provocare.
Și vom vorbi despre asta într-o secundă.
Da.
>> STUDENT 81: Modul în care m-am gândit de ea sa ai nevoie de imprimare-l -
>> JASON Hirschhorn: Așteaptă.
Nu ne spune ce-ai făcut.
Vom vorbi în logica.
>> STUDENT 81: OK.
Care a fost problema?
>> JASON Hirschhorn: Tu doar a ridicat mâna.
Nu a fost nici o îndoială.
Lasă-mă să-l prezinte.
Lasă-mă să discutăm asta pe scurt.
Deci, am un pixel, vrem să reproduce-l, atât orizontal, cât și
vertical.
Deci, în mod ideal, ceea ce facem noi aici este, ne-am citit în pixel noastră, l-am scrie
cu toate acestea de multe ori.
>> Dar apoi ne-am truc aici, pentru că apoi ne-o dorim pentru a trece la
linia următoare și scrie-l la la începutul liniei următoare.
Deci, dacă vrem să reproducă atât orizontal și vertical, ceea ce este
o modalitate buna de a face acest lucru -
unul bun, deși pentru a face asta?
Așa că nu trebuie să caute în mod constant în jurul fișier nostru pentru a plasa lucrurile.
>> Această întrebare nu ar putea avea sens, dar cred că o
răspundă la o va ajuta.
>> STUDENT 82: Creeaza un array?
>> JASON Hirschhorn: Deci, să ne gândim de fiecare fișier ca un rând.
Să ne gândim în termeni de rânduri.
Dacă avem prima noastră linie de mic noastră imagine, putem face acel rând
într-un rând mare de la o imagine mare, și apoi reproduce acel rând toate acestea,
de multe ori de care are nevoie pentru a fi reproduse, mai degrabă decât a merge pixel cu pixel,
care devine confuz atunci când de-a face cu fișiere.
>> Pentru că dacă am avea -
Sunt în criză de spațiu.
În cazul în care acest lucru este fișier noastră, și avem ca un pixel acolo, și vrem să-l puneți
chiar acolo, mai avem unele lucruri care au nevoie pentru a merge acolo atunci când suntem
scris și crearea de noi nostru dosar -
fișier nostru care este de două ori mai mare.
>> Dar e foarte greu cu funcții de fișiere pentru a sări în jurul valorii de la noi linii de
cum ar fi faptul că, și apoi du-te înapoi aici și a pus lucrurile acolo.
Este aproape imposibil de a face ceva cum ar fi faptul că, în cazul în care are sens.
Deci, dacă ne gândim în termeni de rânduri, putem ia rândul nostru, și apoi pune-l -
replica rânduri pe verticală.
>> Și asta este modul în care avem de a face cu redimensionare vertical nu orizontal.
Că a fost un fel de rapid, și un pic confuz.
Din păcate, timpul nostru este sus.
Eu voi sta afară pentru cei dintre voi de aici care au întrebări cu privire la
set de probleme, inclusiv recupera.
>> Deci, haideți să amâne pentru moment.
Și din nou, dacă aveți întrebări, putem discuta afară.