Failikäitlus C-s - kuidas faile avada, sulgeda ja failidesse kirjutada

Kui olete C- helloworldprogrammi varem kirjutanud , teate juba põhifaili I / O kaustas 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; }

Failikäsitlus on programmeerimise üks olulisemaid osi. C-s kasutame faili deklareerimiseks failitüübi struktuurikursorit:

FILE *fp;

C pakub failide põhitoimingute teostamiseks mitmeid sisseehitatud funktsioone:

  • fopen() - luua uus fail või avada olemasolev fail
  • fclose() - sulgege fail
  • getc() - loeb failist märki
  • putc() - kirjutab tähemärgi faili
  • fscanf() - loeb failist andmete kogumit
  • fprintf() - kirjutab faili andmete kogumi
  • getw() - loeb failist täisarvu
  • putw() - kirjutab faili täisarvu
  • fseek() - seadke positsioon soovipunktiks
  • ftell() - annab failis praeguse positsiooni
  • rewind() - määrake asukoht alguspunkti

Faili avamine

fopen()Funktsiooni kasutatakse, et luua faili või avada olemasoleva faili:

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

Faili avamiseks on palju režiime:

  • r - avage fail lugemisrežiimis
  • w - avab või loob tekstifaili kirjutusrežiimis
  • a - avab faili liitmisrežiimis
  • r+ - avab faili nii lugemis- kui ka kirjutamisrežiimis
  • a+ - avab faili nii lugemis- kui ka kirjutamisrežiimis
  • w+ - avab faili nii lugemis- kui ka kirjutamisrežiimis

Siin on näide failist andmete lugemise ja sinna kirjutamise kohta:

#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); }

Nüüd võite mõelda: "See prindib lihtsalt teksti ekraanile. Kuidas see fail IO on?"

Vastus pole esialgu ilmne ja vajab UNIX-süsteemi mõistmist. UNIX-süsteemis käsitletakse kõike failina, mis tähendab, et saate sellest lugeda ja sinna kirjutada.

See tähendab, et teie printeri saab failina abstraktseks muuta, kuna printeriga kirjutate vaid sellega. Samuti on kasulik mõelda nendest failidest voogudena, kuna nagu hiljem näete, saate need koos kestaga ümber suunata.

Niisiis, kuidas see on seotud helloworldja faili IO?

Helistades printfkirjutate tegelikult lihtsalt spetsiaalsesse faili nimega stdout, mis on lühike standardväljundiks . stdouttähistab standardset väljundit, mille otsustab teie kest, mis on tavaliselt terminal. See seletab, miks see teie ekraanile printis.

On veel kaks voogu (st faili), mis on teile jõupingutustega kättesaadavad stdinja stderr. stdintähistab standardsisendit , mille teie shell tavaliselt klaviatuurile kinnitab. stderrtähistab standardset veaväljundit , mille teie shell tavaliselt terminali külge kinnitab.

Algeline faili IO ehk kuidas ma õppisin torusid panema

Aitab teooriast, asume asja juurde, kirjutades mingi koodi! Lihtsaim viis faili kirjutamiseks on väljundvoo ümbersuunamine väljundi ümbersuunamise tööriista abil >.

Kui soovite lisada, võite kasutada >>järgmist.

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

Tahe sisu hello.txtpole üllatav

Hello, world!

Oletame, et meil on veel üks greetsarnane programm nimega helloworld, mis tervitab teid etteantud funktsiooniga 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; }

Klaviatuurilt lugemise asemel saame tööriista abil stdinfailist lugemise suunata <:

# 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 ">".

Märkus: need ümbersuunamisoperaatorid on bashkestades ja sarnased kestad.

Tegelik tehing

Ülaltoodud meetodid töötasid ainult kõige elementaarsematel juhtudel. Kui tahtsite teha suuremaid ja paremaid asju, siis soovite tõenäoliselt töötada kestaga mitte C-i failidega.

Selle saavutamiseks kasutate funktsiooni nimega fopen. See funktsioon võtab kaks stringiparameetrit, millest esimene on failinimi ja teine ​​režiim.

Režiim on põhimõtteliselt õigused, nii rlugemiseks, wkirjutamiseks kui aka lisamiseks. Saate neid ka kombineerida, rwsee tähendaks, et saaksite faili lugeda ja sinna kirjutada. Režiime on rohkem, kuid neid kasutatakse kõige sagedamini.

Pärast FILEkursori olemasolu saate kasutada põhimõtteliselt samu IO-käske, mida oleksite kasutanud, välja arvatud see, et peate neid eesliitma fja esimene argument on faili kursor. Näiteks printfon faili versioon fprintf.

Siin on programm nimega, greetingsmis loeb nimede loendit sisaldavast failist a ja kirjutab tervitused teise faili:

#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; }

Oletame, et names.txtsisaldab järgmist:

Kamala Logan Carol

Seejärel sisaldab greetingsfail pärast käivitamist järgmist greet.txt:

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