C-programmeringssproget understøtter mange standard biblioteksfunktioner til filinput og -output . Disse funktioner danner grundlaget for C-standardbibliotekets header-fil . <stdio.h>
C-sprogets I/O-funktionalitet er implementeret på et lavt niveau efter nuværende standarder. C-sproget abstraherer alle filoperationer til operationer på bytestrømme , som enten kan være "inputstrømme" eller "outputstrømme". I modsætning til nogle tidlige programmeringssprog understøtter C-sproget ikke direkte tilfældig adgang til datafiler; for at læse den skrevne information i midten af filen, skal programmøren oprette en strøm, der ser ud i midten af filen og derefter læse bytes fra strømmen i rækkefølge.
Streaming-fil I/O-modellen blev for en stor del populariseret af Unix -operativsystemet skrevet i C. Meget af funktionaliteten i moderne operativsystemer har arvet streams fra Unix, og mange sprog i C-programmeringssprogfamilien har arvet C-fil I/O-grænsefladen med mindre forskelle (f.eks. PHP ). C++ Standardbiblioteket afspejler streamingkonceptet i dets syntaks (se iostream ).
Filen åbnes ved hjælp af funktionen fopen, som returnerer information om I/O -strømmen, der er knyttet til den angivne fil eller anden enhed, der læses fra (eller skrives til). Ved fejl returnerer funktionen en nul-pointer .
En lignende freopenC-biblioteksfunktion udfører en lignende operation efter den første lukning af enhver åben strøm forbundet med dens parametre.
De annonceres som
FIL * fopen ( const char * path , const char * mode ); FILE * freopen ( const char * path , const char * mode , FILE * fp );Funktionen er i det væsentlige en "indpakning" for et systemkaldfopen på højere niveau af Unix -operativsystemet . Ligeledes er det en indpakning omkring et Unix-systemkald , og selve C-sprogstrukturen refererer ofte til den tilsvarende Unix -fildeskriptor . I et POSIX - miljø kan en funktion bruges til at initialisere en struktur med en filbeskrivelse. Fildeskriptorer som et rent Unix-koncept er dog ikke repræsenteret i C-sprogstandarden. open fclosecloseFILEfdopenFILE
Parameteren mode(tilstand) for fopenog freopenskal være en streng og starte med en af følgende sekvenser:
mode | beskrivelse | starter med.. | ||
---|---|---|---|---|
r | rb | åbner for læsning | Start | |
w | wb | åbner til skrivning (opretter en fil, hvis den ikke findes). Sletter indholdet og overskriver filen. | Start | |
-en | ab | åbner for tilføjelse (opretter en fil, hvis den ikke findes) | ende | |
r+ | rb+ | r+b | åbner for læsning og skrivning | Start |
w+ | wb+ | w+b | åbner for læsning og skrivning. Sletter indholdet og overskriver filen. | Start |
a+ | ab+ | a+b | åbner for læsning og skrivning (opretter en fil, hvis den ikke findes) | ende |
Værdien " b " er reserveret til C binær tilstand. C-sprogstandarden definerer to slags filer - tekst og binær - selvom operativsystemet ikke kræver, at du skelner mellem dem (men for nogle compilere, såsom LCC , specificerer 'b', når du arbejder med en binær fil er fundamentalt vigtig!). En tekstfil er en fil, der indeholder tekst opdelt i linjer af et eller andet afgrænsende linjeafslutningstegn eller sekvens (på Unix , et enkelt linjeskift \n; på Microsoft Windows efterfølges et linjeskift af et vognretur ) \r\n. Når du læser bytes fra en tekstfil, forbindes (erstattes) ende-af-linje-tegn normalt med nye linjer for at forenkle behandlingen. Når du skriver en tekstfil, forbindes (erstattes) et enkelt linjeskifttegn med en OS-specifik sekvens af ende-på-linje-tegn før skrivning. En binær fil er en fil, hvorfra bytes læses og udlæses i en "rå" form uden nogen kobling (substitution).
Når en fil åbnes i opdateringstilstand (' + ' som det andet eller tredje tegn i tilstandsdesignatorargumentet), kan både input og output udføres på den samme tråd. En skrivning kan dog ikke følge en læsning uden et mellemkald fflusheller en filpositionsfunktion ( fseek, fsetposeller rewind), og en læsning kan ikke følge en skrivning uden et mellemkald til filpositionsfunktionen. [en]
Skrive- og tilføjelsestilstande forsøger at oprette en fil med det givne navn, hvis der ikke allerede findes en sådan fil. Som nævnt ovenfor, hvis denne handling mislykkes, fopenreturnerer NULL.
Funktionen fclosekræver ét argument: en pegepind til strømstrukturen for FILEat lukke.
int fclose ( FILE * fp );Funktionen returnerer nul ved succes og EOF ved fiasko. Når programmet afsluttes normalt, kaldes funktionen automatisk for hver åben fil.
Funktionen fgetcbruges til at læse et tegn fra strømmen.
int fgetc ( FILE * fp );Hvis det lykkes fgetc, returnerer den næste byte eller tegn fra strømmen (afhængigt af om filen er "binær" eller "tekst" som diskuteret ovenfor). Ellers fgetcvender tilbage EOF. (En bestemt type fejl kan identificeres ved et opkald ferroreller feofmed en filmarkør.)
En standardmakro er også defineret i , der fungerer med succes som , bortset fra én ting: da den er en makro, kan den behandle sine argumenter mere end én gang . getc<stdio.h>fgetc
Standardfunktionen getcharer også defineret i <stdio.h>, den tager ingen argumenter og svarer til . getc(stdin)
"Trap" EOFEn almindelig fejl er at bruge fgetc, getceller getcharat tildele resultatet til en typevariabel, char før den sammenlignes med EOF. Følgende kodefragment viser denne fejl, og den korrekte version vises ved siden af:
Fejl | Korrekt |
---|---|
char c ; while (( c = getchar ()) != EOF ) { putchar ( c ); } | int c ; while (( c = getchar ()) != EOF ) { putchar ( c ); } |
Overvej et system, hvor en type char, der er 8 bit lang (specifikt x86 -arkitekturen ) repræsenterer 256 forskellige værdier. getcharkan returnere et hvilket som helst af de 256 mulige tegn, og kan også vende tilbage EOFfor at angive slutningen af filen, hvis værdi ikke kan matche nogen af værdierne af char.
Når resultatet getchartildeles en variabel af typen char, som kun kan repræsentere 256 forskellige værdier, er der et tvungent tab af information - når 257 værdier komprimeres til 256 "steder" , sker der en kollision . Værdien, EOFnår den konverteres til char, kan ikke skelnes fra nogen af de andre 256 tegn. Hvis dette tegn findes i en fil, kan koden ovenfor tage det som en slutning af filen, eller værre, hvis typen char er usigneret, så givet at EOF - er en negativ værdi, kan den aldrig være lig med nogen usigneret char. og dermed eksemplet ovenfor ender ikke ved filafslutningsmærket, men vil køre for evigt og genudskrive tegnet, der er resultatet af konverteringen EOFtil char.
I systemer hvor intog charer af samme størrelse[ hvad? ] , selv den "korrekte" version vil ikke fungere korrekt på grund af ligheden EOFog en anden karakter. Den korrekte måde at håndtere denne situation på er at kontrollere feofog ferrorefter at den getcharvender tilbage EOF. Hvis feofden opdager, at slutningen af filen endnu ikke er nået, men ferror"rapporterer", at der ikke er nogen fejl, så kan det EOFreturnerede getcharbetragtes som det aktuelle tegn. Sådanne ekstra kontroller udføres sjældent, da de fleste programmører antager, at deres kode aldrig vil køre på sådanne "store char" systemer. En anden måde er at bruge en kompileringstidskontrol, UINT_MAX > UCHAR_MAXder i det mindste forhindrer kompilering på sådanne systemer.
Funktionen fgetsbruges til at læse en streng fra en strøm. Aflæsningen fortsætter, indtil enten slutningen af linjen ( hex :0D0A, svarende til \n i lister ) eller længden af linjen, der læses ind, er nået. Antag, at vi har some_file.txt -fil med tekst
palindromer Og i Yenisei - blå. Og lamaen er lille. Og ræven, han er klog - rotten bar ost til ham. (I. Babitsky) #include <stdio.h> #include <string.h> int main ( int argc , char * argv []) /* argc gemmer antallet af parametre, og argv[] peger på disse parametre. For eksempel, hvis vi kører den eksekverbare "fgets_example param1 param2", så vil argc være lig med 3, og argv[] = { "fgets_example" , "param1" , "param2" } */ { FILE * fil ; char * fname = "noget_file.txt" ; char resultatstreng [ 20 ]; //Streng på 20 tegn fil = fopen ( fnavn , "r" ); if ( fil == NULL ) { printf ( "kan ikke åbne filen '%s'" , fname ); returnere 0 ; } int i = 0 ; char * real_tail ; while ( fgets ( resultatstreng , størrelse på ( resultatstreng ), fil )) { real_tail = "" ; printf ( "String %d:String length - %d:" , i ++ , strlen ( result_string )); if ( result_string [ strlen ( result_string ) -1 ] == '\n' ) // tjek om det sidste element i strengen er sluttegnet { real_tail = " \\ n" ; result_string [ strlen ( result_string ) -1 ] = '\0' ; }; // denne del af koden blev kun tilføjet for at vise end-of-line-tegnet i konsollen uden en newline printf ( "%s%s \n " , result_string , real_tail ); } fclose ( fil ); returnere 0 ; }som følge af udførelse vil vi få
Linje 0: Linjelængde - 11:palindromer\n Linje 1: Linjelængde - 19: Og i Yenisei - si Linje 2: Linjelængde - 6:neva.\n Linje 3: Linjens længde er 17: Og lamaen er lille.\n Linje 4: Linjelængde - 19: En ræv, han er smart Linje 5: Linjelængde - 19: - rotteost til den Linje 6: Linjelængde - 19: slidt. (I. Babitsky Linje 7: Linjelængde - 2:e)Strlen - funktionen bestemmer længden af en streng med antallet af tegn op til '\0', for eksempel:
printf ( "%d" , strlen ( "123 \0 123" )); //output 4I programmeringssproget C implementerer funktionerne freadhenholdsvis filinput og -output . og erklæret i . fwritefreadfwrite <stdio.h>
fwrite er defineret som
int fwrite ( const char * array , size_t size , size_t count , FILE * stream );Funktionen fwriteskriver en blok af data til strømmen. Dette vil skrive en række elementer arraytil den aktuelle position i strømmen. sizeEn byte vil blive skrevet for hvert element . Strømpositionsindikatoren vil ændre sig til antallet af bytes skrevet med succes. Returværdien vil være lig countmed, hvis skrivningen er gennemført. I tilfælde af fejl vil returværdien være mindre end count.
Det følgende program åbner et eksempel på en .txt -fil , skriver en tegnstreng til den og lukker den derefter.
#include <stdio.h> #include <string.h> #include <stdlib.h> int main ( ugyldig ) { FIL * fp ; størrelse_t antal ; char const * str = "hej \n " ; fp = fopen ( "eksempel.txt" , "wb" ); if ( fp == NULL ) { perror ( "fejl ved åbning af eksempel.txt" ); returner EXIT_FAILURE ; } tælle = fwrite ( str , sizeof ( char ), strlen ( str ), fp ); printf ( "%lu bytes skrevet. fclose(fp) %s. \n " , ( usigned long ) count , fclose ( fp ) == 0 ? "success" : "fejl" ); fluk ( fp ); returnere 0 ; }Funktionen fputcbruges til at skrive et tegn til streamen.
int fputc ( int c , FIL * fp );Den clydløse indstilling konverteres til unsigned charfør output. Hvis det lykkes, fputcreturnerer det det skrevne tegn. Hvis en fejl, så fputcreturnerer EOF.
En standardmakro putcer også defineret i <stdio.h>, der fungerer på samme måde generelt fputc, bortset fra at den som makro kan behandle sine argumenter mere end én gang.
Standardfunktionen putchar, også defineret i <stdio.h>, tager kun det første argument og svarer til , hvor er argumentet nævnt. putc(c, stdout)c
Det følgende C-program åbner en binær fil ved navn myfile , læser fem bytes fra den og lukker derefter filen.
#include <stdio.h> #include <stdlib.h> int main ( ugyldig ) { charbuffer [ 5 ] = { 0 } ; /* initialiser med nuller */ int i , rc ; FIL * fp = fopen ( "minfil" , "rb" ); if ( fp == NULL ) { perror ( "Fejl ved åbning af \" min fil \" " ); returner EXIT_FAILURE ; } for ( i = 0 ; ( rc = getc ( fp )) != EOF && i < 5 ; buffer [ i ++ ] = rc ); fluk ( fp ); if ( i == 5 ) { puts ( "Bytes læst..." ); printf ( "%x %x %x %x %x \n " , buffer [ 0 ], buffer [ 1 ], buffer [ 2 ], buffer [ 3 ], buffer [ 4 ]); } andet fputs ( "Fejl ved læsning af fil. \n " , stderr ); returner EXIT_SUCCESS ; }