Dacă ai scris C helloworld programul anterior, știți deja fișierul I / O de bază în C:

/* A simple hello world in C. */
#include <stdlib.h>

// Import IO functions.
#include <stdio.h>

int main() {
    // This printf is where all the file IO magic happens!
    // How exciting!
    printf("Hello, world!n");
    return EXIT_SUCCESS;
}

Gestionarea fișierelor este una dintre cele mai importante părți ale programării. În C, folosim un indicator de structură de tip fișier pentru a declara un fișier:

FILE *fp;

C oferă o serie de funcții integrate pentru efectuarea operațiilor de bază ale fișierului:

  • fopen() – creați un fișier nou sau deschideți un fișier existent
  • fclose() – închideți un fișier
  • getc() – citește un caracter dintr-un fișier
  • putc() – scrie un caracter într-un fișier
  • fscanf() – citește un set de date dintr-un fișier
  • fprintf() – scrie un set de date într-un fișier
  • getw() – citește un număr întreg dintr-un fișier
  • putw() – scrie un număr întreg într-un fișier
  • fseek() – setați poziția la punctul dorit
  • ftell() – oferă poziția curentă în fișier
  • rewind() – setați poziția la punctul de început

Deschiderea unui fișier

fopen() funcția este utilizată pentru a crea un fișier sau a deschide un fișier existent:

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

Există mai multe moduri pentru deschiderea unui fișier:

  • r – deschideți un fișier în modul de citire
  • w – deschide sau creează un fișier text în modul de scriere
  • a – deschide un fișier în modul de adăugare
  • r+ – deschide un fișier atât în ​​modul citire cât și în scriere
  • a+ – deschide un fișier atât în ​​modul citire cât și în scriere
  • w+ – deschide un fișier atât în ​​modul citire cât și în scriere

Iată un exemplu de citire a datelor dintr-un fișier și scriere în acesta:

#include<stdio.h>
#include<conio.h>
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);
}

Acum s-ar putea să vă gândiți: „Aceasta tipărește doar text pe ecran. Cum este acest fișier IO?”

Răspunsul nu este evident la început și are nevoie de o oarecare înțelegere despre sistemul UNIX. Într-un sistem UNIX, totul este tratat ca un fișier, ceea ce înseamnă că puteți citi și scrie pe el.

Aceasta înseamnă că imprimanta dvs. poate fi abstractizată ca fișier, deoarece tot ce faceți cu o imprimantă este să scrieți cu ea. De asemenea, este util să vă gândiți la aceste fișiere ca la fluxuri, deoarece așa cum veți vedea mai târziu, le puteți redirecționa cu shell-ul.

Deci, ce legătură are acest lucru helloworld și fișier IO?

Când suni printf, chiar scrieți într-un fișier special numit stdout, scurt pentru ieșire standard. stdout reprezintă ieșirea standard așa cum este decisă de shell-ul dvs., care este de obicei terminalul. Acest lucru explică de ce a fost tipărit pe ecran.

Există alte două fluxuri (adică fișiere) care vă sunt disponibile cu efort, stdin și stderr. stdin reprezintă intrare standard, pe care shell-ul dvs. îl atașează de obicei la tastatură. stderr reprezintă eroare standard , pe care shell-ul dvs. îl atașează de obicei la terminal.

Rudimentary File IO sau Cum am învățat să așez țevi

Destul de teorie, să trecem la treabă scriind un cod! Cel mai simplu mod de a scrie într-un fișier este să redirecționați fluxul de ieșire utilizând instrumentul de redirecționare a ieșirii, >.

Dacă doriți să adăugați, puteți utiliza >>:

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

Conținutul hello.txt nu va fi surprinzător

Hello, world!

Să presupunem că avem un alt program numit greet, similar cu helloworld, care te întâmpină cu un dat name:

#include <stdio.h>
#include <stdlib.h>

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

În loc să citim de la tastatură, putem redirecționa stdin pentru a citi dintr-un fișier folosind < instrument:

# 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 < name.txt
# ==> Hello, Kamala!
# If you wanted to also write the greeting to a file, you could do so using ">".

Notă: acești operatori de redirecționare sunt în bash și scoici similare.

Adevărata afacere

Metodele de mai sus au funcționat doar pentru cele mai simple cazuri. Dacă ați dorit să faceți lucruri mai mari și mai bune, probabil că veți dori să lucrați cu fișiere din interiorul C în loc de prin shell.

Pentru a realiza acest lucru, veți utiliza o funcție numită fopen. Această funcție ia doi parametri șir, primul fiind numele fișierului și al doilea fiind modul.

Modul este practic permisiuni, deci r pentru citit, w pentru scris, a pentru anexa. Le puteți combina și așa rw ar însemna că puteți citi și scrie în fișier. Există mai multe moduri, dar acestea sunt cele mai frecvent utilizate.

După ce ai un FILE pointer, puteți utiliza practic aceleași comenzi IO pe care le-ați fi folosit, cu excepția faptului că trebuie să le prefixați cu f iar primul argument va fi indicatorul fișierului. De exemplu, printfversiunea fișierului este fprintf.

Iată un program numit greetings care citește un dintr-un fișier care conține o listă de nume și scrie salutările într-un alt fișier:

#include <stdio.h>
#include <stdlib.h>

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, "%sn", 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;
}

Presupune names.txt conține următoarele:

Kamala
Logan
Carol

Apoi, după alergare greetings fișierul greet.txt va conține:

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