Monday, 27 November 2017

Wofstream Binære Alternativer


Jeg leser en binær fil som: Men jeg skjønner at dette ikke er en sann binærlese. Ifstream leser faktisk en byte og konverterer den til en bred røye. Så hvis den binære filen har innholdet 0x112233. ff. Jeg har faktisk lest 0x110022003300. ff00. Dette gir ikke mye mening til meg: for det første trenger jeg bare å bruke en bred fstream fordi filnavnet er ikke latinsk. For det andre, hvis jeg sier at fstream er binær, hvorfor leser, leser du et stort tegn Koden under gjør det jeg vil ha. Er det en måte å oppnå at ved hjelp av std fstreams spurte 21 mar klokken 19:15 399 med Visual Studio for Windows og Intel compiler for Linux. Din løsning fungerte bra i Windows. Jeg har ikke prøvd det ennå på Linux. Det er ganske elegant løsning. I39d foretrekker ikke å stole på kompilatorutvidelser selv. Tror du du kan gjøre dette ved å holde fast på standarden, og kanskje spesifisere charsetet som en templert parameter til ifstream ndash rturrado 22. mars kl 15:15 rturrado: (fjernet min forrige kommentar) Jeg anbefaler ikke lenger Boost. Filesystem siden dens tilnærming er å definere forskjellige grensesnitt på forskjellige plattformer, som i utgangspunktet forårsaker portabilitetsproblemer og gjør det faktisk vanskeligere å skrive Unicode-korrekt kode. Fra min erfaring er det bedre å følge tilnærmingen jeg skrev i EDIT. ndash ybungalobill 23 aug 12 kl 13:00 C Binær fil IO Normalt, for binær fil io bruker du ikke den konvensjonelle tekstorienterte ltlt og operatørene Det kan gjøres, men det er et avansert emne. Grunnmodell for fil IO I C er filstrømsklassene designet med ideen om at en fil bare skal sees som en strøm eller en rekke ufortolkte byte. For enkelhets skyld er rekkevidden av byte lagret i en fil indeksert fra null til len -1, hvor len er det totale antall byte i hele filen. Hver åpen fil har to posisjoner knyttet til den: Den nåværende lesestilling, som er indeksen for neste byte som vil bli lest fra filen. Dette kalles fåpekeren siden det peker til neste tegn som den grunnleggende hentemetoden kommer tilbake. Den nåværende skriveposisjonen, som er indeksen for byteplasseringen der neste utgangsbyting vil bli plassert. Dette kalles putepekeren siden det peker til stedet der den grunnleggende putmetoden vil plassere parameteren. Disse to filposisjonene er uavhengige, og enten kan man peke hvor som helst i filen. Hent størrelsen på en fil Den typiske måten å få størrelsen til en fil på, er å bruke C-bibliotekets funksjonsstat. Merk at den andre parameteren til stat er en peker. Det er ditt ansvar å opprette og administrere minnet der stat vil plassere sine resultater, og adressen til det minnet er det du bør passere inn som denne andre parameteren. Eksemplet ovenfor viser bruken av en lokal variabel for å holde resultatene returnert av stat. Åpne en fil Et filstrømobjekt kan åpnes på to måter. Først kan du levere et filnavn sammen med en io-modus-parameter til konstruktøren når du erklære et objekt: Alternativt, etter at et filstrømobjekt har blitt erklært, kan du ringe sin åpne metode: Enten tilnærming vil fungere med en omstrøm. en avstrømning. eller en fstream-objekt. Normalt, når man manipulerer tekstfiler, utelater man den andre parameteren (io-modus-parameteren). For å manipulere binære filer bør du imidlertid alltid spesifisere io-modusen, inkludert ios :: binær som en av modusflaggene. For readwrite tilgang til en fil, bruk en fstream. Merk: Hvis du er en GNU g-bruker (versjon 2.7.x eller tidligere), må du ikke bruke io-modusflagger når du åpner omstrømmede objekter. På grunn av en feil i GNU libg-implementeringen, vil flaggene ikke tolkes korrekt. Hvis du arbeider under Unix, slipper du io-modus-flaggene helt hvis du jobber med g under MS-DOS, og bruker en fstream-objekt. Dette notatet gjelder kun for g-brukere. Lese fra en fil Hvis du vil lese fra en fstream - eller omstrømsobjekt, bruk lesemetoden. Denne metoden tar to parametere: Leseelementfunksjonen trekker ut et gitt antall byte fra den oppgitte strømmen, og plasserer dem i minnet som pekes til av den første parameteren. Det er ditt ansvar å opprette og administrere minnet hvor lesing vil plassere resultatet, samt for å sikre at det er stort nok til å holde antall byte forespurt. Bytene som leses og ikke tolkes, antar metoden ikke noe om linjeendringer, og lesemetoden plasserer ikke null nullstarter på slutten av byte som leses inn. Hvis det oppstår en feil under lesing (for eksempel, hvis du leser slutten av en fil), er strømmen plassert i en feiltilstand. Hvis det skjer, kan du bruke gcount-metoden til å finne ut hvor mange tegn som faktisk ble lest, og bruk den klare metoden for å tilbakestille strømmen til en brukbar tilstand. Når en strøm går inn i en feiltilstand, vil alle fremtidige leseoperasjoner mislykkes. Omplassere krypteren For å endre posisjonen til getpekeren (filavlesningsposisjonen) for en fstream - eller omstrømobjekt, bruk søkemetoden. Den grunnleggende formen for denne operasjonen tar en enkelt parameter: En streampos er i hovedsak en usignert lang heltallverdi. searchg flytter få pekeren til den angitte absolutte filposisjonen (hvor 0 er starten på filen). Når du ringer søk, vær forsiktig med typene av dine argumenter: Problemet ovenfor er at filene kan være relativt store, så streampos kan holde veldig store tall. Men over, hvis blknumber er over 63. På grunn av typene blknumber og BLKSIZE (begge int er), på en PC kan produktet bare være 16 biter bredt. For å rette opp dette, må du sikre at konstanter som brukes i filposisjonering, er lange mengder, eller at alle variabler som brukes i slik posisjonering, er lange mengder, eller begge deler. Du kan bestemme gjeldende poengposisjon ved hjelp av myFile. tellg (), en metode uten parametere som returnerer indeksen til fåpekeren på den oppgitte strømmen. Det finnes også en variant av søkg som lar deg spesifisere en posisjon i forhold til den nåværende få poengposisjonen, eller i forhold til slutten av filen. Skrive til en fil For å skrive til en fstream eller oppstrøms objekt, bruk skrivemetoden. Denne metoden tar to parametere: Skriv medlem-funksjonen skriver et gitt antall byte på den oppgitte strømmen, starter ved posisjonen til putepekeren. Hvis putepekeren er nåværende på slutten av filen, blir filen utvidet. Hvis putepekeren peker inn i midten av filen, overskrives tegnene i filen med de nye dataene. Byteene som er skrevet og ikke tolket, blir ingen vognretur lagt etter dataene, og skrivemetoden antar ikke at det finnes en nullterminator på slutten av byte som skrives. Hvis det oppstår en feil under skriving (for eksempel hvis du går tom for diskplass), blir strømmen plassert i en feiltilstand. Slike feil er ikke like vanlige som lesefeil, og blir ofte ikke sjekket. Posisjonering av putepekeren Hvis du vil endre posisjonen til putepekeren (filavlesningsposisjonen) for en fstream - eller oppstrømsobjekt, bruk søkemetoden. Den grunnleggende formen for denne operasjonen tar en enkelt parameter: En streampos er i hovedsak en usignert lang heltallverdi. searchp flytter putepekeren til den angitte absolutte filposisjonen (hvor 0 er starten på filen). Du kan bestemme den nåværende putterposisjonen ved hjelp av myFile. tellp (), en metode uten parametere som returnerer indeksen av putepekeren på den oppgitte strømmen. Det finnes også en variant av searchp som lar deg spesifisere en posisjon i forhold til den nåværende putterposisjonen, eller i forhold til slutten av filen. Lese og skrive komplekse data Selv om lese - og skrivemetoder aksepterer en karbonpeker, er det ikke noe krav om at dataene du leser andor skrive skal holdes i et karbonatursett. Du kan lese eller skrive komplekse dataobjekter ved hjelp av enkel type avstøpning av pekere: Lukke en fil For alle filstrømobjekter, bruk: ofstream :: ofstream Navnet på filen som skal åpnes under konstruksjon. Et heltall som inneholder modusbiter definert som ios-enumeratorer som kan kombineres med bitwise OR () operatøren. Parameteren nMode må ha en av følgende verdier: ios :: app Funksjonen utfører et søk til slutten av filen. Når nye byte er skrevet til filen, blir de alltid lagt til enden, selv om stillingen flyttes med ostream :: seekp-funksjonen. Ios :: ate Funksjonen utfører et søk til slutten av filen. Når den første nye byte er skrevet til filen, er den vedlagt til slutten, men når etterfølgende byte er skrevet, skrives de til den aktuelle posisjonen. :: i Hvis denne modusen er spesifisert, så vil den opprinnelige filen (hvis den eksisterer) vil ikke bli truncated. ios :: out Filen åpnes for utdata (underforstått for alle oppstrømsobjekter).ios :: trunc Hvis filen allerede eksisterer, blir innholdet kassert. Denne modusen er underforstått hvis IOS :: out er spesifisert og ios :: spiste. ios :: app. og ios: er ikke specified. ios :: nocreate Hvis filen ikke eksisterer, fungerer funksjonen fails. ios :: noreplace Hvis filen allerede eksisterer, fungerer fails. ios :: binær Åpner filen i binær modus (den standard er tekstmodus). Filbeskyttelsespesifikasjonen er standard for det statiske heltallet filebuf :: openprot som tilsvarer filebuf :: shcompat. De mulige nProt-verdiene er: filebuf :: shcompat Kompatibilitets delmodus. filebuf :: shnone Eksklusiv modus no sharing. filebuf :: skread Les deling allowed. filebuf :: shwrite Skriv del tillatt. For å kombinere filebuf :: shread og filebuf :: shwrite moduser, bruk den logiske OR () operatøren. En filbeskrivelse som returnert av en samtale til run-time-funksjonen åpen eller sopen filedesc er en typedef tilsvarende int. Pekeren til et tidligere tildelt reserveområde med lengde nLength. En NULL-verdi (eller nLength 0) indikerer at strømmen vil bli unbuffert. Lengden (i bytes) av reserveområdet (0 unbuffered). De fire oppbyggerne er:

No comments:

Post a Comment