C scrierea într-un fișier text. Lucrul cu fișiere în limbaj C

– comparație pentru a identifica egalitatea sau inegalitatea.

Scopul practic al unei enumerări este de a defini un set de constante simbolice distincte de tip întreg.

Un exemplu de utilizare a variabilelor enumerate:

mo=1, tu, we, th, fr, sa, su ) zile;

puts(“ Introduceți ziua săptămânii (de la 1 la 7) : ”); scanf(„%d”, &t_zi);

w_day = su; start = lună;

sfârşit = w_day -t_day;

printf(„\nLuni este %d zi a săptămânii, \acum este %d zi.\n\

Până la sfârșitul săptămânii %d zile (zile). ”, start, t_day, end);

Rezultatul programului: Introduceți ziua săptămânii (de la 1 la 7): 2

Luni este prima zi a săptămânii, acum este a 2-a zi. Mai sunt 5 zile (zile) până la sfârșitul săptămânii.

18. Fișiere în limbaj C

Un fișier este un set de date situat pe medii externe și luate în considerare în timpul procesării ca un întreg. Fișierele conțin date destinate stocării pe termen lung.

Există două tipuri de fișiere: text și binare. Fișierele text sunt o secvență de caractere ASCII și pot fi vizualizate și editate folosind orice editor de text.

Fișierele binare (binare) sunt o secvență de date, a căror structură este determinată de software.

Limbajul C are un set mare de funcții pentru lucrul cu fișiere, dintre care majoritatea se găsesc în bibliotecile stdio.h și io.h.

18.1. Deschiderea unui fișier

Fiecărui fișier i se atribuie un nume logic intern, care este folosit ulterior la accesarea acestuia. Numele logic (identificatorul fișierului) este

pointer către fișier, adică într-o zonă de memorie care conține toate informațiile necesare despre fișier. Formatul pentru declararea unui pointer către un fișier este următorul:

FIȘIER * pointer către fișier;

FILE – identificatorul tipului de structură descris în biblioteca standard

stdio.h și care conține următoarele informații:

tip struct(

– numărul de octeți necitiți rămași în buffer;

dimensiunea obișnuită a memoriei tampon este de 512 octeți; de îndată ce nivelul=0,

următorul bloc de date este citit în buffer din fișier;

– steag de stare a fișierului – citiți, scrieți, adăugați;

– descriptor de fișier, adică număr care definește numărul său

păstrare caracter nesemnat;

– caracter netransmis, i.e. ungetc-caracter;

– dimensiunea tamponului intermediar intern;

buffer de caracter nesemnat;

– valoarea pointerului pentru accesul în interiorul bufferului, adică

specifică începutul bufferului, începutul liniei sau valoarea curentă

Valoarea pointerului din interiorul bufferului depinde de mod

ma tamponare;

caracter nesemnat *curp;

– valoarea curentă a pointerului pentru acces în interiorul

fera, adică specifică poziția curentă în tamponul de schimb

mai departe cu programul;

istemp nesemnat;

– flag de fișier temporar;

– flag atunci când lucrați cu un fișier;

) DOSAR;

Înainte de a începe să lucrați cu fișierul, de ex. Pentru a putea citi sau scrie informații într-un fișier, acesta trebuie să fie deschis pentru acces. În acest scop, funcția este de obicei utilizată

FILE* fopen(char* nume_fișier, mod char*);

este nevoie de o reprezentare externă - numele fizic al unui fișier pe un mediu (dischetă, hard disk) și îl potrivește cu un nume logic.

Numele fizic, adică numele fișierului și calea către acesta sunt specificate de primul parametru

– o linie, de exemplu, „a:Mas_dat.dat” – un fișier numit Mas_dat.dat situat pe o dischetă, „d:\\work\\Sved.txt” – un fișier numit Sved.txt situat pe hard drive în directorul de lucru.

Atenţie! Bara oblică inversă (\), ca caracter special, este scrisă de două ori într-o linie.

La deschiderea cu succes, funcția fopen returnează un pointer către fișier (denumit în continuare indicatorul fișierului). În caz de eroare, este returnat NULL. Această situație apare de obicei atunci când calea către fișierul care urmează să fie deschis este specificată incorect. De exemplu, dacă în clasa de afișare a universității noastre specificați o cale care este interzisă pentru scriere (de obicei d:\work\ este permisă).

