[Powered by Google Translate] [File I / O] [Jason Hirschhorn, Harvard University] [Ito ay CS50, CS50.TV] Kapag sa tingin namin ng isang file, ano pagdating sa isipan ng isang dokumento sa Microsoft Word, JPEG imahe, o isang MP3 kanta, at nakikipag-ugnayan kami sa bawat isa sa mga ganitong uri ng mga file sa iba't ibang paraan. Halimbawa, sa isang dokumento ng Word idagdag namin ang teksto habang may isang JPEG imahe maaari naming i-crop ang mga gilid o retouch ang mga kulay. Pa sa ilalim ng hood ang lahat ng mga file sa aming mga computer ay walang mas kaysa sa isang mahabang pagkakasunud-sunod ng mga zero at mga. Ito hanggang sa mismong application na nakikipag-ugnayan sa mga file upang magpasya kung paano i-proseso ang mahabang sequence at ipakita ito sa user. Sa isang dako, ang dokumento ay maaaring tumingin sa isang byte lang, o 8 zero at na, at ipakita ang isang ASCII na character sa screen. Sa kabilang banda, bitmap imahe ay maaaring tumingin sa 3 bytes, o 24 zero at na, at bigyang-kahulugan ang mga ito bilang 3 hexadecimal numero na kumakatawan sa mga halaga para sa pula, berde, at asul sa isang pixel ng isang imahe. Anuman ang maaari nilang hitsura sa iyong screen, sa kanilang mga core, file ay walang higit pa kaysa sa isang pagkakasunud-sunod ng mga zero at mga. Kaya natin sumisid sa at tumingin sa kung paano namin ang aktwal na manipulahin ang mga zero at mga pagdating sa pagsulat sa at pagbabasa mula sa isang file. Kukunin ko na magsimula sa pamamagitan ng paglabag ito sa isang simpleng proseso ng 3-bahagi. Susunod, kailangan ko sumisid sa dalawang mga halimbawa ng code na nagpapakita ng mga tatlong bahagi. Panghuli, kukunin ko na suriin ang proseso at ang ilan ng mga pinaka-mahalagang mga detalye. Tulad ng sa anumang file na makikita sa iyong desktop, ang unang bagay na gawin ay upang buksan ito. Sa C gawin namin ito sa pamamagitan ng deklarasyon ng pointer sa isang paunang-natukoy na struct na kumakatawan sa isang file sa disk. Sa function na tawag na ito, kami din magpasya kung nais namin na magsulat o magbasa mula sa file. Susunod, gawin namin ang aktwal na pagbabasa at pagsusulat. Mayroong isang bilang ng mga pinasadyang mga function na maaari naming gamitin sa bahaging ito, at halos lahat sa kanila ay nagsisimula sa titik F, na nakatayo para sa file. Huling, kamag-anak sa maliit na pulang X sa tuktok na sulok ng mga file buksan sa iyong computer, namin na isara ang file na may huling function na tawag. Ngayon na kami ay may isang pangkalahatang ideya ng kung ano ang kami ay pagpunta sa gawin, sabihin dive sa code. Sa direktoryong ito, mayroon kaming dalawang mga file C at ang kanilang mga kaukulang executable file. Ang makinilya na programa ay tumatagal ng isang argumento command line, ang pangalan ng dokumento na gusto naming upang lumikha ng. Sa kasong ito, makikita namin tumawag itong doc.txt. Natin patakbuhin ang program at magpasok ng ilang mga linya. Hi. Ang pangalan ko ay Jason. Panghuli, makikita namin type "mag-quit." Kung ngayon namin ilista ang lahat ng mga file sa direktoryong ito, nakikita namin na ang isang bagong dokumento umiiral tinatawag doc.txt. Iyon ay ang file sa programang ito na nilikha. At siyempre, masyadong ito ay walang higit pa kaysa sa isang mahabang pagkakasunud-sunod ng mga zero at mga. Kung buksan namin ang bagong file na ito, nakita namin ang 3 linya ng code na ipinasok namin sa aming programa - Hi. Mayo pangalan ay Jason. Ngunit kung ano ang aktwal na pagpunta sa kapag typewriter.c tumatakbo? Ang unang linya ng interes para sa atin linya 24. Sa linya na ito, ipinapahayag namin ang aming file pointer. Ang function na ay nagbabalik ito pointer, fopen, ay tumatagal ng dalawang argumento. Ang una ay ang pangalan ng file kabilang ang file extension kung naaangkop. Manariwa sa diwa na ang file extension ay hindi nakakaimpluwensya ang file sa nito pinakamababang antas. Palagi kaming pagharap sa isang mahabang pagkakasunud-sunod ng mga zero at mga. Ngunit ito gumagana ang impluwensiya kung paano ang mga file ay kahulugan at kung ano ang application ay ginagamit upang buksan ang mga ito. Ang pangalawang argumento sa fopen ng isang sulat na nakatayo para sa kung ano ang balak naming gawin pagkatapos buksan namin ang file. May tatlong mga pagpipilian para sa argumento - W, R, at A. Pinili namin ang w sa kasong ito dahil gusto namin na magsulat sa ang file. R, tulad ng maaari mong marahil hulaan, ay para sa pagbabasa sa file. At para sa appending sa file. Habang parehong w at maaaring ginagamit para sa pagsusulat sa mga file, w ay simulan ang pagsusulat mula sa simula ng file at potensyal na mapapatungan ang anumang data na dati ay naka-imbak. Sa pamamagitan ng default, ang file namin buksan, kung hindi ito ay umiiral na, nilikha sa aming kasalukuyang nagtatrabaho direktoryo. Gayunpaman, kung gusto naming i-access o lumikha ng isang file sa ibang lokasyon, sa unang argumento ng fopen, maaari naming tukuyin ang isang path ng file sa karagdagan sa mga pangalan ng file. Habang ang mga unang bahagi ng prosesong ito ay lamang ng isang linya ng code katagal, ito ay palaging mahusay na kasanayan upang isama ng isa pang hanay ng mga linya na suriin upang matiyak na ang file ay matagumpay na binuksan o nilikha. Kung fopen nagbabalik null, hindi namin nais na sumulong sa aming programa, at ito ay maaaring mangyari kung ang operating system ng memory o kung sinusubukan naming buksan ang isang file sa isang direktoryo na kung saan hindi namin magkaroon ng tamang pahintulot. Bahagi dalawang ng proseso ay tumatagal ng lugar sa habang loop makinilya. Gumagamit kami ng CS50 function na library upang makakuha ng input mula sa user, at ipagpalagay na hindi nila nais na umalis sa programa, ginagamit namin ang fputs function na upang gawin ang string at isulat ang mga ito sa ang file. fputs ay isa lamang ng maraming mga function na maaari naming gamitin upang sumulat sa file. Iba ang fwrite, fputc, at kahit fprintf. Anuman ng partikular na function na naming magtapos up gamit, bagaman, lahat ng mga ito ay kailangang malaman, sa pamamagitan ng kanilang mga argumento, hindi bababa sa dalawang bagay - kung ano ang kailangang nakasulat at kung saan ito kailangang nakasulat sa. Sa aming kaso, input ay ang string na kailangang nakasulat at fp ang pointer na dumidirekta sa amin sa kung saan kami ay sumusulat. Sa programang ito, bahagi dalawang ng proseso sa halip direkta. Lamang namin ang paglalaan ng isang string mula sa gumagamit at pagdagdag nito nang direkta sa aming mga file na may kaunti sa walang pagpapatunay ng input o mga pagsusuri ng seguridad. Madalas, gayunpaman, bahagi dalawang tumagal ng hanggang ang bulk ng iyong code. Panghuli, bahagi tatlong sa linya 58, kung saan naming isara ang file. Narito tawagan namin fclose at pumasa ito ang aming orihinal na file pointer. Sa kasunod na linya, bumalik kami zero, pagbibigay ng senyas sa dulo ng aming programa. At, oo, bahagi tatlong ay bilang simpleng bilang na. Ilipat natin sa pagbabasa mula sa mga file. Bumalik sa aming direktoryo na mayroon kami ng isang file na tinatawag na printer.c. Natin patakbuhin ito sa mga file na nilikha lang namin - doc.txt. Ang program na ito, pati na ang pangalan ay nagmumungkahi, ay i-print ang mga nilalaman ng file ang pumasa dito. At doon ay may namin ito. Ang mga linya ng code namin ay nai-type nang mas maaga at save sa doc.txt. Hi. Ang pangalan ko ay Jason. Kung dive namin sa printer.c, nakikita namin na ang isang maraming ng code ay mukhang katulad sa kung ano ang aming lamang lumakad sa pamamagitan ng sa typewriter.c. Katunayan linya 22, kung saan binuksan namin ang file, at linya 39, kung saan namin sarado ang file, Parehong halos kapareho ng typewriter.c, i-save para sa fopen pangalawang argumento. Oras na ito namin ang pagbabasa mula sa isang file, kaya namin pinili ang r sa halip ng w. Kaya, sabihin tumuon sa ikalawang bahagi ng proseso. Sa ika-35 linya, bilang pangalawang kundisyon sa aming 4 loop, gumawa kami ng isang tawag sa mga fgets, ang kasamang function na sa fputs mula sa bago. Oras na ito na mayroon kaming tatlong argumento. Ang una ay ang pointer sa hanay ng mga character na kung saan ay naka-imbak ang string. Ang pangalawa ay ang maximum na bilang ng mga character na mabasa. At third ang pointer sa file na nagsusumikap kami. Mapapansin mo na ang para sa loop ay nagtatapos kapag fgets nagbabalik null. Mayroong dalawang dahilan na ito ay maaaring nangyari. Una, ang isang error ay maaaring naganap. Pangalawa, at mas malamang, ang dulo ng file ay naabot at walang higit pang mga character ay basahin. Sa kaso ikaw ay nagtataka, dalawang function umiiral na nagbibigay-daan sa amin upang sabihin sa kung aling dahilan ay ang dahilan para sa partikular na null pointer. At, hindi nakakagulat, dahil mayroon silang gawin sa pakikipagtulungan sa mga file, parehong ferror function na at ang function na pagsisimula ng feof na may sulat sa f. Panghuli, bago pagtibayin namin, isang maikling paalala tungkol sa dulo ng file function na, kung saan, bilang lang nabanggit, ay nakasulat bilang feof. Madalas makikita mo ang iyong sarili gamit habang at para sa mga loop sa progressively basahin ang iyong paraan sa pamamagitan ng mga file. Kaya, kakailanganin mo ng isang paraan upang tapusin ang mga loop pagkatapos mong maabot ang dulo ng mga file na ito. Pagtawag feof sa iyong file pointer at check upang makita kung ito ay totoo ay gawin lamang na. Kaya, ang isang habang loop may kundisyon (! Feof (fp)) ay maaaring mukhang tulad ng isang perpektong naaangkop na solusyon. Gayunpaman, sabihin nating mayroon kaming isang linya na naiwan sa aming text file. Susubukan naming ipasok ang aming habang loop at ang lahat ay gagana bilang binalak. Sa susunod na round sa pamamagitan ng, ang aming programa ay suriin upang makita kung feof ng fp totoo, ngunit - at ito ay ang mahalagang punto upang maunawaan dito - hindi ito magiging totoo pa. Iyon ay dahil ang layunin ng feof ay hindi upang suriin kung ang susunod na tawag sa isang basahin ang function ay pindutin ang dulo ng file, kundi upang suriin kung o hindi na naabot ang dulo ng file. Sa kaso ng mga halimbawang ito, pagbabasa sa huling linya ng aming mga file napupunta perpektong maayos, ngunit ang programa ay hindi pa alam na namin pindutin ang dulo ng aming mga file. Hindi ito hanggang ang isang karagdagang read na ito counter ang dulo ng file. Kaya, tamang kondisyon ay ang mga sumusunod: fgets at ng tatlong argumento - output, laki ng output, at fp - at ang lahat na hindi katumbas sa null. Ito ay ang diskarte na kinuha namin sa printer.c, at sa kasong ito, matapos ang labasan ng loop, maaari kang tumawag feof o ferror upang ipaalam ang user sa tiyak na pagdadahilan para sa paglabas ng loop na ito. Pagsulat sa at pagbabasa mula sa isang file ay, sa kanyang pinaka-pangunahing, isang simpleng proseso ng 3-bahagi. Una, buksan namin ang file. Pangalawa, inilalagay namin ang ilang mga bagay sa aming file o ang ilang mga bagay na hindi nito. Ikatlo, naming isara ang file. Ang una at huling bahagi ay madali. Ang gitnang bahagi ay kung saan ang nakakalito bagay ay namamalagi. At bagaman sa ilalim ng hood laging kami ay pagharap sa isang mahabang pagkakasunud-sunod ng mga zero at mga, ito ay makatulong kapag coding upang magdagdag ng isang layer ng abstraction na lumiliko ang pagkakasunud-sunod sa isang bagay na mas malapit kahawig kung ano ang namin ang nakasanayan mong nakikita. Halimbawa, kung nagsusumikap kami na may 24-bit bitmap file, namin malamang na pagbabasa o pagsusulat ng tatlong bytes sa isang pagkakataon. Sa aling mga kaso, ay ito gumawa ng kahulugan upang tukuyin at angkop na pangalanan struct na 3 bytes malaking. Kahit na ang nagtatrabaho na may mga file ay maaaring mukhang kumplikado, paggamit ng mga ito ay nagbibigay-daan sa amin upang gawin ang isang bagay na tunay na kahanga-hangang. Maaari naming baguhin ang estado ng mundo sa labas ng aming programa, maaari naming lumikha ng isang bagay na naninirahan higit sa buhay ng aming programa, o maaari naming baguhin ang isang bagay na ay nilikha bago nagsimula nang tumakbo ang aming programa. Pakikisalamuha sa mga file ay isang tunay na malakas na bahagi ng programming sa C. at ako nasasabik upang makita kung ano ang iyong pagpunta sa lumikha sa ito sa code darating. Ang pangalan ko ay Jason Hirschhorn. Ito ay CS50. [CS50.TV] [Tawa] Okay. Isa tumagal. Narito kami. Kapag sa tingin namin ng isang file - >> Oh, maghintay. Sorry. [Tawa] Okay. Uy doon. Kapag sa tingin namin ng isang file - Kapag sa tingin mo ng isang file - Okay. Sabihin sa akin kapag handa ka na. Oh, mahusay. Kahit na pagbabasa mula sa isang teleprompter ay maaaring mukhang - walang. Aking masama.