Fájlkezelés C-ben - Hogyan lehet megnyitni, bezárni és fájlba írni

Ha korábban megírta a C helloworldprogramot, akkor már ismeri az I / O alapfájlokat a C nyelven:

/* 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; }

A fájlkezelés a programozás egyik legfontosabb része. A C fájlban egy fájltípus struktúra mutatóját használjuk a fájl deklarálásához:

FILE *fp;

A C számos beépített funkciót biztosít az alapvető fájlműveletek végrehajtásához:

  • fopen() - hozzon létre egy új fájlt, vagy nyisson meg egy meglévő fájlt
  • fclose() - bezár egy fájlt
  • getc() - felolvas egy karaktert egy fájlból
  • putc() - ír egy karaktert egy fájlba
  • fscanf() - felolvas egy állományt egy fájlból
  • fprintf() - adatsort ír egy fájlba
  • getw() - egy egész számot olvas ki egy fájlból
  • putw() - egész számot ír egy fájlba
  • fseek() - állítsa a helyzetet a vágy pontra
  • ftell() - megadja az aktuális pozíciót a fájlban
  • rewind() - állítsa a pozíciót a kezdőpontra

Fájl megnyitása

A fopen()függvény egy fájl létrehozására vagy egy meglévő fájl megnyitására szolgál:

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

A fájl megnyitásának számos módja van:

  • r - fájl megnyitása olvasási módban
  • w - szöveges fájlt nyit vagy hoz létre írási módban
  • a - megnyit egy fájlt függelék módban
  • r+ - megnyit egy fájlt olvasási és írási módban egyaránt
  • a+ - megnyit egy fájlt olvasási és írási módban egyaránt
  • w+ - megnyit egy fájlt olvasási és írási módban egyaránt

Íme egy példa az adatok beolvasására egy fájlból és írásra:

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

Most azt gondolhatja: "Ez csak szöveget nyomtat a képernyőre. Hogy van ez a fájl IO?"

A válasz eleinte nem nyilvánvaló, és némi megértésre van szüksége a UNIX rendszerrel kapcsolatban. A UNIX rendszerben mindent fájlként kezelnek, vagyis olvashat róla és írhat rá.

Ez azt jelenti, hogy a nyomtató fájlként kivonható, mivel a nyomtatóval csak annyit tesz, hogy vele ír. Hasznos ezeket a fájlokat streamként is elképzelni, mivel amint később látni fogja, a shell segítségével irányíthatja át őket.

Tehát hogyan kapcsolódik ez az helloworldIO- hoz és iktatja be?

Híváskor printfvalóban csak egy speciális fájlba ír, amelyet stdouta szabványos kimenetnek nevezünk . stdouta standard kimenetet képviseli, amint azt a shelled dönti el, amely általában a terminál. Ez megmagyarázza, miért nyomtatta ki a képernyőn.

Két további adatfolyam (azaz fájl) áll rendelkezésére, erőfeszítéssel, stdinés stderr. stdina standard bemenetet jelenti , amelyet a shell általában a billentyűzethez csatol. stderra szabványos hibakimenetet jelenti , amelyet a shell általában a terminálhoz csatol.

Elsődleges File IO, avagy hogyan tanultam meg a csöveket

Elég az elmélet, kezdjünk bele az üzletbe egy kód megírásával! A legegyszerűbb módja, hogy írjon egy fájlt, hogy irányítsák át a kimeneti stream segítségével a kimeneti átirányítás eszköz >.

Ha hozzá szeretné fűzni, használhatja >>:

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

Az hello.txtakarat tartalma nem meglepő módon az

Hello, world!

Tegyük fel, hogy van egy másik programunk, az úgynevezett greet, amely hasonlóval helloworldfogad 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; }

A billentyűzetről történő olvasás helyett átirányíthatjuk stdinaz olvasást egy fájlból az <eszköz segítségével:

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

Megjegyzés: ezek az átirányítási operátorok bashhasonló héjakban vannak.

Az igazi üzlet

A fenti módszerek csak a legalapvetőbb esetekben működtek. Ha nagyobb és jobb dolgokat akartál csinálni, akkor valószínűleg a C-n belüli fájlokkal akarsz dolgozni, nem pedig a shellen keresztül.

Ennek megvalósításához az úgynevezett függvényt fogja használni fopen. Ez a függvény két karakterlánc-paramétert igényel, az első a fájlnév, a másik pedig a mód.

A mód alapvetően engedélyek, tehát rolvasáshoz, wíráshoz, afüggelékhez. Kombinálhatja őket is, ez rwazt jelentené, hogy olvashat és írhat a fájlba. Van több mód, de ezek a leggyakrabban használtak.

Miután megvan egy FILEmutató, alapvetően ugyanazokat az IO parancsokat használhatja, amelyeket használt volna, azzal a különbséggel, hogy előtaggal kell ellátnia őket, fés az első argumentum a fájlmutató lesz. Például a printffájl verziója a fprintf.

Itt van egy úgynevezett program greetings, amely a névlistát tartalmazó fájlból olvas egy a-t, és egy másik fájlba írja az üdvözletet:

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

Tegyük fel, hogy names.txta következőket tartalmazza:

Kamala Logan Carol

Ezután greetingsa fájl futtatása után a greet.txtkövetkezőket tartalmazza:

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