Al doilea parametru este o linie care specifică modul de acces la fișier:

w – dosarul este deschis pentru scriere; dacă nu există niciun fișier cu numele dat, acesta va fi creat; dacă un astfel de fișier există, atunci informațiile anterioare sunt distruse înainte de deschidere;

r – fișierul se deschide doar pentru citire; dacă nu există un astfel de fișier, apare o eroare;

a – fișierul este deschis pentru a adăuga informații noi până la sfârșit;

r+ – fișierul este deschis pentru editarea datelor – este posibilă atât scrierea, cât și citirea informațiilor;

w+ – la fel ca pentru r+;

a+ – la fel ca și pentru a, doar scrierea se poate face oriunde în fișier; citirea fișierelor este, de asemenea, disponibilă;

t – fișierul se deschide în modul text; b – fișierul se deschide în modul binar.

Modul text diferă de modul binar prin faptul că, atunci când un fișier este deschis ca text, perechea de caractere „line feed”, „carriage return” este înlocuită cu un singur caracter: „line feed” pentru toate funcțiile de scriere a datelor în fișier , iar pentru toate funcțiile de ieșire, caracterul „line feed” „ este acum înlocuit cu două caractere: „line feed”, „carriage return”.

În mod implicit, fișierul se deschide în modul text. Exemplu: FILE *f; – este declarat un pointer către fișierul f;

f = fopen("d:\\work\\Dat_sp.cpp", "w"); – se deschide spre scriere un fișier cu numele logic f, care are numele fizic Dat_sp.cpp, aflat pe unitatea d, în directorul de lucru; sau mai pe scurt

FIȘIER *f = fopen("d:\\work\\Dat_sp.cpp", "w");

18.2. Închiderea unui fișier

După ce lucrați cu un fișier, accesul la acesta trebuie închis. Acest lucru este realizat de funcția int fclose (pointer fișier). De exemplu, din exemplul anterior, fișierul este închis astfel: fclose (f);

Pentru a închide mai multe fișiere, se introduce o funcție, declarată astfel: void fcloseall (void);

Dacă trebuie să schimbați modul de acces pentru un fișier, trebuie mai întâi să închideți fișierul și apoi să îl deschideți din nou, dar cu drepturi de acces diferite. Pentru a face acest lucru, utilizați funcția standard:

FILE* freeopen (char*file_name, char *mode, FILE *file_pointer);

Această funcție închide mai întâi fișierul declarat file_pointer(cum face funcția fopen), apoi deschide fișierul cu numele fișierului și permisiunile „mod”.

Limbajul C are capacitatea de a lucra cu fișiere temporare care sunt necesare doar în timp ce programul rulează. În acest caz se utilizează funcția

FILE* tmpfile (void);

care creează un fișier temporar pe disc cu drepturi de acces „w+b”; după ce programul este finalizat sau după ce fișierul temporar este închis, acesta este șters automat.

18.3. Scrie – citește informații

Toate acțiunile de citire și scriere a datelor într-un fișier pot fi împărțite în trei grupuri: operații de intrare-ieșire caracter cu caracter; operațiuni I/O linie cu linie; blocarea operațiunilor I/O.

Să ne uităm la principalele funcții utilizate în fiecare dintre aceste trei grupuri de operații.

I/O caracter cu caracter

În funcțiile I/O caracter cu caracter, un caracter este primit dintr-un fișier sau un caracter este trimis către un fișier:

I/O rând

Funcțiile de intrare/ieșire de linie se transferă dintr-un fișier sau către

Bloc I/O

Funcțiile bloc I/O operează pe blocuri întregi

informație:

int fread (void*p, intsize,

– citește n blocuri de dimensiunea octetilor fiecare din fișier

int n, FIȘIER *f)

la f către o zonă de memorie cu indicatorul p (obligatoriu

int fwrite (void*p, intsize,

alocați memorie în avans pentru blocul de citit);

– scrie n blocuri de octeți de dimensiune fiecare din

int n, FIȘIER *f)

zonă de memorie cu indicatorul p către fișierul f.

I/O formatat este produs de funcții.

Fișiere text

Să ne uităm la lucrul cu un fișier text în C folosind un exemplu. Creați un fișier text pe unitatea C denumit TextFile.txt. Introduceți următoarele rânduri în acest fișier:

