Filhåndtering i C - Sådan åbnes, lukkes og skrives til filer

Hvis du har skrevet C- helloworldprogrammet før, kender du allerede grundlæggende fil I / O i C:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

Filhåndtering er en af ​​de vigtigste dele af programmeringen. I C bruger vi en strukturmarkør af en filtype til at erklære en fil:

FILE *fp;

C giver et antal indbyggede funktioner til at udføre grundlæggende filhandlinger:

  • fopen() - Opret en ny fil eller åbn en eksisterende fil
  • fclose() - luk en fil
  • getc() - læser et tegn fra en fil
  • putc() - skriver et tegn til en fil
  • fscanf() - læser et sæt data fra en fil
  • fprintf() - skriver et sæt data til en fil
  • getw() - læser et heltal fra en fil
  • putw() - skriver et heltal til en fil
  • fseek() - indstil positionen til ønsket punkt
  • ftell() - giver den aktuelle position i filen
  • rewind() - indstil positionen til startpunktet

Åbning af en fil

Den fopen()funktion bruges til at oprette en fil eller åbne en eksisterende fil:

fp = fopen(const char filename,const char mode);

Der er mange tilstande til åbning af en fil:

  • r - åbn en fil i læsetilstand
  • w - åbner eller opretter en tekstfil i skrivetilstand
  • a - åbner en fil i tilføjelsestilstand
  • r+ - åbner en fil i både læse- og skrivetilstand
  • a+ - åbner en fil i både læse- og skrivetilstand
  • w+ - åbner en fil i både læse- og skrivetilstand

Her er et eksempel på at læse data fra en fil og skrive til den:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

Nu tænker du måske, "Dette udskriver bare tekst til skærmen. Hvordan er denne fil IO?"

Svaret er ikke indlysende i starten og har brug for en vis forståelse af UNIX-systemet. I et UNIX-system behandles alt som en fil, hvilket betyder at du kan læse fra og skrive til den.

Det betyder, at din printer kan abstraheres som en fil, da alt hvad du gør med en printer er at skrive med den. Det er også nyttigt at tænke på disse filer som streams, da som du kan se senere, kan du omdirigere dem med skallen.

Så hvordan relaterer dette sig til helloworldog arkiverer IO?

Når du ringer printf, skriver du egentlig bare til en speciel fil kaldet stdout, forkortelse for standardoutput . stdoutrepræsenterer standardoutputtet som bestemt af din shell, som normalt er terminalen. Dette forklarer, hvorfor det blev trykt på din skærm.

Der er to andre streams (dvs. filer), der er tilgængelige for dig uden besvær, stdinog stderr. stdinrepræsenterer standardindgangen , som din shell normalt knytter til tastaturet. stderrrepræsenterer standardfejloutput , som din shell normalt knytter til terminalen.

Rudimentær fil IO, eller hvordan jeg lærte at lægge rør

Nok teori, lad os komme i gang med at skrive en kode! Den nemmeste måde at skrive til en fil på er at omdirigere outputstrømmen ved hjælp af output omdirigeringsværktøjet >.

Hvis du vil tilføje, kan du bruge >>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

Indholdet af hello.txtvil ikke overraskende være

Hello, world!

Sig, at vi har et andet program greet, der ligner det helloworld, der byder dig velkommen med et givet name:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

I stedet for at læse fra tastaturet kan vi omdirigere stdintil at læse fra en fil ved hjælp af <værktøjet:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

Bemærk: disse omdirigeringsoperatører er i bashog lignende skaller.

Den rigtige aftale

Ovenstående metoder fungerede kun i de mest basale tilfælde. Hvis du ville gøre større og bedre ting, vil du sandsynligvis arbejde med filer fra C i stedet for gennem skallen.

For at opnå dette skal du bruge en funktion kaldet fopen. Denne funktion tager to strengparametre, den første er filnavnet og den anden er tilstanden.

Tilstanden er dybest set tilladelser, så rfor læsning, wfor skrivning, afor tilføjelse. Du kan også kombinere dem, så det rwville betyde, at du kunne læse og skrive til filen. Der er flere tilstande, men disse er de mest anvendte.

Når du har en FILEmarkør, kan du stort set bruge de samme IO-kommandoer, som du ville have brugt, bortset fra at du skal prefikse dem med, fog det første argument vil være filmarkøren. For eksempel printfer filversionen fprintf.

Her er et program kaldet, greetingsder læser en fra en fil, der indeholder en liste med navne og skriver hilsener til en anden fil:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

Antag, names.txtindeholder følgende:

Kamala Logan Carol

Derefter vil greetingsfilen efter kørsel greet.txtindeholde:

Hello, Kamala! Hello, Logan! Hello, Carol!