[Powered by Google Translate] [File I / O]
[Jason Hirschhorn, Hārvarda universitātes]
[Tas ir CS50, CS50.TV]
Kad mēs domājam par failu, kas nāk prātā, ir Microsoft Word dokumentu,
JPEG attēlu vai MP3 dziesmu,
un mēs mijiedarboties ar katru no šiem failiem dažādos veidos veidiem.
Piemēram, Word dokumentā mēs pievienot tekstu
bet ar JPEG attēlu mēs varētu apgriezt no malas, vai retušēt krāsas.
Vēl zem pārsega visiem mūsu datora failiem ir nekas vairāk
nekā garš secību nullēm un uzņēmumiem.
Tas ir atkarīgs no īpašo pieteikumu, kas mijiedarbojas ar failu
izlemt, kā apstrādāt šo ilgi secību un iesniedz to lietotājam.
No vienas puses, dokuments var apskatīt tikai vienu baitu,
vai 8 nullēm un tiem, un parādīt ASCII rakstzīmi uz ekrāna.
No otras puses, bitkartes attēls var apskatīt 3 baiti,
vai 24 nullēm un tiem,
un interpretēt tos kā 3 heksadecimālo skaitļu
kas pārstāv vērtības sarkanā, zaļā un zilā krāsā
vienā pikseļu attēla.
Kādi tie varētu izskatīties uz ekrāna, to pamatā,
faili ir nekas vairāk kā secību nullēm un uzņēmumiem.
Tātad pieņemsim ienirt un skatīties, kā mēs patiesībā manipulēt ar šiem nullēm un tiem
kad runa ir rakstiski un lasot no faila.
>> Es sāktu ar sadalot to vienkāršu 3-daļa procesā.
Tālāk, es ņemšu nodoties divās koda piemērus, kas pierāda šīs trīs daļas.
Visbeidzot, es pārskatīt procesu un daži no tās svarīgākajiem detaļām.
Tāpat kā ar jebkuru failu, kas atrodas uz darbvirsmas,
pirmā lieta, kas jādara, ir, lai to atvērtu.
C mēs darām, deklarējot rādītāju uz iepriekš struct
kas pārstāv failu uz diska.
Šajā funkciju zvanu, mēs arī izlemt, vai mēs gribam rakstīt vai lasīt no faila.
Tālāk, mēs faktisko lasīšanu un rakstīšanu.
Ir specializētas funkcijas skaits, mēs varam izmantot šajā daļā,
un gandrīz visi no tiem sākas ar burtu F, kas apzīmē failu.
Visbeidzot, līdzīgi maz sarkano X, kas augšējā stūrī failus atvērts jūsu datorā,
Mēs slēgt failu ar galīgo funkciju zvanu.
Tagad, kad mums ir vispārēju priekšstatu par to, ko mēs gatavojamies darīt,
pieņemsim pikējošais kodu.
>> Šajā direktorijā, mums ir divas C failus un to atbilstošās izpildāmos failus.
Rakstāmmašīnas Programma ilgst vienu komandrindas argumentu,
nosaukums, dokumenta mēs vēlamies izveidot.
Šajā gadījumā, mēs to saucam doc.txt.
Pieņemsim palaist programmu un ievadiet pāris līnijas.
Hi. Mans vārds ir Jason.
Visbeidzot, mēs tipa "atmest".
Ja mēs tagad uzskaitīt visus failus šajā direktorijā,
mēs redzam, ka jaunais dokuments grāmatiņa sauc doc.txt.
Tas ir fails šī programma tikai izveidots.
Un, protams, tas arī nav nekas vairāk kā ilgu secību nullēm un uzņēmumiem.
Ja mēs atvērtu šo jauno failu,
mēs redzam 3 rindiņas kodu mēs stājās mūsu programmā -
Hi. Maijā vārds ir Jason.
Bet to, kas patiesībā notiek, kad typewriter.c iet?
Pirmajā rindā interese par mums ir līnija 24.
Šajā līnijā, mēs apliecinām savu failu rādītāju.
Funkcija, kas atgriež šo rādītāju, fopen, ņem divus argumentus.
Pirmais ir faila nosaukums, ieskaitot faila paplašinājumu, ja vajadzīgs.
Atgādināt, ka faila paplašinājums neietekmē failu savā zemākajā līmenī.
Mēs vienmēr nodarbojas ar ilgu secību nullēm un uzņēmumiem.
Bet tas ietekmē to, kā faili tiek interpretēts un kādi pieteikumi tiek izmantoti, lai atvērtu to.
Otrs arguments, lai fopen ir viens burts
kas apzīmē to, ko mēs plānojam darīt, kad mēs atvērt failu.
Ir trīs iespējas šo argumentu - W, R, un A.
Mēs esam izvēlējušies w šajā gadījumā, jo mēs vēlamies, lai rakstītu uz failu.
R, kā jūs varat droši uzminēt, ir lasīšanas uz failu.
Un ir pievienošanu lietas materiāliem.
Kaut gan W un var izmantot, lai rakstītu uz failiem,
w sāks rakstīt no sākuma failu
un potenciāli pārrakstīt visus datus, kas jau iepriekš ir bijuši uzglabāti.
Pēc noklusējuma faila mēs atveram, ja tā vēl nav,
tiek radīts mūsu pašreizējā darba direktoriju.
Taču, ja mēs gribam, lai piekļūtu vai izveidot failu citā vietā,
pirmajā argumentu fopen,
mēs varam norādīt faila ceļu papildus faila nosaukumu.
Bet pirmā daļa šajā procesā ir tikai viena līnija koda ilgu,
tas vienmēr ir laba prakse, lai iekļautu citu komplektu līniju
ka pārbaude, lai nodrošinātu, ka fails tika veiksmīgi atvērta vai radīta.
Ja fopen atgriež null, mēs negribētu veidot uz priekšu ar mūsu programmu,
un tas var notikt, ja operētājsistēma ir no atmiņas
vai, ja mēs mēģinātu atvērt failu direktoriju, par kuru mums nav pietiekamas atļaujas.
>> Procesa otrās daļas notiek rakstāmmašīna s kamēr cilpa.
Mēs izmantojam CS50 bibliotēkas funkciju, lai iegūtu informāciju no lietotāja,
un pieņemot, ka viņi nevēlas, lai izietu no programmas,
mēs izmantojam funkciju fputs veikt virkni un rakstīt to failu.
fputs ir tikai viens no daudziem funkcijas mēs varētu izmantot, lai rakstītu uz failu.
Citi ietver fwrite, fputc un pat fprintf.
Neatkarīgi no konkrētā funkcija mēs galu galā, izmantojot, lai gan,
visi no tiem ir jāzina, izmantojot savu argumentāciju,
vismaz divas lietas -
to, kas ir rakstīts un kur tai ir jābūt rakstīts.
Mūsu gadījumā, ievade ir virkne, kas ir jāraksta
un FP ir rādītājs, ka vada mūs tur, kur mēs esam rakstiski.
Šajā programmā, no procesa otrā daļa ir diezgan vienkārša.
Mēs vienkārši, ņemot virkni no lietotāja
un pievienojot to tieši uz mūsu failu ar maz-to-nav ieejas apstiprināšana vai drošības pārbaudēm.
Tomēr bieži daļa divi būs aizņem lielāko daļu savu kodu.
Visbeidzot, daļa trīs ir par 58 līnijā, kur mēs aizveriet failu.
Šeit mēs saucam fclose un nodot to mūsu sākotnējo faila rādītāju.
Turpmākajos līnijas, mēs atgriežamies nulle, signalizācijas beigas mūsu programmā.
Un, jā, daļa trīs ir tik vienkārši.
>> Pieņemsim pāriet uz lasīšanu no failiem.
Atpakaļ mūsu direktorijā mums ir failu sauc printer.c.
Pieņemsim palaist to ar failu mēs tikko izveidotas -
doc.txt.
Šī programma, kā norāda nosaukums, vienkārši izdrukāt no faila saturs nodotas to.
Un tur mums ir tā.
No koda līniju mums bija drukāti agrāk un saglabāts doc.txt.
Hi. Mans vārds ir Jason.
Ja mēs nodoties printer.c,
mēs redzam, ka no koda partijas izskatās līdzīgs tam, ko mēs vienkārši gāja cauri jo typewriter.c.
Patiešām līnija 22, kur mēs atvērām failu,
un līnija 39, kur mēs slēdza failu,
ir gan gandrīz identiski typewriter.c, izņemot fopen otro argumentu.
Šoreiz mēs esam lasījums no faila,
tāpēc mēs esam izvēlējušies r vietā w.
Tātad, pieņemsim koncentrēties uz otro daļu no procesa.
35 līnija, kā otrais nosacījums mūsu 4 cilpas,
Mēs piezvanīt uz fgets,
biedrs funkcija fputs no pirms tam.
Šoreiz mums ir trīs argumentus.
Pirmais ir rādītājs uz masīvu rakstzīmju kur virkne tiks uzglabāti.
Otrais ir maksimālais rakstzīmju skaits, ko lasīt.
Un trešais ir rādītājs uz failu ar kuru mēs strādājam.
Jūs pamanīsiet, ka, lai cilpa beidzas, kad fgets atgriež null.
Ir divi iemesls, ka tas var būt noticis.
Pirmkārt, kļūda var būt noticis.
Otrkārt, un visticamāk, ka faila beigas tika sasniegts, un ne vairāk rakstzīmes tika lasīt.
Gadījumā, ja jūs domājām, divas funkcijas pastāv, kas ļauj mums pateikt
iemesla dēļ ir iemesls šim konkrētajam null rādītājs.
Un nav pārsteigums, jo tie ir saistīti ar darbu ar failiem,
gan ferror funkcija un feof funkcija sākas ar burtu f.
>> Visbeidzot, pirms mēs secināt, viens ātrs piezīmi par beigām faila funkciju,
kas, kā tikko minēts, ir rakstīts kā feof.
Bieži vien jūs atradīsiet pats, izmantojot, bet gan cilpas pakāpeniski lasīt savu ceļu cauri failiem.
Tātad, jums ir nepieciešams veids, lai izbeigtu šos cilpas pēc beigs šiem failiem.
Aicinot feof no faila rādītāju un pārbaudes, lai redzētu, vai tā ir taisnība
varētu darīt tieši to.
Tādējādi, kamēr cilpa ar nosacījumu (! Feof (FP)) varētu šķist pilnīgi atbilstošu risinājumu.
Taču, teiksim mums ir viena līnija palikusi mūsu teksta failu.
Mēs ienākt mūsu kamēr cilpa un viss strādās, kā plānots.
Uz nākamo kārtu caur mūsu programma pārbauda, ​​vai feof FP ir taisnība,
bet - un tas ir kritiskais punkts, lai saprastu šeit -
tas nebūs taisnība tikai vēl.
Tas ir tāpēc, ka feof mērķis nav pārbaudīt
Ja nākamais zvans uz lasīt funkciju dosies beigām failu,
bet gan pārbaudīt, vai no faila beigas jau ir sasniegts.
Attiecībā uz šo piemēru,
lasot pēdējo līniju mūsu failu iet perfekti gludi,
bet programmā nav vēl zināt, ka mēs esam hit beigas mūsu failu.
Tas nav tikai tas viens papildu izlasīju, ka tas skaitītāji beigām failu.
Tādējādi, pareizi nosacījums būtu šādi:
fgets un tās trīs argumenti - izlaide, produkcijas izmēra, un FP -
un visu, kas nav vienāds ar null.
Šī pieeja ir mūsu uzņēma printer.c,
un šajā gadījumā, pēc cilpas izejām,
jūs varētu zvanīt feof vai ferror informēt lietotāju par to, īpaša pamatojuma izejai šo cilpu.
>> Rakstiski un lasot no faila ir, pie tās svarīgākās,
vienkāršs 3-daļa procesu.
Pirmkārt, mēs atvērt failu.
Otrkārt, mēs nodot dažas lietas vērā mūsu failu vai veikt dažas lietas no tā.
Treškārt, mēs aizveriet failu.
Pirmā un pēdējā daļas ir viegli.
Vidusdaļā ir vieta, kur grūts sīkumi slēpjas.
Un, lai gan zem pārsega mēs vienmēr nodarbojas ar ilgu secību nullēm un tiem,
tas palīdz, kad kodēšanas, lai pievienotu slāni abstrakcijas
kas pārvērš secība kaut ko, kas vairāk līdzinās ko mēs esam pieraduši redzēt.
Piemēram, ja mēs strādājam ar 24 bitu bitmap failu,
mēs varētu būt lasījumā vai rakstot trim baitiem laikā.
Tādā gadījumā, būtu lietderīgi noteikt un pienācīgi nosaukt
struktūrai, kas ir 3 baiti liels.
>> Lai gan strādājot ar failiem var šķist sarežģīta,
izmantojot tos ļauj mums darīt kaut ko patiesi izcils.
Mēs varam mainīt stāvokli pasaulē ārpus mūsu programmu,
mēs varam radīt kaut ko, kas dzīvo ārpus dzīvi mūsu programmas,
vai mēs varam pat mainīt kaut ko, kas tika izveidota pirms mūsu programma sāka darboties.
Saskarsme ar failiem ir patiesi spēcīgs sastāvdaļa plānošanu C.
un es esmu satraukti redzēt, ko jūs gatavojas izveidot ar to kodu, lai nāk.
Mans vārds ir Jason Hirschhorn. Tas ir CS50.
[CS50.TV]
>> [Smiekli]
Labi. Viens ņem. Šeit mēs iet.
Kad mēs domājam par failu - >> Ak, pagaidiet. Žēl.
[Smiekli] Labi.
Hei tur.
Kad mēs domājam par failu -
Kad jūs domājat par failu - Labi. Man pateikt, kad esat gatavs.
Ak, lieliski.
Lai gan lasot no teleprompter var likties - nē. Mans slikti.