String_1 123 String_11, 456
String_2
String_3

Salvați fișierul.

Și acesta este codul pentru un program C care deschide fișierul nostru și citește linii din el:

/* *Autor: @author Subbotin B.P..h> #include #define LEN 50 int main(void) (puts("Operațiuni cu fișierul text"); char cArray; FILE *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) (puts("Probleme"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile); return EXIT_SUCCESS; )

Pentru a deschide un fișier text în C, utilizați funcția fopen:

FIȘIER *pTextFile = fopen("C:\\TextFile.txt", "r");

Primul argument al funcției fopen indică un fișier, iar al doilea spune că fișierul este deschis pentru citire din el.

Citim liniile folosind funcția fgets:

fgets(cArray, LEN, pTextFile);

Primul argument al funcției fgets indică o matrice de caractere în care vor fi stocate șirurile primite, al doilea argument este numărul maxim de caractere de citit, iar al treilea este fișierul nostru.

După ce ați terminat de lucrat cu fișierul, trebuie să îl închideți:

fclose(pTextFile);

Primim:

În rânduri apar și litere rusești.

Apropo, am făcut acest program în Eclipse. Puteți vedea cum să lucrați cu C/C++ în Eclipse.

Deci, am deschis și am citit datele dintr-un fișier text.

Acum vom învăța cum să creăm programatic un fișier text și să scriem date în el.

/* Autor: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Acesta este un șir"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) (puts("Probleme"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine); fprintf(pTextFile, "%d", nVal); return EXIT_SUCCESS ;)

Creați un fișier text în care să scrieți date:

FIȘIER *pTextFile = fopen("C:\\TextFileW.txt", "w");

dacă fișierul există deja, acesta va fi deschis și toate datele din acesta vor fi șterse.

C-string cString și numărul nVal sunt scrise de program într-un fișier text. cNewLine este pur și simplu o linie nouă.

Scriem date într-un fișier text folosind funcția fprintf:

fprintf(pTextFile, „%s%c”, cString, cNewLine);

primul argument aici este fișierul nostru, al doilea este șirul de format, al treilea sau mai multe este numărul de argumente necesare pentru acest format.

Această secțiune va discuta două moduri de a lucra cu fișiere și clasa standard MFC CFileDialog.


1. Lucrul cu fișiere în C (funcționează și în C++).


    #include
    #include

Void main(void)
{
FIȘIER *dosar;
char* nume_fișier = "fișier.txt";
char load_string = "niciunul";

Fișier = fopen(nume_fișier, "w");

Fputs(„șir”, fișier);

Fișier = fopen(nume_fișier, "r");
if(fișier != 0)
{
fgets(șir_încărcare, 50 , fișier);
cout)
altfel
{
cout)
fclose(fișier);
) Descrierile funcțiilor pentru lucrul cu fișiere sunt în bibliotecă stdio.h
Mai întâi trebuie să creați un pointer către o variabilă de tip FILE ( FIȘAR* fișier;).
Deschiderea unui fișier se face apelând funcția fopen ( fișier = fopen(nume_fișier, "w");)
Primul parametru al acestei funcții este numele fișierului, al doilea specifică în ce mod trebuie deschis fișierul. "w"- deschis pentru înregistrare, "r"- deschis pentru lectură, "A"- adăugare de fișiere (acestea sunt cele mai utilizate moduri, deși există și altele). Scrierea și citirea datelor dintr-un fișier se realizează prin următoarele funcții: fputc, fputs, fgetc, fgets, fprintf, fscanf(pentru o descriere a acestor funcții, vezi stdio.h).
Închiderea unui fișier se face apelând funcția fclose ( fclose(fișier);).

Lucrul cu fișiere folosind MFC (clasele CFile, CStdioFile, ...) și clasa standard MFC CFileDialog.


Biblioteca MFC include mai multe clase pentru lucrul cu fișiere. Clasele discutate mai jos moștenesc din clasa de bază

CFfile.

Clasa CF ile

CFfileconceput pentru a lucra cu fișiere. Face fișierele mai ușor de utilizat, reprezentând un fișier ca un obiect care poate fi creat, citit, scris etc.

Pentru a accesa un fișier, mai întâi trebuie să creați un obiect din clasa CFile. Constructorul clasei vă permite să deschideți un fișier imediat după crearea unui astfel de obiect. Dar puteți deschide fișierul mai târziu folosind metoda

Deschis.

Deschiderea și crearea fișierelor

După crearea obiectului de clasă CFfileputeți deschide un fișier apelând metodaDeschis. Metoda trebuie să specifice calea către fișierul de deschis și modul de utilizare a acestuia. Prototipul metodeiDeschisare următoarea formă:

Virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError=NULL);

Ca parametru lpszFileName, trebuie să specificați numele fișierului de deschis. Puteți specifica doar numele fișierului sau numele complet al fișierului care include calea completă către acesta.

Al doilea parametru, nOpenFlags, specifică acțiunea pe care metoda Open o efectuează asupra fișierului, precum și atributele fișierului. Mai jos sunt câteva valori posibile pentru parametrul nOpenFlags:

  • CFile::modeCreate - creează un fișier nou. Dacă fișierul specificat există, conținutul acestuia este șters și lungimea fișierului este setată la zero.
  • CFile::modeNoTruncate - Acest fișier este destinat să fie utilizat împreună cu fișierul CFile::modeCreate. Dacă este creat un fișier existent, conținutul acestuia nu va fi șters.

  • CFfile::modeRea d - Fișierul este deschis doar în citire.
  • CFile::modeReadWrite - Fișierul este deschis pentru scriere și citire.
  • CFile::modeWrite - Fișierul este deschis doar pentru scriere.
  • CFile::typeText - Folosit de clasele derivate din clasa CFile, cum ar fi CStdioFile, pentru a lucra cu fișiere în modul text. Modul text convertește combinația dintre un caracter de întoarcere la cărucior și un caracter de avans de linie.
  • CFile::Binary - Folosit de clasele derivate din clasa CFile, cum ar fi CStdioFile, pentru a lucra cu fișiere în modul binar.
  • Parametrul opțional pError, care este un pointer către un obiect de clasă CFileException, este folosit numai dacă efectuarea unei operații asupra fișierului ar provoca o eroare. În acest caz, informații suplimentare vor fi scrise pe obiectul indicat de pError.

    Metodă Deschisreturnează diferit de zero dacă fișierul este deschis și zero în caz de eroare. O eroare la deschiderea unui fișier poate apărea, de exemplu, dacă metoda Open este specificată pentru a citi un fișier inexistent.

    Deschideți ID-ul fișierului

    Clasa CFile include un element de date m_hFile de tip UINT. Stochează identificatorul fișierului deschis. Dacă un obiect din clasa CFile a fost deja creat, dar fișierul nu a fost încă deschis, atunci constanta hFileNull este scrisă în variabila m_hFile.

    De obicei, identificatorul fișierului deschis nu este utilizat direct. Metode de clasă CFfilevă permit să efectuați aproape orice operațiune cu fișiere și nu vă necesită să specificați un identificator de fișier. Deoarece m_hFile este un element de clasă, implementarea metodelor sale are întotdeauna acces liber la acesta.

    Închiderea fișierelor

    După terminarea lucrului cu fișierul, acesta trebuie închis. Clasă CFfileare o metodă specială Close pentru aceasta. Trebuie remarcat faptul că, dacă a fost creat un obiect din clasa CFile și a fost deschis un fișier, iar apoi obiectul este șters, fișierul asociat este închis automat folosind un destructor.

    Citirea și scrierea fișierelor

    Există mai multe metode de clasă pentru accesarea fișierelor. CFfile: Citiți, Citiți uriaș, Scrieți, Scrieți uriaș, Flush. Metode Citește și citește uriaș sunt concepute pentru a citi date dintr-un fișier deschis anterior. Pe sistemele de operare pe 32 de biți, ambele metode pot citi simultan mai mult de 65535 de octeți dintr-un fișier. Specificația ReadHuge este considerată învechită și este păstrată numai pentru compatibilitate cu sistemele de operare pe 16 biți.

    Datele citite din fișier sunt scrise în buffer-ul lpBuf. Parametrul nCount specifică numărul de octeți care trebuie citiți din fișier. De fapt, din fișier pot fi citiți mai puțini octeți decât este solicitat de parametrul nCount. Acest lucru se întâmplă dacă se ajunge la sfârșitul fișierului în timpul citirii. Metodele returnează numărul de octeți citiți din fișier.

    Metodele Write și WriteHuge sunt destinate scrierii într-un fișier. Pe sistemele de operare pe 32 de biți, ambele metode pot scrie simultan mai mult de 65535 de octeți într-un fișier. Methods scrie octeți din buffer-ul lpBuf în fișierul deschis nCount. Dacă apare o eroare de scriere, cum ar fi un disc plin, metodele apelează la tratarea excepțiilor.

    Metoda de spălare

    Când metoda Write sau WriteHuge este utilizată pentru a scrie date pe disc, aceasta poate rămâne într-un buffer temporar pentru o perioadă de timp. Pentru a vă asigura că se fac modificările necesare fișierului de pe disc, trebuie să utilizați metoda Flush.

    Operații cu fișiere

    Clasa include metode care vă permit să efectuați diferite operații asupra fișierelor, cum ar fi copierea, redenumirea, ștergerea, modificarea atributelor.

    Pentru a schimba numele fișierului, clasa CFile include o metodă statică Redenumiți, care îndeplinește funcțiile acestei comenzi. Metoda nu poate fi folosită pentru a redenumi directoare. Dacă apare o eroare, metoda aruncă o excepție.

    O metodă statică este inclusă în clasa CFile pentru a șterge fișiere Elimina, care vă permite să ștergeți fișierul specificat. Această metodă nu vă permite să ștergeți directoare. Dacă fișierul nu poate fi șters, metoda aruncă o excepție.

    Pentru a determina data și ora creării fișierului, lungimea și atributele acestuia, se folosește o metodă statică GetStatus. Există două varietăți de metodă - prima este definită ca metodă virtuală și a doua este definită ca metodă statică.

    Versiunea virtuală a metodei GetStatusdetermină starea deschisă a fișierului asociat cu acest obiect de clasă CFile. Această metodă este apelată numai atunci când este creat un obiect de clasă CFile și fișierul este deschis.

    Versiunea statică a metodei GetStatusvă permite să determinați caracteristicile unui fișier care nu este asociat cu un obiect din clasa CFile. Pentru a utiliza această metodă, nu este necesar să deschideți mai întâi fișierul.

    Lacăt

    Clasa include metode LockRangeȘi UnlockRange, care permit blocarea uneia sau mai multor bucăți de date din fișier pentru a fi accesate de către alte procese. Dacă o aplicație încearcă să reblocheze datele care au fost blocate anterior de această aplicație sau de altă aplicație, se declanșează o excepție. Blocarea este unul dintre mecanismele care permite mai multor aplicații sau procese să funcționeze simultan pe același fișier fără a interfera între ele.

    Puteți seta o blocare folosind metoda LockRange. Pentru a elimina încuietorile instalate, trebuie să utilizați metodaUnlockRange. Dacă într-un fișier sunt setate mai multe blocări, atunci fiecare dintre ele trebuie eliberată printr-un apel separat de metodăUnlockRange.

    Poziționare

    Pentru a muta indicatorul de poziție a fișierului curent într-o poziție nouă, puteți utiliza una dintre următoarele metode de clasă CFfile - Căutați, Căutați pentru a începe, Căutați pentru a termina. La clasa CFfileinclude, de asemenea, metode care vă permit să setați și să modificați lungimea fișierului, -GetLength, SetLength.

    La deschiderea unui fișier, indicatorul de poziție curentă a fișierului este situat chiar la începutul fișierului. Când o bucată de date este citită sau scrisă, indicatorul de poziție curentă se deplasează spre sfârșitul fișierului și indică datele care vor fi citite sau scrise prin următoarea operație de citire sau scriere în fișier.

    Pentru a muta indicatorul de poziție a fișierului curent în orice locație, puteți utiliza metoda universală

    Căuta. Vă permite să mutați indicatorul cu un anumit număr de octeți în raport cu poziția de început, de sfârșit sau curentă a indicatorului.

    Pentru a muta indicatorul la începutul sau la sfârșitul unui fișier, cel mai convenabil este să folosiți metode speciale. Metodă

    SeekTo Beginmută indicatorul la începutul fișierului și metodaSeekToEnd- până la capăt.

    Dar pentru a determina lungimea unui fișier deschis, nu este necesar să mutați indicatorul acestuia. Puteți folosi metoda

    GetLength. Această metodă returnează, de asemenea, lungimea fișierului deschis în octeți. MetodăSetLengthvă permite să modificați lungimea fișierului deschis. Dacă această metodă mărește dimensiunea fișierului, valoarea ultimilor octeți este nedefinită.

    Poziția curentă a indicatorului fișierului poate fi determinată folosind metoda

    GetPosition. Returnat prin metodaGetPositionValoarea de 32 de biți specifică decalajul indicatorului de la începutul fișierului.

    Deschideți Caracteristicile fișierului

    Pentru a determina locația unui fișier deschis pe disc, trebuie să apelați metoda GetFilePath. Această metodă returnează un obiect al claseiCString, care conține calea completă a fișierului, inclusiv numele unității, directoarele, numele fișierului și extensia fișierului.

    Dacă trebuie doar să determinați numele și extensia unui fișier deschis, puteți utiliza metoda GetFileName. Returnează un obiect CString care conține numele fișierului. În cazul în care trebuie să aflați doar numele unui fișier deschis fără extensie, utilizați metodaGetFileTitle.

    Următoarea metodă a clasei CFile vă permite să setați calea fișierului. Această metodă nu creează, copiază sau modifică numele fișierului; ea completează doar elementul de date corespunzător din obiectul clasei CFile.

    Clasa C

    MemFile

    Biblioteca MFC include clasa

    CMemFile, moștenit din clasa de bazăCFfile. Clasă CMemFilereprezintă un fișier aflat în RAM. Cu obiecte de clasăCMemFilela fel ca cu obiectele de clasăCFfile. Diferența este că fișierul asociat obiectuluiCMemFile, nu se află pe disc, ci în memoria RAM a computerului. Din acest motiv, operațiunile cu un astfel de fișier sunt mult mai rapide decât cu fișierele obișnuite.

    Lucrul cu obiecte de clasă

    CMemFile, puteți folosi aproape toate metodele claseiCFfilecare au fost descrise mai sus. Puteți scrie date într-un astfel de fișier sau îl puteți citi. Pe lângă aceste metode, clasa conțineCMemFilemetode suplimentare incluse.

    Există doi constructori diferiți pentru a crea obiecte din clasa CMemFile. Primul constructor CMemFile are un singur parametru opțional nGrowBytes:

    CMemFile(UINT nGrowBytes=1024);

    Acest constructor creează un fișier gol în RAM. Odată creat, fișierul este deschis automat (nu este nevoie să apelați metoda Ope

    n).

    Când începe scrierea într-un astfel de fișier, un bloc de memorie este alocat automat. Pentru a obține metodele clasei de memorie

    CMemFileapelați funcții standardmalloc, reallocȘi gratuit. Dacă blocul de memorie alocat nu este suficient, dimensiunea acestuia este mărită. Blocul de memorie al fișierului este mărit în părți de octeți nGrowBytes. După ștergerea unui obiect de clasăCMemFilememoria utilizată este returnată automat în sistem.

    Al doilea constructor al clasei CMemFile are un prototip mai complex. Acest constructor este folosit în cazurile în care programatorul însuși alocă memorie pentru fișier:

    CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes=0);

    Parametrul lpBuffer specifică bufferul care va fi utilizat pentru fișier. Mărimea tamponului este determinată de parametrul nBufferSize.

    Parametrul opțional nGrowBytes este utilizat mai cuprinzător decât în ​​constructorul de primă clasă. Dacă nGrowBytes conține zero, atunci fișierul generat va conține datele din lpBuffer. Lungimea unui astfel de fișier va fi egală cu nBufferSize.

    Dacă nGrowBytes este mai mare decât zero, atunci conținutul lpBuffer este ignorat. În plus, dacă într-un astfel de fișier sunt scrise mai multe date decât pot încăpea în buffer-ul alocat, dimensiunea acestuia crește automat. Blocul de memorie al fișierului este mărit în părți de octeți nGrowBytes.

    CMemFilevă permite să obțineți un indicator către zona de memorie utilizată de fișier. Prin acest pointer puteți lucra direct cu conținutul fișierului, fără a vă limita la metodele de clasăCFfile. Pentru a obține un pointer către un buffer de fișier, puteți utiliza metoda Detach. Înainte de a face acest lucru, este util să determinați lungimea fișierului (și, prin urmare, dimensiunea memoriei tampon) apelând metodaGetLength. Desprindeînchide fișierul dat și returnează un pointer către blocul de memorie pe care îl folosește. Dacă trebuie să deschideți din nou fișierul și să asociați un bloc RAM cu acesta, trebuie să apelați metodaAtașați.

    Trebuie remarcat faptul că pentru a gestiona buffer-ul de fișiere, clasa

    CMemFileapelează funcții standardmalloc, reallocȘi gratuit. Prin urmare, pentru a nu sparge mecanismul de gestionare a memoriei, bufferul lpBuffer trebuie creat de funcțiimalloc sau calloc.

    Clasa CStdioFile

    Cei care sunt obișnuiți să folosească funcțiile stream I/O din biblioteca standard C și C++ ar trebui să acorde atenție clasei

    CStdioFile, moștenit din clasa de bazăCFfile. Această clasă vă permite să efectuați I/O tamponat în modul text și binar. Pentru obiectele de clasăCStdioFilePuteți apela aproape toate metodele clasei CFile.CStdioFileinclude elementul de date m_pStream, care conține un pointer către fișierul deschis. Dacă un obiect de clasăCStdioFilecreat, dar fișierul nu este încă deschis sau închis, atunci m_pStream conține constanta NULL.CStdioFileare trei constructori diferiți. Primul constructor al clasei CStdioFile nu are parametri. Acest constructor creează doar un obiect de clasă, dar nu deschide niciun fișier. Pentru a deschide un fișier, trebuie să apelați metodaDeschisclasa de bazăCFfile.

    Constructor de clasa a doua

    CStdioFilepoate fi apelat dacă fișierul este deja deschis și trebuie să creați un nou obiect al clasei CStdioFile și să asociați fișierul deschis cu acesta. Acest constructor poate fi folosit dacă fișierul a fost deschis cu o funcție standardfopen. Parametrul metodei trebuie să conțină un pointer către fișierul obținut prin apelarea funcției standardfopen.

    Al treilea constructor poate fi folosit dacă trebuie să creați un obiect de clasă

    CStdioFile, deschideți un fișier nou și asociați-l cu obiectul nou creat.

    Pentru citirea și scrierea într-un fișier text, clasa CStdioFile include două metode noi:

    ReadStringȘi WriteString. Prima metodă vă permite să citiți un șir de caractere dintr-un fișier, iar a doua metodă vă permite să îl scrieți.

    Exemple de scriere și citire dintr-un fișier

    Iată fragmente de cod care demonstrează utilizarea panourilor de dialog standard de selecție a fișierelor și procedura de citire și scriere într-un fișier.

    Deschiderea unui fișier și citirea din el

    CString m_Text; …… // creează un panou standard de selecție a fișierelor Deschide CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY,(LPCSTR)" Fișiere text (*.txt) |*.txt||"); // afișează panoul standard de selecție a fișierelor Deschide if(DlgOpen.DoModal()==IDOK) ( // creează un obiect și deschide fișierul pentru citire CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary); // citind șiruri din fișier CString& ref=m_Text; File.ReadString (ref ); // se transmite o referință la un șir m_Text)

    Deschiderea și scrierea dintr-un fișier

    CString m_Text; …… // creează un panou standard de selecție a fișierelor SaveAs CFileDialog DlgSaveAs(FALSE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)" Fișiere text (*.txt) |*.txt||"); // afișează panoul standard de selecție a fișierelor SaveAs if(DlgSaveAs.DoModal()==IDOK) ( // creează un obiect și deschide un fișier pentru scriere CStdioFile File(DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // scrie într-un fișier șir File.WriteString((LPCTSTR)m_Text); )
      conține codul de lucru al programului, conceput pentru simplitate ca o aplicație de consolă sub MFC. Pentru ca programul să funcționeze, nu uitați să faceți următoarele:

      Rulați programul - Build / Rebuild all (vor fi erori), selectați Build / Set active configuration - Win 32 Realise, selectați elementul de meniu „Proiect”, apoi „Setări...”, fila „C/C++”, Categorie - Generare cod și În elementul „Utilizați biblioteca de rulare”, selectați „Multithreaded”. După aceea, faceți Build / Rebuild totul din nou și programul va funcționa.

    Funcția fopen() deschide un flux pentru utilizare, asociază un fișier cu acel flux și apoi returnează un pointer FILE către acel flux. Cel mai adesea fișierul este tratat ca un fișier disc. Funcția fopen() are următorul prototip:

    FILE *fopen(const char *filename, const char *mode);

    Unde modul indică un șir care conține modul dorit pentru deschiderea fișierului. Valorile valide pentru modul în Borland C++ sunt afișate în tabel. nume de fișier trebuie să fie un șir de caractere care furnizează un nume de fișier valid sistemului de operare și poate conține o cale.

    Funcția fopen() returnează un pointer către tipul de bază FILE. Acest indicator identifică fișierul și este utilizat de majoritatea funcțiilor sistemului de fișiere. Nu ar trebui să-l schimbi niciodată singur. Funcția returnează un pointer nul dacă fișierul nu poate fi deschis.

    După cum arată tabelul, fișierul poate fi deschis fie în modul text, fie în modul binar. În modul text, pe măsură ce tastați, secvența de întoarceri de cărucior și avansuri de linie este tradusă într-un caracter de linie nouă. La ieșire, opusul este adevărat: caracterul de nouă linie este tradus într-un retur de cărucior și un avans de linie. Această traducere nu are loc în fișierele binare. Când nici t, nici b nu sunt specificate în argumentul mode, atunci starea text/binară a fișierului este determinată de valoarea variabilei globale _fmode definită în Borland C++. În mod implicit, fmode este setat la O_TEXT, adică modul text este setat. Dacă setați _fmode la O_BINARY, atunci fișierele vor fi deschise în modul binar. (Aceste macrocomenzi sunt definite în fcntl.h.) Desigur, utilizarea unui t sau b explicit elimină efectele asociate cu variabila _fmode. În plus, _fmode este specific numai produselor Borland. Nu este definit în sistemul ANSI C I/O.

    Dacă trebuie să deschideți un fișier numit test pentru scriere, ar trebui să scrieți:

    Fp = fopen("test", "w");

    Unde fp este o variabilă de tip FILE *. Cu toate acestea, este obișnuit să vedeți următoarele:

    If((fp = fopen(„test”, „w”))==NULL) (
    puts("Nu se poate deschide fișierul.");
    ieșire(1);
    }

    Această metodă vă permite să detectați erori la deschiderea unui fișier, de exemplu, prezența protecției la scriere sau lipsa spațiului liber pe disc.

    Dacă fopen() este folosit pentru a deschide un fișier pentru scriere, atunci orice fișier preexistent cu numele specificat va fi șters. Dacă un fișier cu numele specificat nu există, acesta va fi creat.

    Dacă trebuie să adăugați informații la sfârșitul fișierului, ar trebui să utilizați modul a (adăugați). Dacă fișierul nu există, acesta va fi creat.

    Deschiderea unui fișier pentru citire necesită prezența fișierului. Dacă fișierul nu există, va fi returnată o eroare. Dacă un fișier este deschis pentru operație de citire/scriere, atunci nu este șters dacă există, iar dacă fișierul nu există, atunci este creat.

    Tabel: Valori de mod permise

    Sens

    Deschide un fișier pentru citire. (Se deschide implicit ca fișier text.)

    Creează un fișier în care să scrieți. (Se deschide implicit ca fișier text.)

    Se atașează la un fișier. (Se deschide implicit ca fișier text.)

    Deschide un fișier binar pentru citire.

    Deschide un fișier binar pentru scriere.

    Se atașează la un fișier binar.

    Deschide un fișier pentru citire/scriere. (Se deschide implicit ca fișier text.)

    Creează un fișier de citire/scriere. (Se deschide implicit ca fișier text.)

    Atașează sau creează un fișier de citire/scriere. (Se deschide implicit ca fișier text.)

    Deschide un fișier binar pentru citire/scriere.

    Creează un fișier binar de citire/scriere.

    Atașează sau creează un fișier binar de citire/scriere.

    Creează un fișier text pentru scriere.

    Se atașează la un fișier text.

    Deschide un fișier text pentru citire.

    Creează un fișier text pentru citire/scriere.

    Deschide sau creează un fișier text pentru citire/scriere.