C filinmatning/utmatning - C file input/output

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
får 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

Stdstreams-notitle.svg

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