Ha korábban megírta a C helloworld
programot, 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ájltfclose()
- bezár egy fájltgetc()
- felolvas egy karaktert egy fájlbólputc()
- ír egy karaktert egy fájlbafscanf()
- felolvas egy állományt egy fájlbólfprintf()
- adatsort ír egy fájlbagetw()
- egy egész számot olvas ki egy fájlbólputw()
- egész számot ír egy fájlbafseek()
- állítsa a helyzetet a vágy pontraftell()
- megadja az aktuális pozíciót a fájlbanrewind()
- á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ódbanw
- szöveges fájlt nyit vagy hoz létre írási módbana
- megnyit egy fájlt függelék módbanr+
- megnyit egy fájlt olvasási és írási módban egyaránta+
- megnyit egy fájlt olvasási és írási módban egyarántw+
- 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 helloworld
IO- hoz és iktatja be?
Híváskor printf
valóban csak egy speciális fájlba ír, amelyet stdout
a szabványos kimenetnek nevezünk . stdout
a 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
. stdin
a standard bemenetet jelenti , amelyet a shell általában a billentyűzethez csatol. stderr
a 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.txt
akarat tartalma nem meglepő módon az
Hello, world!
Tegyük fel, hogy van egy másik programunk, az úgynevezett greet
, amely hasonlóval helloworld
fogad 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 stdin
az 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 bash
hasonló 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 r
olvasáshoz, w
íráshoz, a
függelékhez. Kombinálhatja őket is, ez rw
azt jelentené, hogy olvashat és írhat a fájlba. Van több mód, de ezek a leggyakrabban használtak.
Miután megvan egy FILE
mutató, 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 printf
fá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.txt
a következőket tartalmazza:
Kamala Logan Carol
Ezután greetings
a fájl futtatása után a greet.txt
következőket tartalmazza:
Hello, Kamala! Hello, Logan! Hello, Carol!