Wednesday, October 12, 2016

C Lêerhantering Binary Options

C Programming lêerhantering behulp oop (), gelees (), skryf () en naby () Die vorige voorbeelde van lêerhantering deal met File Control Blocks (FCB). Onder MSDOS v3.x (of groter) en UNIX stelsels, is lêerhantering dikwels gedoen met behulp van handvatsels, eerder as om die lêer beheer blokke. Skryf programme met behulp van handvatsels verseker port van bronkode tussen verskillende bedryfstelsels. Die gebruik van handvatsels laat die programmeerder om die lêer as 'n stroom van karakters te behandel. Die beskikbare toegang modes is die regte is die oop () funksie gee terug 'n heelgetal waarde, wat gebruik word om te verwys na die lêer. As VN - suksesvolle, dit gee -1, en stel die globale veranderlike Errno om die fout tipe aan te dui. Die funksie Read () poog om Nbytes lees van die lêer wat verband hou met handvatsel, en plaas die karakters te lees in buffer. As die lêer oopgemaak met behulp OTEXT, dit verwyder enter en ontdek die einde van die lêer. Die funksie gee terug Die nommer van grepe gelees. Op die einde van die lêer, 0 teruggestuur, op fout dit terug -1, die opstel van Errno om die tipe fout wat plaasgevind het aan te dui. Die funksie skryf () poog om Nbytes van buffer te skryf om die lêer wat verband hou met handvatsel. Op tekslêers, sit dit uit elke LF 'n CR / LF. Die funksie gee terug Die nommer van grepe geskryf om die lêer. 'N terugkeer waarde van -1 dui op 'n fout met Errno gepas stel. Die funksie sluit () sluit die lêer wat verband hou met handvatsel. Die funksie gee terug 0 indien suksesvol, -1 om 'n fout te dui, met Errno gepas stel. Kopiereg B Brown. 1984-1999. Alle regte reserved. How na 'n lêer Hoe om te lees en skryf om 'n oop lêer Hoe om 'n lêer te sluit oop. Die bou van 'n adres boek Hantering binêre data lêers Random Access in te dien Datahantering lêers inhou dikwels probleme vir beginners, hoewel die rede hiervoor my effens kopkrapper. Lêers in 'n programmeertaal sin is regtig nie baie anders as lêers wat jy in 'n woordverwerker of ander program gebruik: jy dit oopmaak, 'n werk te doen en dan weer toe te maak nie. Die grootste verskille is dat in 'n program wat jy toegang tot die lêer agtermekaar. dit wil sê, 'n reël lees jy op 'n slag begin by die begin. In die praktyk die woordverwerker dikwels dieselfde, dit hou net die hele lêer in die geheue terwyl jy werk op dit en skryf dit alles terug te draai wanneer jy dit maak dan. Die ander verskil is dat, wanneer die programmatuur, wat jy gewoonlik die lêer oop te maak as net lees of net skryf. Jy kan skryf deur die skep van 'n nuwe lêer van nuuts af (of die vervang van 'n bestaande een) of deur die aanbring van 'n bestaande een. Een ander ding wat jy kan doen tydens die verwerking van 'n lêer is dat jy terug na die begin kan gaan. Lêers - Invoer en Uitgawe Kom ons kyk wat in die praktyk. Ons sal aanvaar dat 'n lêer bestaan ​​geroep menu. txt en dat dit beskik oor 'n lys van etes: Nou sal ons 'n program om die lêer te lees en die afvoer te vertoon te skryf - soos die kat opdrag in Unix of die tipe opdrag in DOS. Nota 1: lêer () neem twee argumente. Die eerste is die lêernaam (wat as 'n veranderlike of 'n letterlike string kan geslaag word, soos ons hier het). Die tweede is die modus. Die modus bepaal of ons die opening van die lêer vir lees (r) of skriftelik (w), en ook of sy vir ASCII-teks of binêre gebruik - deur die byvoeging van AB aan die r of w, soos in: oop (FN, RB) Nota 2: Ons gebruik die funksie lêer () om die lêer oop te maak, ouer weergawes van Python gebruik van die gebou in funksie oop () plaas. Die parameters is identies, maar sedert oop () is nog steeds die voorkeur meganisme sal ons gewoonlik oop () As jy egter lêer vind () meer logies dan voel vry om dit te gebruik in plaas gebruik. Nota 3: Ons lees en die lêer met behulp van funksies voorafgegaan deur die lêer veranderlike te sluit. Dit notasie staan ​​bekend as metode aanroeping en is nog 'n voorbeeld van Objekgeoriënteerde programmering. Moenie bekommerd wees oor dit vir nou, behalwe om te besef dat sy verwante in 'n paar maniere om modules. Jy kan dink aan 'n lêer veranderlike as 'n verwysing na 'n module met funksies wat werk op lêers en wat ons outomaties in te voer elke keer as ons 'n lêer tipe veranderlike. Nota 4: Ons maak die lêer aan die einde met die metode naby (). In Python, is lêers outomaties gesluit aan die einde van die program, maar dit is goeie praktyk om in die gewoonte van uitdruklik sluit jou lêers. Hoekom Wel, die bedryfstelsel kan nie die data te skryf na die lêer totdat dit gesluit (dit kan hupstoot prestasie). Wat dit beteken is dat as die program uitgange onverwags daar 'n gevaar bestaan ​​dat jou waardevolle inligting nie mag gewees het geskryf om die lêer So het die morele is: Sodra jy ophou skryf na 'n lêer, sluit dit. Nota 5: Ons het nie 'die volle pad van die lêer in die bostaande kode so die lêer sal behandel word as in die huidige gids. Maar ons kan 'n volle padnaam slaag om die lêer () of 'n oop () funksies in plaas van net die lêernaam. Daar is 'n rimpel by die gebruik van Windows Maar omdat die gebruik om aparte dopgehou in 'n Windows pad karakter het 'n spesiale betekenis in 'n Python string sodat wanneer spesifiseer paaie in Python is dit die beste om die / karakter in plaas gebruik en wat sal werk op enige bedryfstelsel stelsel insluitende Windows. Nou, kyk hoe jy kan gaan met 'n lang lêers. In die eerste plek sal jy nodig het om die lêer 'n lyn op 'n tyd gelees (in Python met behulp read line () en 'n while lus in plaas van readlines () en 'n lus). Jy kan dan gebruik om 'n linecount veranderlike wat geïnkrementeer elke lyn en dan getoets om te sien of dit gelyk is aan 25 (vir 'n 25 lyn skerm) is. As dit so is, die gebruiker in staat om 'n sleutel druk (betree, sê) voor die Herstel linecount aan nul en voortgesette versoek u. Jy dalk wil probeer dat as 'n oefening. Sedert Python weergawe 2.2 is dit ook moontlik om die lêer te hanteer as 'n lys sodat jy nie nodig het om readlines gebruik () in 'n lus, jy moet net Itereer oor die lêer. Kom ons herskryf die vorige voorbeeld om hierdie funksie in aksie te sien: Hierdie styl het ook die voordeel dat daar geen perke van geheue as met readlines (). dus is dit kombineer die voordele van 'n for-lus en die tyd / read line () hierbo genoem benadering. Regtig dis al wat daar is om dit. Jy die lêer oop te maak, het dit gelees voor en manipuleer dit enige manier wat jy wil. Wanneer jy klaar jy die lêer te sluit. Daar is egter 'n klein pla jy kan in die vorige voorbeeld het opgemerk: die lyne lees van die lêer 'n NEWLINE karakter aan die einde, sodat jy die wind met leë lyne met druk (wat sy eie NEWLINE voeg). Om te verhoed dat dit Python bied 'n string metode genoem strook () wat witspasie sal verwyder. of nie-printable karakters, aan beide kante van 'n string. (Dit het neefs wat die een kant net genoem rstrip en lstrip te kan stroop) As ons vervang die gedrukte lyn bo met: Alles moet nou werk net mooi. Om 'n kopie opdrag in Python skep, ons eenvoudig 'n nuwe lêer in skryfmodus oop en skryf die lyne om die lêer in plaas van hulle te druk. Soos volg: Het jy opgelet dat ek 'n afdruk verklaring bygevoeg aan die einde, net om die gebruiker dat iets werklik gebeur Hierdie soort terugvoer van gebruikers is gewoonlik 'n goeie idee te verseker. Omdat ons het uit dieselfde lyn wat ons lees in was daar geen probleme met NEWLINE karakters hier. Maar ons nog as uitskryf snare wat ons geskep het, of wat ons het strook ped vroeër sou ons nodig het om 'n nuwe reël toe te voeg tot die einde van die uitset string, soos volg: Kom ons kyk na hoe ons kan neem wat in ons kopie program . In plaas van net die spyskaart kopiëring sal ons vandag datum toe te voeg tot die top. Op dié manier kan ons maklik 'n daaglikse spyskaart van die maklik verander tekslêer van etes. Al wat ons moet doen is om te skryf uit 'n paar lyne aan die bokant van die nuwe lêer voor die kopiëring van die menu. txt lêer, soos volg: Let daarop dat ons gebruik maak van die tyd module vandag se datum (time. time ()) te kry en te omskep dit in 'n tuple van waardes (time. localtime ()) wat dan deur time. strftime () word gebruik om 'n string wat, wanneer plaas in 'n titel boodskap deur lyn opmaak, lyk produseer: Alhoewel ons twee n karakters bygevoeg by die eindig daar is net een leeg lyn gedruk, dis omdat een van hulle is die NEWLINE aan die einde van die titel self. Die bestuur van die skepping en die verwydering van NEWLINE karakters is een van die meer irriterend aspekte van die hantering van die teks lêers. Sommige bedryfstelsels gotchas Bedryfstelsels hanteer lêers op verskillende maniere. Dit stel 'n paar probleempies in ons programme as ons wil hê hulle moet werk op verskeie bedryfstelsels. Daar is twee probleempies in die besonder wat mense uit kan haal en goed na hulle kyk hier: newlines Die hele onderwerp van newlines en tekslêers is 'n donker area van nie-standaard implementering deur verskillende bedryfstelsels. Hierdie verskille het hul wortels in die vroeë dae van data kommunikasie en die beheer van meganiese teledrukkers. Daar is basies 3 verskillende maniere om 'n nuwe lyn dui: 'n return (CR) karakter (r) 'n Lyn Voer (LF) karakter (N) 'n CR / LF paar (RN). Al drie tegnieke word gebruik in verskillende bedryfstelsels. MS DOS (en dus Windows) gebruik metode 3. Unix (insluitend Linux) gebruik metode 2. Apple in sy oorspronklike MacOS gebruikte metode 1. maar gebruik nou metode 2 sedert MacOS X is regtig 'n variant van Unix. So, hoe kan die swak programmeerder gaan met hierdie verskeidenheid van lyn eindpunte in baie tale sy net baie toetse doen en neem verskillende aksie per OS. In meer moderne tale, insluitend Python, die taal bied fasiliteite vir die hantering van die gemors vir jou. In die geval van 'n afgestorwene kom die hulp in die vorm van die os module waarin 'n veranderlike genoem linesep wat is ingestel op alles wat die NEWLINE karakter is op die huidige bedryfstelsel definieer. Dit maak die toevoeging van newlines maklik en rstrip () rekening hou met die bedryfstelsel wanneer dit doen sy werk van die verwydering van hulle, so werklik die eenvoudige manier sane te bly, vir sover newlines betref is: gebruik altyd rstrip () om newlines uit verwyder lyne lees van 'n lêer en voeg altyd os. linesep te snare geskryf na 'n lêer. Dit laat steeds die ongemaklike situasie waar 'n lêer op 'n bedryfstelsel is geskep en dan verwerk op 'n ander, in stryd is, OS en ongelukkig is daar isnt veel wat ons daaraan kan doen dat, as die einde van die lyn met os. linesep vergelyk met wat die vas verskil is. Spesifisering paaie Dit is meer van 'n probleem vir Windows-gebruikers as ander hoewel MacOS 9 gebruikers soms te kan stamp in dit. Soos hierbo elke OS spesifiseer paaie na lêers met behulp van verskillende karakters aan die dryf, gidse en lêers te skei. Die generiese oplossing hiervoor is weer aan die os module wat die os. sep veranderlike om die huidige platforms pad separator karakter definieer bied gebruik. In die praktyk gewoond moet jy dit gebruik baie dikwels omdat die pad waarskynlik anders wees vir elke masjien in elk geval So in plaas jy net die volledige pad direk ingaan in 'n string, moontlik een keer vir elke OS jy hardloop op. Maar daar is 'n groot Gotcha wegkruip en wag vir Windows-gebruikers. Jy het in die vorige afdeling dat luislang lekkernye die string N as NEWLINE karakter. Dit is wat dit neem twee karakters en behandel hulle soos een. In werklikheid is daar 'n hele reeks van hierdie spesiale reekse wat begin met terug streep (), insluitend: N - 'n nuwe lyn r - 'n return t - 'n horisontale blad v - 'N vertikale blad b -' N back space 0NN - enige arbitrêre oktale karakter kode . bv die kode 033 is die ontsnapping karakter (ESC) Dit beteken dat as ons 'n data lêer genaamd test. dat en wil dit in Python oopmaak deur die spesifiseer van 'n volledige Windows pad wat ons sou verwag dat dit werk: Maar Python sal die t paar sien est. dat: as 'n blad karakter en kla kan dit nie 'n lêer met die naam C vind. So, hoe kry ons ronde die ongerief Daar is drie oplossings: sit 'n R in die voorkant van die tou. Dit sê vir Python om enige terug houe te ignoreer en hanteer dit as 'n rou angel. Gebruik slashes (/) in plaas van skuinsstrepe, sal Python en Windows tussen hulle uit te sorteer die pad vir jou. Dit het die bykomende voordeel van die maak van jou kode draagbare ander bedryfstelsels ook. Gebruik 'n dubbel agteroorskuinsstreep () aangesien 'n dubbele back slash gesien deur Python as 'n enkele agteroorskuinsstreep So enige van die volgende sal ons data lêer korrek oop: Een finale wending in lêer verwerking is wat jy dalk wil om data voeg tot die einde van 'n bestaande lêer. Een manier om dit te doen sou wees om die lêer vir invoer oopmaak, lees die data in 'n lys, voeg die data na die lys en skryf dan die hele lys uit na 'n nuwe weergawe van die ou lêer. As die lêer is kort dis nie 'n probleem nie, maar as die lêer is baie groot, miskien meer as 100Mb, dan sal jy net hardloop uit geheue na die lys te hou. Gelukkig Theres 'n ander modus n dat ons kan slaag om oop te maak () wat ons in staat stel om direk voeg tot 'n bestaande lêer net deur die skryf van. Selfs beter, as die lêer nie die geval is bestaan ​​dit sal 'n nuwe lêer asof youd gespesifiseerde w oopmaak. As 'n voorbeeld, kan ons aanvaar 'n log-lêer wat ons gebruik vir die opneem van foutboodskappe. Ons dont wil die bestaande boodskappe verwyder sodat ons kies om die fout te voeg, soos volg: In die werklike wêreld sou ons waarskynlik wil die grootte van die lêer in een of ander manier te beperk. 'N Algemene tegniek is om 'n lêernaam te skep wat gebaseer is op die datum, dus wanneer die datum veranderinge wat ons outomaties 'n nuwe lêer te skep en dit is maklik vir die onderhouers van die stelsel om die foute te kry vir 'n spesifieke dag en om ou fout lêers weg argief indien hulle is nie nodig nie. (Onthou, vanaf die spyskaart voorbeeld hierbo, dat die tyd module kan gebruik word om uit te vind die huidige datum.) Die adresboek Revisited Jy onthou die adresboek program het ons 'tydens die Raw Materials onderwerp en dan uitgebrei in die gesprek met die gebruiker onderwerp Kom ons begin om dit regtig nuttig deur dit spaar om 'n lêer en, natuurlik, die lees van die lêer by die begin te maak. Wel dit doen deur die skryf van 'n paar funksies. So in hierdie voorbeeld trek ons ​​saam 'n paar van die drade wat weve gedek in die laaste paar onderwerpe. Die basiese ontwerp sal 'n funksie vereis dat die lêer lees by die begin, 'n ander om die lêer aan die einde van die program te skryf. Ons sal ook 'n funksie om die gebruiker aan te bied met 'n spyskaart van opsies en 'n aparte funksie vir elke spyskaart seleksie skep. Die spyskaart sal die gebruiker toelaat om: Voeg 'n toegang tot die adresboek Verwyder 'n inskrywing uit die boek te vind en 'n bestaande inskrywing vertoon Sluit die program laai die adresboek Let op die gebruik van rstrip () om die nuwe aanlyn-karakter van die verwyder einde van die lyn. Let ook op die volgende () operasie na die volgende lyn van die lêer in die lus haal. Ten slotte opmerk dat ons die lêernaam gedefinieer as 'n veranderlike module vlak sodat ons dit kan gebruik beide in die laai en stoor van die data. Redding van die adresboek Kennisgewing moet ons 'n nuwe reël karakter (N) te voeg wanneer ons die data te skryf. Aan gebruikers invoer Voeg 'n Inskrywing Die verwydering van 'n inskrywing Vind 'n inskrywing Ophou die program Eintlik gewoond ek 'n aparte funksie vir hierdie skrywe, in plaas siek maak die opsie sluit die toets op my spyskaart while lus. So het die hoofprogram sal lyk: Nou is die enigste ding wat oorbly om te doen is bel die hoof () funksie wanneer die program uitgevoer word, en om te doen wat ons gebruik 'n bietjie van 'n afgestorwene magie soos volg: Dit geheimsinnige bietjie kode stel ons in staat om enige Python lêer as 'n module word deur die invoer ing dit te gebruik, of as 'n program deur die loop dit. Die verskil is dat wanneer die program ingevoer word, die interne veranderlike naam is ingestel op die naam module maar wanneer die lêer is hardloop, is die waarde van naam stel na. Sneaky, eh Nou as jy al daardie kode tik in 'n nuwe teks lêer en stoor dit as addressbook. py, moet jy in staat wees om dit uit te voer van 'n bedryfstelsel vinnige deur te tik: Of is dit net dubbel kliek op die lêer in Windows Explorer en dit moet begin in sy eie DOS venster, en die venster sluit wanneer jy die stop opsie kies. Bestudeer die kode, kyk of jy die foute kan vind (Ive verlaat, ten minste, twee klein foute vir jou om uit te vind, is daar dalk meer wees) en probeer om dit op te los. Dit 60 vreemde line program is tipies van die soort van ding wat jy kan begin skryf vir jouself. Daar is 'n paar dinge wat ons kan doen om dit te verbeter wat Siek dekking in die volgende afdeling, maar selfs in sy huidige vorm sy 'n redelik bruikbare klein instrument. VBScript en JavaScript Nóg VBScript of JavaScript het inheemse lêer hantering vermoëns. Dit is 'n sekuriteit funksie na niemand verseker kan jou lêers te lees wanneer jy onskuldig 'n webblad te laai, maar dit hul algemene nut beperk. Maar, soos ons gesien het met herbruikbare modules is daar 'n manier om dit te doen met behulp van Windows Script Host. WSH bied 'n File System voorwerp waarmee enige WSH taal lêers te lees. Ons sal kyk na 'n JavaScript voorbeeld in detail dan wys soortgelyke kode in VBScript vir 'n vergelyking, maar soos voorheen die belangrikste elemente regtig sal wees oproepe na die WScript voorwerpe. Voordat ons kan kyk na die kode in detail sy die moeite werd om die tyd om die lêerstelsel Object Model beskryf. 'N voorwerp model is 'n stel verwante voorwerpe wat gebruik kan word deur die programmeerder. Die WSH File System voorwerp model bestaan ​​uit die FSO voorwerp, 'n aantal lêer voorwerpe, insluitend die tekslêer voorwerp wat ons sal gebruik. Daar is ook 'n paar helper voorwerpe, mees noemenswaardige daarvan is, vir ons doel, die TextStream voorwerp. Eintlik sal ons 'n voorbeeld van die FSO voorwerp te skep, dan gebruik dit om ons tekslêer voorwerpe te skep en uit hierdie op sy beurt skep TextStream voorwerpe waaraan ons kan lees of skryf teks. Die TextStream voorwerpe self is wat ons eintlik lees / skryf van die lêers. Tik die volgende kode in 'n lêer met die naam testFiles. js en voer dit met behulp van cscript soos beskryf in die vorige inleiding tot WSH. Opening van 'n lêer na 'n lêer in WSH ons skep 'n FSO voorwerp dan 'n tekslêer voorwerp van daardie oop: lees en skryf 'n lêer Sluiting lêers en in VBScript Stoor die volgende as testFIles. ws en dan loop dit met behulp van: Of alternatiewelik, sit die bietjie tussen die skripmerkers in 'n lêer met die naam testFile. vbs en hardloop in plaas. Die ws-formaat kan jy JavaScript en VBScript kode in dieselfde lêer meng deur eenvoudig die gebruik van verskeie skripmerkers, moet jy wil. Hantering Nie-teks lêers Hantering teks is een van die mees algemene dinge wat programmeerders doen, maar soms moet ons rou binêre data te verwerk. Dit is baie selde gedoen in VBScript of JavaScript so sal ek net oor hoe Python doen dit. Opening en sluiting binêre lêers Die belangrikste verskil tussen teks lêers en binêre lêers is dat tekslêers is saamgestel uit octets. of grepe, van binêre data waarvolgens elke byte verteenwoordig 'n karakter en die einde van die lêer word gekenmerk deur 'n spesiale byte patroon, bekend generies as einde van lêer. of eof. 'N binêre lêer bevat arbitrêre binêre data en dus nie 'n spesifieke waarde kan gebruik word om einde van lêer te identifiseer en sodoende 'n ander modus operandi is nodig om hierdie lêers te lees. Die eindresultaat hiervan is dat wanneer ons 'n binêre lêer in Python oop (of inderdaad enige ander taal) ons moet spesifiseer dat dit in binêre modus word geopen of risiko vir die data wat gelewer by die eerste eof karakter wat Python vind in wat kapt die data. Die manier waarop ons dit doen in Python is 'n b voeg tot die parameter af, soos volg: Die enigste verskil van die opening van 'n tekslêer is die modus waarde van RB. Jy kan enige van die ander vorme te gebruik, eenvoudig voeg 'n b: WB te skryf, AB te voeg. Sluiting van 'n binêre lêer is nie anders na 'n tekslêer, net noem die metode naby () van die oop lêer voorwerp: Omdat die lêer geopen in binêre modus daar is geen rede om Python enige ekstra inligting te gee, dit weet hoe om die te sluit korrek in te dien. Datavoorstelling en berging Voordat ons bespreek hoe om toegang te verkry tot die data in 'n binêre lêer wat ons nodig het om te oorweeg hoe data verteenwoordig en gestoor word op 'n rekenaar. Alle data gestoor word as 'n reeks van twee weef digi t s, of stukkies. Hierdie stukkies is gegroepeer in stelle van 8 of 16 genoem grepe of woorde onderskeidelik. ( 'N Groep 4 is soms bekend as 'n peusel) 'n greep kan enige een van 256 verskillende bietjie patrone en hierdie word die waardes 0-255. Die inligting wat ons manipuleer in ons programme, snare, nommers ens moet al omskep word in rye van grepe. So die karakters wat ons gebruik in stringe is elke toegeken 'n bepaalde byte patroon. Daar was oorspronklik 'n hele paar sulke enkoderings. maar die mees algemene is die ASCII (American Standard Kodering vir Inligting wisselaar). Ongelukkig suiwer ASCII voorsiening net vir 128 waardes wat nie genoeg vir nie Engels tale. 'N Nuwe enkodering standaard bekend as Unicode geproduseer, wat data woorde kan gebruik in plaas van grepe om karakters voor te stel, en maak voorsiening vir meer as 65.000 karakters. 'N subset van Unicode genoem UTF-8 ooreenstem nou na die vorige ASCII kodering sodanig dat elke geldig ASCII lêer is 'n geldige UTF-8 lêer, hoewel nie noodwendig die ander manier om. Python by verstek ondersteun ASCII en deur pre-hangende 'n U in die voorkant van 'n string ons Python kan vertel om die string as Unicode behandel. (Alhoewel ons moet ook Python vertel wat enkodering in gebruik is of dit sal verwar word.) Op dieselfde wyse getalle nodig het om te omskep word in binêre codings. Vir klein heelgetalle dit is eenvoudig genoeg om die byte waardes direk gebruik, maar getalle groter as 255 (of negatiewe getalle, of breuke) moet 'n paar ekstra werk wat gedoen moet word. Met verloop van tyd verskillende standaard codings na vore gekom het vir numeriese data en die meeste programmeertale en bedryfstelsels gebruik hierdie. Byvoorbeeld, het die Amerikaanse Instituut van Elektriese en Elektroniese Ingenieurswese (IEEE) 'n aantal codings gedefinieer vir drywende punt getalle. Die punt van al hierdie dinge is dat wanneer ons 'n binêre lêer lees ons die rou bietjie patrone interpreteer in die korrekte tipe data vir ons program. Dit is heeltemal moontlik om 'n stroom van grepe wat oorspronklik as 'n karakterstring as 'n stel van drywende punt getalle geskryf interpreteer. Of natuurlik die oorspronklike betekenis sal verloor is, maar die bietjie patrone kan óf verteenwoordig. So wanneer ons binêre data te lees is dit uiters belangrik dat ons dit omskep in die korrekte tipe data. Die struct module enkodeer / dekodeer binêre data Python bied 'n module genoem struct. kort vir struktuur. struct werk baie soos die formaat snare ons het al met behulp vir gemengde data te druk. Ons bied 'n string wat die data wat ons lees en pas dit toe op die byte stroom wat ons probeer om te interpreteer. Ons kan ook struct gebruik om 'n stel data te omskep in 'n greep stroom om te skryf, óf 'n binêre lêer (of selfs 'n kommunikasie lyn). Daar is baie verskillende omskakeling formaat kodes maar ons sal net gebruik maak van die heelgetal en string kodes hier. (Jy kan kyk op die ander op die Python dokumentasie vir die struct module.) Die kodes vir heelgetal en string is ek. en is onderskeidelik. Die struct formaat snare bestaan ​​uit rye kodes met getalle pre-pended om aan te dui hoeveel van die items wat ons nodig het. Die uitsondering is die s-kode waar die prepended getal beteken dat die lengte van die string. Byvoorbeeld 4s beteken 'n string van vier karakters (aantekening 4 karakters nie 4 snare). Kom ons neem aan ons wou die adresbesonderhede bo skryf, van ons adresboek program, as binêre data met die straat nommer as 'n heelgetal en die res as 'n string (Dit is 'n slegte idee in die praktyk sedert straatnommers soms sluit letters). Die formaat string sou lyk: Om met verskeie adres lengtes gaan ons kon 'n funksie te skryf om die binêre string soos hierdie te skep: So gebruik ons ​​'n string metode - split () - (meer op hulle in die volgende onderwerp) om die adres te verdeel string in sy dele, onttrek die eerste een as die nommer en dan gebruik 'n ander string metode, sluit die oorblywende velde weer saam aan te sluit. Die lengte van die string is die aantal wat ons nodig het in die struct formaat string. Sjoe formatAddress () sal 'n reeks van grepe met die binêre voorstelling van ons adres terugkeer. Noudat ons ons binêre data kan sien hoe ons kan skryf wat 'n binêre lêer en dan lees dit weer terug. Lees amp skryfstuk deur die gebruik struct Kom maak 'n binêre lêer met 'n enkele adres lyn met behulp van die funksie formatAddress () hierbo omskryf. Ons moet die lêer oop te maak vir skryf in WB af, enkodeer die data, skryf dit op die lêer en dan die lêer te sluit. Kom ons probeer dit: Jy kan kyk wat die data is inderdaad in binêre formaat deur address. bin opening in notepad. Die karakters sal leesbaar wees, maar die getal sal nie lyk soos 10 In werklikheid is dit is gou volledig verdwyn As jy 'n redakteur wat binêre lêers kan lees (bv vim of emacs) en gebruik dit om address. bin oopmaak sal jy sien dat die begin van die lêer 4 grepe. Die eerste van hierdie kan lyk soos 'n NEWLINE karakter en die res is nulle. Nou is dit blyk dat, net toevallig, die numeriese waarde van NEWLINE is 10 Soos ons kan sien met Python: Die Ord funksie net die ASCII-waarde van 'n gegewe karakter terugkeer. So het die eerste 4 grepe is 10,0,0,0 in desimale (of 0xA, 0x0,0x0,0x0 in heksadesimale). Op 'n 32 bit rekenaar 'n heelgetal neem 4 grepe. So het die heelgetal waarde 10 is omskep deur die struct module in die 4 byte binêre ry 10,0,0,0. Nou op Intel mikro-verwerkers die byte volgorde is om die minste beduidende greep voorop te stel sodat, lees dit in reverse, gee ons die ware binêre waarde: 0,0,0,10. Wat is die heelgetal waarde 10 uitgedruk as 4 desimale grepe. Die res van die data is basies die oorspronklike teks string en so verskyn in sy normale karakter formaat. Maak seker dat jy nie die lêer van binne Notepad red sedert hoewel Notepad kan 'n paar binêre lêers kan hulle nie red as binêre laai, sal dit probeer om die binêre na die teks te omskep en kan handel dryf met die data in die proses Dit is die moeite werd om daarop te wys hier dat die lêeruitbreiding Bin wat ons gebruik is suiwer vir ons gerief, dit het geen invloed op die vraag of die lêer is binêre of teks formaat. Sommige bedryfstelsels gebruik die uitbreiding te bepaal watter program hulle sal gebruik om die lêer oop te maak, maar jy kan die uitbreiding verander deur eenvoudig die lêer hernoem, sal die inhoud nie verander sal dit steeds binêre of teks wat ook al dit was oorspronklik wees. (Jy kan dit bewys deur die hernoeming n tekslêer in Windows te Exe waarna Windows die lêer as 'n uitvoerbare sal hanteer, maar wanneer jy probeer om dit uit te voer wat jy sal 'n fout kry, want die teks is nie regtig uitvoerbare binêre kode As jy nou hernoem dit terug na txt die lêer oop in Notepad presies soos dit gedoen het voor, het die inhoud nie verander nie -. in die feit dat jy kan selfs die teks in Notepad oopgemaak terwyl dit is aangewys as 'n exe en dit sou hê gewerk net so goed) om ons binêre data lees weer wat ons nodig het om die lêer in RB af oop te maak, lees die data in 'n reeks van grepe, die lêer te sluit en uiteindelik uit te pak die data met behulp van 'n struct formaat string. Die vraag is: hoe kan ons vertel wat die formaat string lyk In die algemeen sou ons nodig het om die binêre formaat van die lêer definisie te vind (daar is verskeie webwerwe wat hierdie weetjes voorsien - byvoorbeeld Adobe die definisie van hul gemeenskaplike PDF binêre publiseer formaat). In ons geval weet ons dit moet wees soos die een wat ons geskape formatAddress (). naamlik ins waar N 'n veranderlike aantal. Hoe bepaal ons die waarde van N Die struct module bied 'n paar helper funksies wat die grootte van elke tipe data terug, so deur 'n vuur op die Python vinnige en eksperimenteer ons kan uitvind hoeveel grepe van data wat ons sal terug te kry vir elke tipe data : Ok, ons weet dat ons data 4 grepe vir die getal en een byte vir elke karakter sal bestaan. So N sal die lengte van die data wees minus 4. Kom ons probeer om met behulp wat ons lêer lees: En dis dit op binêre data lêers, of ten minste net soveel as Im gaan om te sê oor die onderwerp. Soos jy kan sien met behulp van binêre data stel verskeie komplikasies en tensy jy 'n baie goeie rede waarom ek dit nie aanbeveel. Maar ten minste as jy nodig het om 'n binêre lêer lees, kan jy dit doen (op voorwaarde dat jy weet wat die wat in die eerste plek natuurlik data) Random toegang tot lêers Die laaste aspek van lêerhantering wat ongesteld oorweeg word ewetoeganklike genoem. Ewetoeganklike beteken direk beweeg na 'n spesifieke deel van die lêer sonder die lees van al die tussenin data. Sommige programmeertale bied 'n spesiale geïndekseer lêer tipe wat hierdie baie vinnig, maar in die meeste tale kan doen sy gebou op die top van die normale volgorde lêer toegang wat ons het al met behulp tot nou toe. Die konsep gebruik, is dié van 'n loper wat die huidige posisie in die lêer punte, letterlik hoeveel grepe ons van die begin af. Ons kan hierdie merker in vergelyking met die huidige posisie of met betrekking tot die begin van die lêer beweeg. Ons kan ook die lêer om ons te vertel waar die wyser is tans vra. Deur die gebruik van 'n vaste linelength (miskien deur padding ons data snare met spasies of 'n ander karakter, waar nodig) ons om die begin van 'n spesifieke lyn kan spring deur die lengte van 'n streep te vermenigvuldig met die aantal lyne. Dit is wat gee die indruk van ewekansige toegang tot die data in die lêer. Waar's ek om te bepaal waar ons in 'n lêer kan ons die metode vertel () van 'n lêer te gebruik. Byvoorbeeld, as ek 'n lêer oop te maak en te lees drie lyne, kan ek dan vra die lêer hoe ver in die lêer is ek. Kom ons kyk na 'n voorbeeld, eerste Ek sal 'n lêer met 5 lyne van die teks te skep almal ewe lank (die gelyke lengte besigheid isnt streng noodsaaklik, maar dit maak die lewe makliker te maak). Dan lees ek sal drie lyne terug en vra waar ons is. Siek terug na die begin en gaan dan, lees 'n reël dan spring na die derde lyn en druk dit, spring oor die tweede reël. Soos volg: Let op die gebruik van die funksie te soek () om die wyser beweeg. Die standaard werking is om dit te skuif na die byte nommer vermeld, soos hier gewys word, maar ekstra argumente kan met dien verstande dat die indeksering metode wat gebruik word verander. Let ook daarop dat die waarde gedruk deur die eerste vertel () is afhanklik van die lengte van 'n nuwe reël op jou platform, op my Windows XP PC dit gedruk 66 aandui dat die NEWLINE ry is 2 grepe lank (66 / 3-20). Maar aangesien dit 'n platform spesifieke waarde en ek wil maak my kode draagbare Ive gebruik tell () weer, na die lees van 'n reël, om uit te werk hoe lank elke reël werklik is. Hierdie soort geslepe ploys is dikwels nodig wanneer met platform spesifieke kwessies Sommige nuwe toegang modes Dinge om Open lêers onthou voordat die gebruik van hulle lêers kan gewoonlik slegs gelees of geskryf is, maar nie beide op dieselfde tyd Luislange readlines () funksie lees al die lyne in 'n lêer, terwyl read line () lees net een lyn op 'n tyd, wat kan help om die geheue. Maar in v2.4 af jy hoef gewoonlik nodig is om te gebruik óf sedert Luislange lêer / oop funksies werk met vir lusse. Close lêers na gebruik. Binêre lêers moet die modus vlag aan die einde in b vertel () en soek () in staat te stel pseudo-ewekansige toegang tot sekwensiële lêers Indien u enige vrae of kommentaar oor hierdie bladsy stuur vir my e-pos by: alan. gauldyahoo. co. ukBinary lêers met C RA Ford Departement Wiskunde. en Rekenaarwetenskap Mount Allison University Sackville, NB Inleiding Die gebruik van strome vir lêer verwerking is seker moontlik in C, maar die meeste C handboeke nie enige inligting met betrekking tot die volle funksionaliteit van strome insluit. Hierdie dokument is gevorm om studente by te staan ​​met 'n agtergrond in C en datastrukture met 'n volledige beskrywing van die C stroom biblioteek. Die dokument is gebaseer op die GNU CPP biblioteek dokumentasie wat by tye is nie maklik om te lees, veral sonder voorbeelde. .


No comments:

Post a Comment