C filinmatning/utmatning - C file input/output
| C standardbibliotek |
|---|
| Allmänna ämnen |
| Diverse rubriker |
Det språk C-programmering ger många vanliga biblioteksfunktioner för fil ingång och utgång . Dessa funktioner utgör huvuddelen av C -standardbibliotekets rubrik <stdio.h> . Funktionen härstammar från ett "bärbart I/O -paket" skrivet av Mike Lesk på Bell Labs i början av 1970 -talet och blev officiellt en del av Unix -operativsystemet i version 7 .
I/O-funktionen hos C är ganska låg på grund av moderna standarder; C abstraherar alla filhantering i operationer på strömmar av bitgrupper , som kan vara "ingångsströmmar" eller "utgångsströmmar". Till skillnad från vissa tidigare programmeringsspråk har C inget direkt stöd för datafiler med slumpmässig åtkomst ; för att läsa från en post i mitten av en fil måste programmeraren skapa en ström, söka till mitten av filen och sedan läsa byte i sekvens från strömmen.
Strömmodellen för fil I/O populariserades av Unix, som utvecklades samtidigt med C -programmeringsspråket i sig. De allra flesta moderna operativsystem har ärvt strömmar från Unix, och många språk i C -programmeringsspråksfamiljen har ärvt C: s fil -I/O -gränssnitt med få om några ändringar (till exempel PHP ).
Översikt
Detta bibliotek använder vad som kallas strömmar för att fungera med fysiska enheter som tangentbord, skrivare, terminaler eller med någon annan typ av filer som stöds av systemet. Strömmar är en abstraktion för att interagera med dessa på ett enhetligt sätt. Alla strömmar har liknande egenskaper oberoende av de individuella egenskaperna hos de fysiska medier de är associerade med.
Funktioner
De flesta av C -filens in-/utmatningsfunktioner är definierade i <stdio.h> (eller i C ++ -huvudet cstdio , som innehåller standard C -funktionen men i std -namnutrymmet ).
| Byte karaktär |
Bred karaktär |
Beskrivning | |
|---|---|---|---|
| Filåtkomst | fopen | Öppnar en fil (med ett icke-Unicode-filnamn på Windows och eventuellt UTF-8-filnamn på Linux) | |
| fritt | Öppnar en annan fil med en befintlig ström | ||
| fflush | Synkroniserar en utmatningsström med den faktiska filen | ||
| fclose | Stänger en fil | ||
| setbuf | Ställer in bufferten för en filström | ||
| setvbuf | Ställer in bufferten och dess storlek för en filström | ||
| fwide | Växlar en filström mellan I/O med bred tecken och I/O med smala tecken | ||
| Direkt in/ut |
skrämmande | Läser från en fil | |
| fwrite | Skriver till en fil | ||
| Oformaterad input/output |
fgetc getc |
fgetwc getwc |
Läser en byte/ wchar_t från en filström |
| fgets | fgetws | Läser en byte/ wchar_t -rad från en filström | |
|
fputc putc |
fputwc putwc |
Skriver en byte/ wchar_t till en filström | |
| fputs | fputws | Skriver en byte/ wchar_t -sträng till en filström | |
| getchar | getwchar | Läser en byte/ wchar_t från stdin | |
|
|
Ej tillgängligt | Läser en byte -sträng från stdin tills en ny rad eller slutet av filen påträffas (föråldrad i C99, borttagen från C11) | |
| putchar | putwchar | Skriver en byte/ wchar_t till stdout | |
| sätter | Ej tillgängligt | Skriver en byte -sträng till stdout | |
| ungetc | ungetwc | Sätter tillbaka en byte/ wchar_t i en filström | |
| Formaterad input/output |
scanf fscanf sscanf |
wscanf fwscanf swscanf |
Läser formaterad byte/ wchar_t -inmatning från stdin, en filström eller en buffert |
|
vscanf vfscanf vsscanf |
vwscanf vfwscanf vswscanf |
Läser formaterad inmatningsbyte/ wchar_t från stdin, en filström eller en buffert med variabel argumentlista |
|
|
printf fprintf sprintf snprintf |
wprintf fwprintf swprintf |
Skriver ut formaterad byte/ wchar_t -utmatning till stdout, en filström eller en buffert |
|
|
vprintf vfprintf vsprintf vsnprintf |
vwprintf vfwprintf vswprintf |
Skriver ut formaterad byte/ wchar_t -utmatning till stdout, en filström eller en buffert med variabel argumentlista |
|
| perror | Ej tillgängligt | Skriver en beskrivning av det aktuella felet till stderr | |
| Filplacering |
ftell ftello |
Returnerar den aktuella filpositionsindikatorn | |
|
fseek fseeko |
Flyttar filpositionsindikatorn till en specifik plats i en fil | ||
| fgetpos | Hämtar filpositionsindikatorn | ||
| fsetpos | Flyttar filpositionsindikatorn till en specifik plats i en fil | ||
| spola tillbaka | Flyttar filpositionsindikatorn till början i en fil | ||
| fel hantering |
klararer | Rensar fel | |
| feof | Kontrollerar om filen är slut | ||
| ferror | Kontrollerar om det finns ett filfel | ||
| Operationer på filer |
avlägsna | Raderar en fil | |
| Döp om | Byt namn på en fil | ||
| tmpfile | Återställer en pekare till en tillfällig fil | ||
| tmpnam | Returnerar ett unikt filnamn | ||
Konstanter
Konstanter definierade i rubriken <stdio.h> inkluderar:
| namn | Anteckningar |
|---|---|
| EOF | Ett negativt heltal av typen int som används för att indikera slutet av filen |
| BUFSIZ | Ett heltal, vilket är storleken på den buffert som används av setbuf () funktion |
| FILENAME_MAX | Storleken på en char -array som är tillräckligt stor för att lagra namnet på alla filer som kan öppnas |
| FOPEN_MAX | Antalet filer som kan vara öppna samtidigt; blir minst åtta |
| _IOFBF | En förkortning för "input/output fully buffered"; det är ett heltal som kan skickas till setvbuf () -funktionen för att begära blockbuffrad inmatning och utmatning för en öppen ström |
| _IOLBF | En förkortning för "input/output line buffered"; det är ett heltal som kan skickas till setvbuf () -funktionen för att begära radbuffrad inmatning och utmatning för en öppen ström |
| _IONBF | En förkortning för "input/output not buffered"; det är ett heltal som kan skickas till setvbuf () -funktionen för att begära obuffrad in- och utmatning för en öppen ström |
| L_tmpnam | Storleken på en char -array som är tillräckligt stor för att lagra ett tillfälligt filnamn som genereras av tmpnam () -funktionen |
| NULL | Ett makro som expanderar till nollpekarkonstanten ; det vill säga en konstant som representerar ett pekarvärde som garanterat inte är en giltig adress för ett objekt i minnet |
| SEEK_CUR | Ett heltal som kan skickas till fseek () -funktionen för att begära positionering i förhållande till den aktuella filpositionen |
| SEEK_END | Ett heltal som kan skickas till fseek () -funktionen för att begära positionering i förhållande till slutet av filen |
| SEEK_SET | Ett heltal som kan skickas till fseek () -funktionen för att begära positionering i förhållande till början av filen |
| TMP_MAX | Det maximala antalet unika filnamn som genereras av funktionen tmpnam () ; kommer att vara minst 25 |
Variabler
Variabler som definieras i rubriken <stdio.h> inkluderar:
| namn | Anteckningar |
|---|---|
| stdin | En pekare till en FIL som hänvisar till standardinmatningsströmmen, vanligtvis ett tangentbord. |
| stdout | En pekare till en FIL som hänvisar till standardutmatningsströmmen, vanligtvis en displayterminal. |
| stderr | En pekare till en FIL som hänvisar till standardfelströmmen, ofta en displayterminal. |
Medlemstyper
Datatyper som definieras i rubriken <stdio.h> inkluderar:
-
FIL - även känd som enfil handtag , är detta en ogenomskinlig typ som innehåller information om en fil eller text ström som behövs för att utföra in- och utgående operationer på det, bland annat:
- plattformsspecifik identifierare för den associerade I/O-enheten, till exempel en filbeskrivning
- bufferten
- strömriktningsindikator (ej inställd, smal eller bred)
- strömbufferttillståndsindikator (obuffrad, radbuffrad, helt buffrad)
- I/O -lägesindikator (ingångsström, utmatningsström eller uppdateringsström)
- binär/textlägesindikator
- slutfilindikator
- felindikator
- den aktuella strömpositionen och multibytkonverteringstillståndet (ett objekt av typen mbstate_t)
- återinträdande lås (krävs från och med C11 )
- fpos_t- en icke-array-typ som kan identifiera positionen för varje byte i en fil och varje konverteringstillstånd som kan uppstå i alla multibyte-teckenkodningar som stöds
- size_t - en osignerad heltalstyp som är typen av resultatet av operatorens storlek .
Tillägg
De POSIX -standarden definierar flera anknytningar till stdio i sin Base Definitioner, bland vilka är en readline funktion som allokerar minne, FileNo och fdopen funktioner som fastställa kopplingen mellan FILE objekt och fildeskriptorer , och en grupp av funktioner för att skapa FILE objekt som refererar till minnesbuffertar.
Exempel
Följande C -program öppnar en binär fil som heter myfile , läser fem byte från den och stänger sedan filen.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buffer[5];
FILE* fp = fopen("myfile", "rb");
if (fp == NULL) {
perror("Failed to open file \"myfile\"");
return EXIT_FAILURE;
}
for (int i = 0; i < 5; i++) {
int rc = getc(fp);
if (rc == EOF) {
fputs("An error occurred while reading the file.\n", stderr);
return EXIT_FAILURE;
}
buffer[i] = rc;
}
fclose(fp);
printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
buffer[2], buffer[3], buffer[4]);
return EXIT_SUCCESS;
}
Alternativ till stdio
Flera alternativ till stdio har utvecklats. Bland dessa finns C ++ iostream -biblioteket, en del av ISO C ++ -standarden . ISO C ++ kräver fortfarande stdio -funktionen.
Andra alternativ inkluderar SFIO (A Safe/Fast I/O Library) -biblioteket från AT&T Bell Laboratories . Detta bibliotek, som introducerades 1991, syftade till att undvika inkonsekvenser, osäkra metoder och ineffektivitet i utformningen av stdio . Bland dess funktioner finns möjligheten att infoga återuppringningsfunktioner i en ström för att anpassa hanteringen av data som läses från eller skrivs till strömmen. Den släpptes till omvärlden 1997, och den senaste utgåvan var 1 februari 2005.
Se även
Referenser
externa länkar
-
Media relaterat till C -filinmatning/-utmatning på Wikimedia Commons