[Powered by Google Translate] [File I / O] [Jason Hirschhorn, Universiteti i Harvardit] [Kjo është CS50, CS50.TV] Kur ne mendojmë për një skedar, ajo që vjen në mendje është një dokument Microsoft Word, një imazh JPEG, apo një këngë MP3, dhe ne të ndërveprojnë me secilin nga këto lloje të dosjeve në mënyra të ndryshme. Për shembull, në një dokument Word që ne të shtoni tekstin ndërsa me një imazh JPEG ne mund të shfaqem nga skajet ose korrigjoj ngjyrat. Megjithatë, nën kapuç të gjitha dosjet në kompjuterin tonë janë asgjë më shumë se një sekuencë të gjatë zero dhe ato. Kjo është deri në aplikim të veçantë që ndërvepron me dosjen të vendosin si të procesit këtë sekuencë të gjatë dhe ta paraqesë atë për përdoruesit. Nga njëra anë, një dokument mund të duket vetëm në një bajt, ose 8 zero dhe ato, dhe të shfaqin një karakter ASCII në ekran. Nga ana tjetër, një imazh bitmap mund të shikoni në 3 bytes, ose 24 zero dhe ato, dhe interpretuar ato si numra heksadecimal 3 që përfaqësojnë vlerat e kuqe, jeshile, dhe blu në një piksel të një imazhi. Çdo gjë që ata mund të duket si në ekranin tuaj, në thelbin e tyre, fotografi nuk janë asgjë më shumë se një sekuencë të zero dhe ato. Pra, le të zhytem në dhe të shohim se si ne fakt manipuluar këto zero dhe ato kur është fjala për të shkruar për të dhe leximi nga një skedar. Unë do të fillojë duke e thyer atë në një proces i thjeshtë 3-pjesë. Tjetra, unë do të zhyten në dy shembuj kodin që tregojnë këto tri pjesë. Së fundi, unë do të shqyrtojë procesin dhe disa nga detajet e saj më të rëndësishme. Ashtu si me çdo skedar që ulet në tavolinën e punës tuaj, gjëja e parë që bëni është të hapur atë. Në C bëjmë këtë duke deklaruar një tregues për një struct paracaktuara që përfaqëson një skedar në disk. Në këtë thirrje funksion, ne gjithashtu të vendosë nëse ne duam të shkruani apo lexuar nga dosja. Tjetra, ne bëjmë leximin aktuale dhe shkrim. Ka një numër të funksioneve të specializuara, ne mund të përdorim në këtë pjesë, dhe pothuajse të gjithë ata fillojnë me shkronjën F, i cili qëndron për file. Fundit, e ngjashme me pak X kuqe në qoshe të lartë të dosjeve të hapur në kompjuterin tuaj, e mbyllim skedë me një thirrje funksion përfundimtar. Tani që ne kemi një ide të përgjithshme të asaj që ne jemi duke shkuar për të bërë, le pikiatë në kodin. Në këtë directory, ne kemi dy fotografi dhe dosjet përkatëse C e tyre ekzekutueshme. Programi makinë shkrimi merr një linjë argumenti komandës, Emri i dokumentit ne duam të krijuar. Në këtë rast, ne do të thërrasë atë doc.txt. Le të drejtuar programin dhe të hyjë në një çift të linjave. Hi. Emri im është Jason. Së fundi, ne do të shkruani "lë". Nëse ne tani lista të gjitha dosjet në këtë directory, ne shohim se ekziston një dokument të ri të quajtur doc.txt. Kjo është dosja e këtij programi krijuar vetëm. Dhe sigurisht, edhe ajo është asgjë më shumë se një sekuencë të gjatë zero dhe ato. Nëse ne të hapur këtë skedë të re, ne shohim 3 rreshta të kodit Ne kemi hyrë në programin tonë - Hi. Emri maj është Jason. Por çfarë është në të vërtetë ndodh kur typewriter.c shkon? Linja e parë e interesit për ne është linjë 24. Në këtë linjë, ne deklarojnë treguesin tonë file. Funksioni që kthen këtë tregues, fopen, merr dy argumente. Parë është emri i file duke përfshirë file extension nëse është e përshtatshme. Kujtojnë se një file extension nuk ndikojnë dosjen në nivelin e tij të ulët. Ne jemi gjithmonë të bëjmë me një rend të gjatë zero dhe ato. Por ajo ka ndikim sa fotografi janë interpretuar dhe se çfarë aplikacionet janë përdorur për të hapur ato. Argumenti i dytë për fopen është një letër të vetme që qëndron për atë që kemi në plan të bëjmë pasi kemi hapur dosjen. Ekzistojnë tri opsione për këtë argument - W, R, dhe A. Ne kemi zgjedhur w në këtë rast, sepse ne duam për të shkruar për të file. R, si ju mund ndoshta me mend, është për të lexuar në dosjen. Dhe një është për appending tek dosjen. Ndërsa dy w dhe mund të përdoret për të shkruar për fotografi, w do të fillojë me shkrim nga fillimi e dosjes dhe potencialisht prishësh ndonjë të dhëna që kanë qenë më parë të ruajtura. By default, madhësia e kemi hapur, në qoftë se ajo nuk ekziston, është krijuar në directory tonë të punës aktuale. Megjithatë, në qoftë se ne duam të hyni ose të krijojë një skedar në një lokacion tjetër, në të argumentit parë të fopen, ne mund të specifikoni nje rruge e fotografisë përveç emrit të file. Ndërsa pjesa e parë e këtij procesi është vetëm një linjë e kodit të gjatë, është gjithmonë një praktikë e mirë për të përfshirë një grup të linjave që të shikoni për të siguruar që dosja u hap me sukses ose të krijuar. Nëse fopen kthen null, ne nuk do të duan për të ecur përpara me programin tonë, dhe kjo mund të ndodhë në qoftë se sistemi operativ është jashtë kujtesës ose në qoftë se ne të përpiqemi për të hapur një skedë në një directory, për të cilat ne nuk e kanë lejet e duhura. Pjesa e dytë e procesit të zhvillohet në lak makinë shkrimi, ndërsa. Ne përdorim një funksion CS50 bibliotekë për të marrë të dhëna nga përdoruesit, dhe duke supozuar se ata nuk duan të lënë programin, ne përdorim fputs funksion për të marrë string dhe shkruani atë në dosjen. fputs është vetëm një nga shumë funksione ne mund të përdorim për të shkruar për të file. Të tjerat përfshijnë fwrite, fputc, dhe madje edhe fprintf. Pavarësisht nga funksioni të caktuar deri ne fund duke përdorur, edhe pse, të gjithë ata duhet të dinë se, me anë të argumenteve të tyre, të paktën dy gjëra - çfarë duhet të jetë e shkruar dhe ku ajo duhet të jetë e shkruar për të. Në rastin tonë, input është varg që duhet të jetë e shkruar dhe FP është tregues që na drejton aty ku ne jemi me shkrim. Në këtë program, pjesë dy e procesit është mjaft i thjeshtë. Ne jemi thjesht duke marrë një varg nga përdoruesit dhe duke shtuar atë direkt në dosjen tonë me pak-me-asnjë input validation ose kontrolle të sigurisë. Shpesh, megjithatë, pjesa e dytë do të marrë pjesën më të madhe të kodit tuaj. Së fundi, një pjesë tre është në linjë 58, ku ne të mbyllë dosjen. Këtu ne e quajmë Shkrimi dhe të kalojë atë origjinal treguesin tonë file. Në linjë pasuese, do të kthehemi zero, duke sinjalizuar fundin e programit tonë. Dhe, po, pjesë tre është aq e thjeshtë sa se. Le të lëvizin për të lexuar nga fotografi. Kthehu në directory tonë ne kemi një skedar të quajtur printer.c. Le të drejtuar atë me dosjen ne vetëm krijuar - doc.txt. Ky program, siç sugjeron emri, thjesht do të shtypura nga përmbajtjet e dosjes së kaluar për të. Dhe nuk kemi atë. Linjat e kodit kishim shtypur më herët dhe do të ruhen në doc.txt. Hi. Emri im është Jason. Nëse ne pikiatë në printer.c, ne shohim se një shumë e kodit duket e ngjashme me atë që ne vetëm të ecur përmes në typewriter.c. Në të vërtetë Shkarko 22, ku kemi hapur dosjen, dhe linjës 39, ku kemi mbyllur dosjen, të dyja janë pothuajse identike me typewriter.c, përveç argumentit fopen dytë. Këtë herë ne jemi duke lexuar nga një skedar, kështu që ne kemi zgjedhur në vend të r w. Kështu, le të përqëndrohet në pjesën e dytë të procesit. Në linjë 35, si kusht dytë në 4 lak tonë, kemi bërë një thirrje për fgets, funksion shoqërues fputs nga më parë. Këtë herë ne kemi tre argumente. E para është tregues për grup të karaktereve, ku vargu do të ruhen. E dyta është numri maksimal i karaktereve për t'u lexuar. Dhe e treta është tregues për dosjen me të cilën ne jemi duke punuar. Ju do të vëreni se për lak mbaron kur fgets kthehet null. Ka dy arsye që kjo mund të ketë ndodhur. Së pari, një gabim mund të ketë ndodhur. Së dyti, dhe më shumë gjasa, në fund të dosjes u arrit dhe jo më shumë karaktere janë lexuar. Në rast se ju jeni pyesin, dy funksione nuk ekzistojnë që të na lejojë të them Arsyeja e cila është shkaku për këtë tregues null veçantë. Dhe, nuk është çudi, pasi ata kanë të bëjnë me të punuar me fotografi, dy funksioni ferror dhe fillimi funksioni feof me f letër. Së fundi, para se të arrijmë në përfundimin, një shënim të shpejtë për në fund të funksionit fotografi, e cila, siç u përmend vetëm, është shkruar si feof. Shpesh ju do të gjeni veten duke përdorur për sythe, ndërsa dhe progresive të lexuar në rrugën tuaj nëpërmjet dosjeve. Kështu, ju do të duhet një mënyrë për t'i dhënë fund këto sythe pasi të keni arritur në fund të këtyre dosjeve. Thirrja e feof në treguesin tuaj file dhe kontrolluar për të parë nëse ajo është e vërtetë do të bëjë vetëm se. Kështu, një lak, ndërsa me kusht (! Feof (FP)) mund të duket si një zgjidhje të përkryer të përshtatshme. Megjithatë, thonë se ne kemi një linjë të mbetur në skedar teksti tonë. Ne do të hyjë në lak tonë, ndërsa dhe çdo gjë do të punojnë jashtë siç është planifikuar. Në raundin e ardhshëm përmes, programi ynë do të kontrollojë për të parë nëse feof e PF është e vërtetë, por - dhe kjo është pika vendimtare për të kuptuar këtu - ajo nuk do të jetë e vërtetë vetëm ende. Kjo është për shkak se qëllimi i feof nuk është për të kontrolluar nëse thirrja e ardhshme për një funksion të lexuar do të goditur në fund të dosjes, por më tepër për të kontrolluar nëse janë apo jo në fund të dosjes tashmë është arritur. Në rastin e këtij shembull, lexuar vijën e fundit të dosjes tonë shkon të përkryer mirë, por programi ende nuk e di se ne kemi goditur në fund të dosjes tonë. Kjo nuk është deri sa ajo ka një lexuar shtesë që ajo kundërvihet në fund të file. Kështu, një kusht i saktë do të jetë si në vijim: fgets dhe argumentet e saj tre - Prodhimi, madhësia e prodhimit, dhe FP - dhe të gjithë që të mos e barabartë me null. Kjo është qasja që ne e mori në printer.c, dhe në këtë rast, pas daljet lak, ju mund të telefononi ose feof ferror për të informuar përdoruesit për sa i përket arsyetimit të veçantë për këtë lak daljes. Shkrim dhe lexim nga një skedar është, në bazë shumicën e saj, një thjeshtë 3-pjesa proces. Së pari, ne kemi hapur dosjen. Së dyti, ne kemi vënë disa gjëra në dosjen tonë, ose të marrë disa gjëra nga ajo. Së treti, ne mbyllë dosjen. Pjesët e para dhe e fundit janë të lehta. Pjesa e mesme është ajo ku stuff ndërlikuar gënjeshtra. Dhe pse nën kapuç ne jemi gjithmonë të bëjmë me një rend të gjatë zero dhe ato, ajo ka ndihmuar kur coding për të shtuar një shtresë e abstraksionit që e kthen rend në diçka që ngjan më afër asaj që ne jemi duke përdorur për të shohim. Për shembull, në qoftë se ne jemi duke punuar me një dosje të 24-bit bitmap, ne do të ngjarë të jetë e lexuar ose shkruar tre bytes në një kohë. Në të cilin rast, ajo do të kishte kuptim për të përcaktuar dhe të përshtatshme emrit një struct që është 3 bytes madh. Edhe pse duke punuar me fotografi mund të duket e komplikuar, shfrytëzuar ato na lejon për të bërë diçka të vërtetë të shquar. Ne mund të ndryshojë gjendjen e botës jashtë programit tonë, ne mund të krijojë diçka që jeton përtej jetës së programit tonë, ose ne mund edhe të ndryshojë diçka që është krijuar para se programi ynë ka filluar running. Bashkëveprojmë me fotografi është një pjesë të vërtetë të fuqishme të programimit në C. dhe unë jam i ngazëllyer për të parë se çfarë ju jeni duke shkuar për të krijuar me të në kodin për të ardhur. Emri im është Jason Hirschhorn. Kjo është CS50. [CS50.TV] [Qeshura] Rregull. Një marrë. Këtu ne do të shkojmë. Kur ne mendojmë për një skedar - >> Oh, prisni. Më vjen keq. [Qeshura] Okay. Hey atje. Kur ne mendojmë për një skedar - Kur ju mendoni për një skedar - Mirë. Thoni kur ju jeni gati. Oh, e madhe. Megjithëse leximi nga një teleprompter mund të duket - nr. My bad.