Failų tvarkymas C - kaip atidaryti, uždaryti ir rašyti į failus

Jei jau parašėte C helloworldprogramą anksčiau, jūs jau žinote pagrindinį failo įvestį / išvestį 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; }

Failų tvarkymas yra viena iš svarbiausių programavimo dalių. C, failui deklaruoti naudojame failo tipo struktūros rodyklę:

FILE *fp;

C suteikia daugybę integruotų funkcijų pagrindinėms failo operacijoms atlikti:

  • fopen() - sukurti naują failą arba atidaryti esamą failą
  • fclose() - uždaryti failą
  • getc() - skaito simbolį iš bylos
  • putc() - rašo personažą į bylą
  • fscanf() - nuskaito duomenų rinkinį iš bylos
  • fprintf() - įrašo duomenų rinkinį į bylą
  • getw() - nuskaito iš failo sveikąjį skaičių
  • putw() - faile įrašo sveiką skaičių
  • fseek() - nustatykite norimą tašką
  • ftell() - pateikia dabartinę padėtį byloje
  • rewind() - nustatykite padėtį į pradinį tašką

Failo atidarymas

fopen()Funkcija naudojama sukurti failą arba atidarykite esamą failą:

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

Yra daug failo atidarymo režimų:

  • r atidaryti failą skaitymo režimu
  • w - atidaro arba sukuria teksto failą rašymo režimu
  • a - atidaro failą pridėjimo režimu
  • r+ - atidaro failą tiek skaitymo, tiek rašymo režimu
  • a+ - atidaro failą tiek skaitymo, tiek rašymo režimu
  • w+ - atidaro failą tiek skaitymo, tiek rašymo režimu

Štai pavyzdys, kaip skaityti duomenis iš failo ir rašyti į jį:

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

Dabar galite galvoti: "Tai tiesiog spausdina tekstą į ekraną. Kaip yra šis failas IO?"

Iš pradžių atsakymas nėra akivaizdus ir jį reikia šiek tiek suprasti apie UNIX sistemą. UNIX sistemoje viskas traktuojama kaip failas, o tai reiškia, kad galite iš jo skaityti ir rašyti.

Tai reiškia, kad jūsų spausdintuvą galima suskaidyti kaip failą, nes viskas, ką darote su spausdintuvu, yra tik rašymas juo. Taip pat naudinga galvoti apie šiuos failus kaip apie srautus, nes, kaip pamatysite vėliau, galite juos nukreipti su apvalkalu.

Taigi, kaip tai susiję helloworldir pateikiama IO?

Kai skambinate printf, jūs iš tikrųjų tiesiog rašote į specialų failą, vadinamą stdout, sutrumpintą standartiniam išėjimui . stdoutreiškia standartinę išvestį, kurią nusprendžia jūsų apvalkalas, kuris paprastai yra terminalas. Tai paaiškina, kodėl ji spausdinta į jūsų ekraną.

Yra dar du srautai (ty failai), kurie jums prieinami su pastangomis, stdinir stderr. stdinreiškia standartinį įvestį , kurį jūsų apvalkalas paprastai pritvirtina prie klaviatūros. stderrreiškia standartinę klaidos išvestį, kurią jūsų apvalkalas paprastai pritvirtina prie terminalo.

Pradinis failo IO arba „Kaip aš išmokau dėti vamzdžius“

Užteks teorijos, imkimės reikalo, parašę kodą! Lengviausias būdas rašyti į failą yra nukreipti išvesties srautą naudojant išvesties peradresavimo įrankį >.

Jei norite pridėti, galite naudoti >>:

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

hello.txtNenuostabu, kad valios turinys bus

Hello, world!

Tarkime, kad turime dar vieną programą, vadinamą greetpanašią helloworld, kuri sveikina jus su duotu 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; }

Užuot stdinskaitę iš klaviatūros, galime peradresuoti skaityti iš failo naudodami <įrankį:

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

Pastaba: šie peradresavimo operatoriai yra bashir panašiuose apvalkaluose.

Tikras reikalas

Minėti metodai pasiteisino tik pačiais paprasčiausiais atvejais. Jei norėtumėte padaryti didesnius ir geresnius dalykus, tikriausiai norėsite dirbti su failais iš C, o ne per apvalkalą.

Norėdami tai pasiekti, naudosite funkciją, vadinamą fopen. Šiai funkcijai reikalingi du eilutės parametrai, iš kurių pirmasis yra failo pavadinimas, o antrasis - režimas.

Režimas iš esmės yra leidimai, todėl rskaityti, wrašyti, apridėti. Taip pat galite juos sujungti, rwtai reikštų, kad galėtumėte skaityti ir rašyti į failą. Režimų yra ir daugiau, tačiau jie dažniausiai naudojami.

Gavę FILEžymeklį, galite naudoti iš esmės tas pačias IO komandas, kurias naudojote, išskyrus tai, kad turite jas įvesti prieš fir pirmasis argumentas bus failo žymeklis. Pvz., printfFailo versija yra fprintf.

Štai programa, vadinama, greetingskuri nuskaito a iš failo, kuriame yra vardų sąrašas, ir parašo sveikinimus į kitą failą:

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

Tarkime, names.txtyra:

Kamala Logan Carol

Tada paleidus greetingsfailą greet.txtbus:

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