C läsa standard in binary alternativ


Jag försöker bygga en instruktion pipeline simulator och jag har mycket problem att komma igång. Vad jag behöver göra är att läsa binärt från stdin, och lagra det i minnet på något sätt medan jag manipulerar data. Jag behöver läsa i bitar av exakt 32 bitar efter varandra. Hur läser jag i bitar av exakt 32 bitar i taget För det andra, hur lagrar jag den för manipulering senare Heres vad jag har hittills, men undersöker binärbitarna jag läser vidare, det ser inte rätt ut, jag tror inte att jag läser exakt 32 bitar som jag behöver. Hur läser jag i 32 bitar i taget (de är alla 10, inga nyfiler osv.), Och vad lagrar jag in, är char okay EDIT: Jag kan läsa binär men ingen av svaren ger bitarna i den korrekta ordningen är de alla manglade, jag misstänker endianness och problem att läsa och flytta 8 bitar runt (1 karaktär) i taget måste det fungera på Windows och C. frågade 21 okt 09 kl 6:04 faktiskt kan du bara läsa antingen byte med byte eller 4 byte per samtal, eftersom du måste lagra data till en buffert. en gång fick buffert butiker oavsett längd av data, kan du bearbeta bufferten 4 byte med 4 byte. eftersom stdinstdout är som ström, så byte av byte är naturligt också. till skillnad från uttag IO, normalt kan du ignorera byte-order på stdin etc, naturligtvis om du behöver. gör byte-order konvertera dig själv. på grund av ingen ny linje (t ex 39n39) skulle använd läs eller fread vara bättre. Tänk det som en ström. ndash-test 21 okt 09 kl 6:45 Ingen av dessa lösningar läses i binär i korrekt ordning Hjälp snälla, deadline närmar sig. ndash rlb. usa okt 23 09 kl 11:03 x86-plattformar är lilla endianer, du kan inte räkna med att ha i bitarna i rikthanteringen. ndash ntd okt 23 09 på 13:09 1 ja jag har ofta undrat om detta. vad är frågan igen ndash Dödkonto Jan 26 10 kl 16:59 Hur man läser i binära bitar och segmenterar dessa bitar i (kanske oddly sized) bitar, bitmasker till exempel. ndash rlb. usa Jan 26 10 på 19:08 Vad du behöver är freopen (). Från mansidan: Om filnamn är en nullpekare, ska funktionen freopen () försöka ändra läget för strömmen till det som anges av läget, som om namnet på filen som för tillfället associerades med strömmen hade använts. I det här fallet behöver filbeskrivningen associerad med strömmen inte stängas om samtalet till freopen () lyckas. Det är implementeringsdefinierat vilket modifikationsläge som är tillåtet (om det är) och under vilka omständigheter. I grund och botten är det bästa du verkligen kan göra här: Detta öppnar stdin för att vara samma inmatningsström, men i binärt läge. I normalläge kommer läsning från stdin på Windows att konvertera rn (Windows Newline) till singelteckenet ASCII 10. Med rb-läget inaktiveras denna konvertering så att du kan läsa korrekt i binär data. freopen () returnerar en filhantering, men det är det tidigare värdet (innan vi sätter det i binärt läge), så använd det inte för någonting. Därefter använder du fread () som har nämnts. När det gäller dina bekymmer kan du dock inte läsa i 32 bitar, men om du använder fread () kommer du att läsa i 4 char s (vilket är det bästa du kan göra i C-char garanteras att vara minst 8 bitar men några historiska och inbyggda plattformar har 16 bitar char s (vissa har till och med 18 eller sämre)). Om du använder fgets () läser du aldrig i 4 byte. Du kommer att läsa i minst 3 (beroende på om någon av dem är newlines), och den fjärde byte blir 0 eftersom C-strängar är nollställda och fgets () nul-terminerar vad den läser (som en bra funktion). Självklart är detta inte vad du vill, så du borde använda fread (). svarat 21 okt 09 kl 6:44 fgets () är fel här. Den syftar till mänsklig läsbar ASCII-text som avslutas av slutliga tecken, inte binär data, och får dig inte vad du behöver. Jag gjorde nyligen precis vad du vill använda läsningen (). Om ditt program inte uttryckligen har stängt stdin, kan du för det första argumentet (fildeskriptorn) använda ett konstant värde på 0 för stdin. Eller om du är på ett POSIX-system (Linux, Mac OS X eller någon annan modern variant av Unix), kan du använda STDINFILENO. svarat 21 okt 09 kl 6: 20Input och Output (IO): stdio. h 160 Detta kapitel kommer att se på många former av IO. Vi har kort nämnt några former innan vi kommer att titta på dessa i mycket mer detalj här. Dina program kommer att behöva inkludera standard IO header fil så gör: Många gånger är det användbart att rapportera fel i ett C-program. Standardbiblioteket perror () är en lättanvänd och praktisk funktion. Den används i samband med errno och ofta när det gäller ett fel du kanske vill avsluta ditt program tidigt. Även om det inte är en strikt del av biblioteket stdio. h presenterar vi begreppet errno och funktionen utgången () här. Vi kommer också att uppfylla dessa begrepp i andra delar av Standardbiblioteket. Funktionen perror () är prototyperad av: void perror (const char message) perror () ger ett meddelande (om standardfejlutgång - se avsnitt 17.2.1), som beskriver det senaste felet som uppstod, återvände till errno (se nedan) under ett samtal till ett system eller en biblioteksfunktion. Argumentsträngmeddelandet skrivs först, sedan ett kolon och ett tomt, sedan meddelandet och en ny linje. Om meddelandet är en NULL-pekare eller pekar på en null-sträng, skrivs kolon inte ut. errno är en speciell systemvariabel som är inställd om ett systemsamtal inte kan utföra sin inställda uppgift. Den definieras i inkluderar lterrno. hgt. För att använda errno i ett C-program måste det deklareras via: Det kan manuellt återställas inom ett C-program (även om det här är ovanligt) annars behålls det bara det senaste värdet som returneras av ett systemanrop eller en biblioteksfunktion. Funktionsutgången () är prototyperad i include ltstdlibgt av: void exit (int status) Exit avslutar helt enkelt utförandet av ett program och returnerar utgångsstatusvärdet till operativsystemet. Statusvärdet används för att indikera om programmet har avslutats ordentligt: ​​det existerar med ett EXITSUCCESS-värde vid lyckad avslutning. Det finns ett EXITFAILURE-värde vid misslyckad uppsägning. Om du stöter på ett fel kan du ofta ringa en exit (EXITFAILURE) för att avsluta ett felaktigt program. Strömmar är ett bärbart sätt att läsa och skriva data. De ger ett flexibelt och effektivt sätt för IO. En ström är en fil eller en fysisk enhet (t ex skrivare eller bildskärm) som manipuleras med en pekare till strömmen. Det finns en intern C datastruktur, FILE. som representerar alla strömmar och definieras i stdio. h. Vi behöver helt enkelt hänvisa till FIL-strukturen i C-program när vi utför IO med strömmar. Vi behöver bara deklarera en variabel eller pekare av denna typ i våra program. Vi behöver inte veta mer specifika om denna definition. Vi måste öppna en ström innan vi gör någon IO, och stäng sedan den. Stream IO är BUFFERED. Det vill säga en fast bit är läs från eller skrivet till en fil via något temporärt lagringsområde (bufferten). Detta illustreras i fig 17.1. OBS! Filpekaren pekar faktiskt på den här bufferten. Fig. Ström IO-modell Detta leder till effektiv IO men akta dig. data som skrivs till en buffert visas inte i en fil (eller en enhet) tills bufferten är spolad eller utskriven. (n gör det här). Eventuell onormal kodavgång kan orsaka problem. 160 UNIX definierar 3 fördefinierade strömmar (i stdio. h): stdin, stdout, stderr De använder alla text en metod för IO. stdin och stdout kan användas med filer, program, IO-enheter som tangentbord, konsol etc. stderr går alltid till konsolen eller skärmen. Konsolen är standard för stdout och stderr. Tangentbordet är standard för stdin. Fördefinierad ström öppnas automatiskt. Så här överväger vi de förinställda standardvärdena för UNIX som standard. Detta är inte en del av C men operativsystemet är beroende. Vi kommer att göra omdirigering från kommandoraden. gt - omdirigera stdout till en fil. Så om vi har ett program ut. som vanligtvis skriver ut till skärmen skickar sedan utdata till en fil, file1. lt - omdirigera stdin från en fil till ett program. Så om vi förväntar oss inmatning från tangentbordet för ett program, kan vi läsa liknande inmatningar från ett filrör. sätter stdout från ett program till stdin av en annan t. ex. Skickat utdata (vanligtvis konsol) av ett program direkt till skrivaren: Det finns ett par funktioner som ger grundläggande IO-anläggningar. förmodligen de vanligaste är: getchar () och putchar (). De definieras och används enligt följande: int getchar (void) - läser en char från stdin int putchar (char ch) - skriver en char till stdout. returnerar karaktär skrivet. int getc (FILE stream), int putc (char ch, FILE stream) Vi har sett exempel på hur C använder formaterad IO redan. Låt oss se mer på det här. 160 Funktionen definieras enligt följande: int printf (char format, arg list.) - skrivs ut till stdout i listan med argument enligt angiven formatsträng. Returnerar antal tecken som skrivs ut. Formatsträngen har 2 typer av objekt: vanliga tecken - dessa kopieras till utmatning. Konverteringsspecifikationer - betecknad och listat i tabell 17.1. Tabell: Printfscanf-format karaktärerC Fil IO och binär fil IO Av Alex Allain I denna handledning lär du dig hur du gör fil IO, text och binär, i C, med fopen. skriva ut. och fread. fprintf. fscanf. fgetc och fputc. För C File IO måste du använda en FILE-pekare, vilket låter programmet hålla reda på filen som ska nås. (Du kan tänka på det som filens minnesadress eller filens plats). För att öppna en fil måste du använda fopen-funktionen, som returnerar en FILE-pekare. När du har öppnat en fil kan du använda FILE-pekaren för att låta kompilatorn utföra inmatnings - och utmatningsfunktioner på filen. I filnamnet, om du använder en sträng bokstavlig som argumentet, måste du komma ihåg att använda dubbla backslashes snarare än en enda backslash eftersom du annars riskerar en escape karaktär som t. Med dubbla backslashes släpps nyckeln, så strängen fungerar som förväntat. Dina användare behöver förstås inte göra det. Det är precis som citerade strängar hanteras i C och C. Fopen-lägen De tillåtna lägena för fopen är följande: Observera att det är möjligt att fopa misslyckas, även om ditt program är perfekt rätt: du kan försöka öppna en fil som anges av användaren, och den filen kanske inte finns (eller den kan vara skrivskyddad). I sådana fall kommer fopen att returnera 0, NULL-pekaren. Här är ett enkelt exempel på att använda fopen: Den här koden öppnar test. txt för att läsa i textläge. För att öppna en fil i binärläge måste du lägga till ab till slutet av lägessträngen till exempel rb (för läsning och skrivningslägen kan du lägga till b antingen efter plusteckenet - rb - eller före - rb) När du är klar med att arbeta med en fil, du borde stänga den med funktionen fclose returnerar noll om filen är stängd. Ett exempel på fclose är läsning och skrivning med fprintf, fscanf fputc och fgetc För att arbeta med textingång och - utmatning använder du fprintf och fscanf, vilka båda liknar deras vänner printf och scanf förutom att du måste skicka FILE-pekaren som första argumentet. Till exempel: Det är också möjligt att läsa (eller skriva) en enda tecken i taget - det här kan vara användbart om du vill utföra tecken-för-teckeninmatning (till exempel om du behöver hålla reda på varje bit av skiljetecken i en fil som skulle vara mer meningsfullt att läsa i en enda karaktär än att läsa i en sträng åt gången.) Fgetc-funktionen, som tar en filpekare och returnerar en int, låter dig läsa ett enda tecken från en fil: Observera att fgetc returnerar en int. Vad det egentligen betyder är att när det läser en normal karaktär i filen, kommer den att returnera ett värde som är lämpligt för lagring i en osignerad karaktär (i princip ett tal i intervallet 0 till 255). Å andra sidan, när du är i slutet av filen, kan du inte få ett teckenvärde - i så fall kommer fgetc att returnera EOF, vilket är en konstant som indikerar att du har nått slutet av filen. För att se ett komplett exempel med fgetc i praktiken, ta en titt på exemplet här. Med fputc-funktionen kan du skriva ett tecken åt gången - det kan vara bra om du vill kopiera en filtecken efter tecken. Det ser ut så här: Observera att det första argumentet ska ligga inom en osignerad karaktär så att den är ett giltigt tecken. Det andra argumentet är filen att skriva till. Efter framgång kommer fputc att returnera värdet c, och vid fel kommer det att returnera EOF. Binär fil IO - fread och fwrite För binär fil IO använder du fread och fwrite. Deklarationerna för var och en är lika: Båda dessa funktioner handlar om block av minnen - vanligtvis arrays. Eftersom de accepterar pekare kan du även använda dessa funktioner med andra datastrukturer, du kan även skriva strukturer till en fil eller en lässtruktur i minnet. Låt oss titta på en funktion för att se hur notationen fungerar. fread tar fyra argument. Var inte förvirrad av deklarationen av ett tomrum ptr tomt betyder att det är en pekare som kan användas för vilken typ av variabel som helst. Det första argumentet är namnet på arrayen eller adressen till strukturen du vill skriva till filen. Det andra argumentet är storleken på varje element i matrisen i byte. Om du till exempel har en rad tecken, vill du läsa den i en bitbit, så sizeofelements är en. Du kan använda sizeof-operatören för att få storleken på de olika datatyperna till exempel, om du har en variabel int x kan du få storleken på x med sizeof (x). Denna användning fungerar även för strukturer eller arrays. T. ex. Om du har en variabel av en strukturtyp med namnet astruct kan du använda sizeof (struct) för att ta reda på hur mycket minne det tar upp. Det tredje argumentet är helt enkelt hur många element du vill läsa eller skriva till exempel, om du skickar en 100 elementarray, vill du inte läsa mer än 100 element så att du går över 100. Det sista argumentet är helt enkelt filpekaren weve använt. När fread används, efter att ha skickats en array, kommer fread att läsa från filen tills den har fyllt arrayen, och det kommer att returnera antalet element som faktiskt läses. Om filen till exempel bara är 30 byte, men du försöker läsa 100 byte kommer den att återvända att den läser 30 byte. För att kontrollera att slutet på filen har nåtts, använd feof-funktionen, som accepterar en FILE-pekare och returnerar sant om slutet på filen har nåtts. fwrite är liknande i användningen, förutom istället för att läsa in i minnet skriver du från minnet till en fil. C - Ingång amp-utgång När vi säger Input. det betyder att mata in några data till ett program. En inmatning kan ges i form av en fil eller från kommandoraden. C programmering ger en uppsättning inbyggda funktioner för att läsa den angivna ingången och mata in programmet enligt krav. När vi säger Output. det betyder att visa vissa data på skärm, skrivare eller i någon fil. C-programmering ger en uppsättning inbyggda funktioner för att mata ut data på datorskärmen och spara det i text - eller binära filer. Programmet Standardfiler C behandlar alla enheter som filer. Så enheter som skärmen adresseras på samma sätt som filer och följande tre filer öppnas automatiskt när ett program körs för att ge åtkomst till tangentbordet och skärmen. Filpekarna är sättet att komma åt filen för läsning och skrivning. I det här avsnittet beskrivs hur man läser värden från skärmen och hur man skriver ut resultatet på skärmen. Funktionerna getchar () och putchar () Funktionen int getchar (void) läser nästa tillgängliga tecken från skärmen och returnerar den som ett heltal. Denna funktion läser endast enstaka tecken åt gången. Du kan använda den här metoden i slingan om du vill läsa mer än ett tecken från skärmen. Funktionen int putchar (int c) sätter det överförda tecknet på skärmen och returnerar samma tecken. Den här funktionen sätter bara enstaka tecken åt gången. Du kan använda den här metoden i slingan om du vill visa mer än ett tecken på skärmen. Kontrollera följande exempel minus När den här koden är sammanställd och exekverad väntar den på att du skriver in lite text. När du skriver in en text och trycker på enter, fortsätter programmet och läser bara ett enda tecken och visar det som följer minus Get () och sätter () Funktioner Funktionen char (char s) läser en linje från stdin till bufferten pekade på s tills antingen en avslutande ny linje eller EOF (slutet av filen). Int sätter (const char s) funktionen skriver strängen s och en efterföljande ny linje till stdout. När den ovan nämnda koden sammanställs och exekveras, väntar den på att du skriver in lite text. När du skriver in en text och trycker på enter, fortsätter programmet och läser hela linjen till slutet, och visar det som följer minus Scanf () och printf () Funktioner Funktionen int scanf (const char format.) Läser inmatningen från standardinmatningsströmmen stdin och skanningar som matar in enligt det angivna formatet. Funktionen int printf (const char format) skriver utmatningen till standard utgångsström stdout och producerar utgången enligt det angivna formatet. Formatet kan vara en enkel konstant sträng, men du kan ange s, d, c, f, etc. för att skriva ut eller läsa strängar, heltal, tecken eller float respektive. Det finns många andra formateringsalternativ som kan användas baserat på krav. Låt oss nu gå vidare med ett enkelt exempel för att förstå begreppen bättre minus När den här koden sammanställs och exekveras väntar den på att du skriver in lite text. När du skriver in en text och trycker på enter, fortsätter programmet och läser inmatningen och visar det enligt följande minus Här bör det noteras att scanf () förväntar sig inmatning i samma format som du gav s och d, vilket innebär att du måste ge giltiga ingångar som sträng heltal. Om du anger strängsträng eller heltals heltal antas det som fel inmatning. För det andra, medan du läser en sträng, slutar scanf () att läsa så fort det möter ett mellanslag, så det här är testet är tre strängar för scanf ().

Comments