Activitate de programare cu fișiere text. Lucrul cu fișiere în limbaj C

Anterior, atunci când introducem și scoatem date, lucram cu fluxuri standard - tastatura și monitorul. Acum să ne uităm la modul în care limbajul C implementează primirea datelor din fișiere și scrierea lor acolo. Înainte de a putea efectua aceste operațiuni, trebuie să deschideți fișierul și să îl accesați.

În limbajul de programare C, un pointer către un fișier este de tip FILE și declarația lui arată astfel:
FIȘIER *fișierul meu;

Pe de altă parte, funcția fopen() deschide un fișier la adresa specificată ca prim argument în modul citire ("r"), modul scriere ("w") sau modul adăugare ("a") și returnează un pointer la el la program. Prin urmare, procesul de deschidere a unui fișier și conectare la program arată cam așa:
myfile = fopen("hello.txt", "r");

Când citiți sau scrieți date într-un fișier, acesta este accesat printr-un indicator de fișier (în acest caz, myfile).

Dacă dintr-un motiv sau altul (nu există niciun fișier pentru adresa specificată, accesul la acesta este interzis) funcția fopen() nu poate deschide fișierul, apoi returnează NULL. ÎN programe reale aproape întotdeauna se ocupă de o eroare de deschidere a fișierului în ramura if, dar vom omite acest lucru în continuare.

Declarația funcției fopen() este conținută în fișier antet stdio.h, deci trebuie inclus. Tot în stdio.h este declarat tipul de structură FILE.

După ce se termină lucrul cu un fișier, se obișnuiește să îl închideți pentru a elibera tamponul de date și din alte motive. Acest lucru este deosebit de important dacă programul continuă să ruleze după ce ați lucrat cu fișierul. Rupând legătura dintre fișier extern iar un pointer către acesta din program este executat folosind funcția fclose(). Un pointer către fișier îi este transmis ca parametru:
fclose(fișierul meu);

Mai mult de un fișier poate fi deschis în program. În acest caz, fiecare fișier trebuie să fie asociat cu propriul său indicator de fișier. Cu toate acestea, dacă programul lucrează mai întâi cu un fișier și apoi îl închide, atunci indicatorul poate fi folosit pentru a deschide un al doilea fișier.

Citirea și scrierea într-un fișier text

fscanf()

Funcția fscanf() are sens similar funcții scanf(), dar spre deosebire de acesta, oferă intrare formatată dintr-un fișier, mai degrabă decât fluxul de intrare standard. Funcția fscanf() preia parametri: pointer de fișier, șir de format, adrese ale zonelor de memorie pentru scrierea datelor:
fscanf(fișierul meu, „%s%d”, str, &a);

Returnează numărul de date citite cu succes sau EOF. Spații, caractere de evadare linie nouă considerate ca delimitatori de date.

Să presupunem că avem un fișier care conține următoarea descriere a obiectelor:

Mere 10 23,4 banane 5 25,0 pâine 1 10,3

#include main () ( FILE * fișier; struct food ( char name[ 20 ] ; unsigned qty; float price; ) ; struct food shop[ 10 ] ; char i= 0 ; fișier = fopen ( "fscanf.txt" , "r" ) ; while (fscanf (fișier, "%s%u%f" , magazin[ i].nume , & (shop[ i].qty ) , & (shop[i].preț ) != EOF) ( printf ( „%s %u %.2f \n", magazin[ i].nume , magazin[ i].cantitate , magazin[ i].preț ) ; i++; ) )

În acest caz, sunt declarate o structură și o matrice de structuri. Fiecare linie din fișier corespunde unui element al matricei; un element de matrice este o structură care conține un șir și două câmpuri numerice. Bucla citește un rând pe iterație. Când se întâlnește sfârșitul fișierului, fscanf() returnează EOF și bucla se termină.

fgets()

Funcția fgets() este similară cu funcția gets() și efectuează intrare linie cu linie dintr-un fișier. Un apel la fgets() va citi o linie. În acest caz, nu puteți citi întreaga linie, ci doar o parte din ea de la început. Parametrii fgets() arată astfel:
fgets (character_array, number_of_characters_read, pointer_to_file)

De exemplu:
fgets(str, 50, myfile)

Acest apel de funcție va citi din fișierul asociat cu indicatorul myfile o linie completă de text dacă lungimea sa este mai mică de 50 de caractere, inclusiv caracterul „\n”, pe care funcția îl va stoca și într-o matrice. Ultimul (al 50-lea) element al matricei str va fi caracterul „\0” adăugat de fgets() . Dacă șirul este mai lung, funcția va citi 49 de caractere și va scrie „\0” la sfârșit. În acest caz, „\n” nu va fi conținut în linia de citire.

#include #define N 80 main () ( FILE * fișier; char arr[ N] ; fișier = fopen ( "fscanf.txt" , "r" ) ; while (fgets (arr, N, file) != NULL) printf (" %s", arr); printf (" \n"); fclose(fișier); )

În acest program, spre deosebire de cel precedent, datele sunt citite linie cu linie în matricea arr. Când se citește rândul următor, cea precedentă se pierde. Funcția fgets() returnează NULL dacă nu poate citi următoarea linie.

getc() sau fgetc()

Funcția getc() sau fgetc() (ambele funcționează) vă permite să obțineți următorul singur caracter dintr-un fișier.

în timp ce ((arr[ i] = fgetc (fișier) ) != EOF) ( dacă (arr[ i] == " \n") (arr[i] = " \0 " ; printf("%s \n", arr) ; i = 0; ) else i++; )arr[i] = " \0 " ; printf("%s \n", arr) ;

Exemplul de cod afișează datele dintr-un fișier pe ecran.

Scrierea într-un fișier text

La fel ca intrarea, ieșirea într-un fișier poate fi diferită.

  • Ieșire formatată. Funcția fprintf (index_fișier, șir de format, variabile) .
  • Ieșire post-cu-linie. Funcția fputs(șir, file_pointer) .
  • Ieșire caracter cu caracter. Funcția fputc() sau putc(simbol, file_pointer) .

Mai jos sunt exemple de cod care folosesc trei metode de ieșire a datelor într-un fișier.

Scrierea câmpurilor dintr-o structură pe fiecare linie a fișierului:

fișier = fopen ("fprintf.txt" , "w" ); în timp ce (scanf ("%s%u%f", magazin[ i].nume , & (magazin[ i].qty ) , & (shop[i].preț ) ) != EOF) ( fprintf (fișier, " %s %u %.2f \n", magazin[ i].nume , magazin[ i].cantitate , magazin[ i].preț ) ; i++; )

Ieșirea linie cu linie într-un fișier (fputs(), spre deosebire de puts() în sine, nu plasează „\n” la sfârșitul liniei):

while (obține (arr) != NULL) ( fputs (arr, fișier); fputs (" \n", dosar); )

Exemplu de ieșire caracter cu caracter:

while ((i = getchar () ) != EOF) putc (i, fisier) ;

Citirea și scrierea într-un fișier binar

Puteți lucra cu un fișier nu ca o secvență de caractere, ci ca o secvență de octeți. În principiu, nu este posibil să lucrați cu fișiere non-text în alt mod. Cu toate acestea, aceasta poate fi folosită și pentru a citi și scrie în fișiere text. Avantajul acestei metode de accesare a unui fișier este viteza de citire-scriere: un bloc semnificativ de informații poate fi citit/scris într-un singur acces.

Când deschideți un fișier pentru acces binar, al doilea parametru pentru fopen() este șirul „rb” sau „wb”.

Subiect despre lucrul cu fișiere binare Destul de complex, necesită o lecție separată de studiat. Aici vor fi notate doar caracteristicile funcțiilor de citire și scriere într-un fișier, care este considerat ca un flux de octeți.

Funcțiile fread() și fwrite() iau ca parametri:

  1. adresa zonei de memorie din care sunt scrise sau citite datele,
  2. dimensiunea unui tip dat,
  3. cantitatea de date citite de dimensiunea specificată,
  4. index de fișiere.

Aceste funcții returnează numărul de date citite sau scrise cu succes. Acestea. puteți „comanda” citirea a 50 de elemente de date, dar primiți doar 10. Nu va exista nicio eroare.

Un exemplu de utilizare a funcțiilor fread() și fwrite():

#include #include main () ( FIȘIER * fișier; char shelf1[ 50 ], shelf2[ 100 ] ; int n, m; fișier = fopen ("shelf1.txt" , "rb" ) ; n= fread (shelf1, sizeof (char ) , 50 , fișier) ; fclose (fișier) ; \0 " ; raftul2[m] = " \n"; raftul2[ m+ 1 ] = " \0 " ; fișier = fopen ("shop.txt" , "wb" ); fwrite (strcat (shelf2, shelf1) , sizeof (char ) , n+ m, fișier) ; fclose(fișier); )

Aici se încearcă citirea a 50 de caractere din primul fișier. n stochează numărul de caractere citite efectiv. Valoarea lui n poate fi 50 sau mai mică. Datele sunt plasate pe rând. Același lucru se întâmplă și cu al doilea fișier. Apoi, prima linie este atașată la a doua, iar datele sunt aruncate în al treilea fișier.

Rezolvarea problemelor

  1. Scrieți un program care cere utilizatorului numele (adresa) unui fișier text, apoi îl deschide și numără numărul de caractere și linii din el.
  2. Scrieți un program care scrie într-un fișier date primite dintr-un alt fișier și modificate într-un fel înainte de a scrie. Fiecare linie de date obținută dintr-un fișier trebuie să se încadreze într-o structură.

Înregistrați informații în fisier text am invatat deja. – Dacă nu ați învățat cum, consultați articolul anterior. Este spus și descris în detaliu

Dar dacă fișierul există deja și trebuie să citim informații din el pentru procesare? Din fericire, acest lucru este, de asemenea, destul de simplu. Permiteți-mi să vă reamintesc că există mai multe opțiuni pentru implementarea acestei sarcini, am descris doar una dintre ele. Cel descris este cel care din anumite motive mi se pare personal cel mai ușor de înțeles.

#include

int main()
{
char s1 //Variabila va citi șirul
ifstream în (“C:\\\FromC\\myfile.txt”); //Deschideți fișierul pentru a citi informații
în >>s1 ; //citește rândul
in.close() //Închiderea dosarului

cout<Ieșiți valoarea s1 la ecran
returnează 0;
}

Iată cel mai simplu program pentru a citi prima linie dintr-un fișier text situat de-a lungul căii
C:\\\FromC\\myfile.txt –
Deoarece aceasta este o continuare a articolului anterior, am decis să folosesc fișierul pe care l-am creat acolo. Probabil că nu ar trebui să existe dificultăți cu asta.
Dar să revenim la cod. Mai întâi deschidem fișierul pentru a citi informațiile din acesta, pentru aceasta folosim comanda ifstreamîntre paranteze indicăm fie numele fișierului, fie calea către fișier, așa cum am făcut eu. („C:\\\FromC\\myfile.txt”);
Când am deschis un fișier pentru a citi ceva din el, am declarat o variabilă ca char –
char s1
Acum tot ce trebuie să facem este să atribuim variabilei valoarea șirului din fișier. Facem asta ca o echipă în
Acordați atenție colțurilor în >>
De fapt, așa cum ar trebui să fie clar din comentariile la codul programului, pentru ca variabila să atribuie valoarea citită, trebuie să o scriem după în >>
în >>s1 ;

Aceasta nu pare a fi o sarcină deosebit de dificilă, mai ales dacă ați stăpânit deja perfect și ați învățat să utilizați materialul din articolul anterior - totul este absolut la fel, doar 2 comenzi sunt diferite

Crearea unui fișier și scrierea informațiilor C++ în el

ofstream afară ( Nume de fișier );
afară<< (Șir de scris);
afară.închide();
=============================

Citirea textului dintr-un fișier și tipărirea textului pe ecran în C++

ifstream în (Nume de fișier );
în>> (Citind rândul);
în.închide();(Închide fișierul)
============================
Hai să scriem un program simplu, care va citi textul de la tastatură și îl va scrie într-un fișier:

#include
#include

int main()
{
\\ 3 rânduri viitoare
clrscsr(); //Ștergerea ecranului

cout<<“Wwedi pervuu stroku” ; cin >>a ; endl ;
cout<<“Wwedi wtoruu stroku” ; cin >>b ; endl ;
cout<<“Wwedi tretuu stroku” ; cin >>c ; endl ;
clrscr(); //

/*Începe să lucrezi cu fișierul*/
ofstream out („C:\\\FromC\\myfile.txt”); //Deschiderea unui fișier pentru scriere
afară<Notează primul rând
afară<Scrie a doua linie
afară<Notează a treia linie
out.close(); //Închiderea dosarului

//Resetează variabilele la zero

pentru (int i =0;i<=255 ;i ++)
(a =*“” ; b =*“” ; c =*“” ;)


ifstream în („C:\\\FromC\\myfile.txt”);
în >>a >>b >>c ; //Citim fiecare rând nou într-o nouă variabilă
in.close(); //Închiderea dosarului

/* */

pentru (i =0 ;a !=*“” ;i ++)
{
dacă (i >dimensiunea(a)) pauză ;
cout<

}
cout<<“\n” ; \\

/* */


{
dacă (i > dimensiunea (b)) pauză ;
cout<
}
cout<<“\n” ; \\ A mutat cursorul pe o linie nouă

/* */

pentru (i =0 ;с !=*“” ;i ++)
{
dacă (i >dimensiunea(c)) pauză ;
cout<<с ;
}

returnează 0;
}
===================

În exemplele de mai sus există unul astfel IMENS defect. Dacă încercăm să introducem o linie care conține spații, programul nu va funcționa așa cum avem nevoie. Probabil, nu numai eu, ci și mulți alți oameni am dat peste această eroare. Prin urmare, vă las codul incorect, astfel încât să puteți vedea ce ați putea întâlni.

Din moment ce nu există cărți acasă, am început din nou să caut pe internet și am găsit o mulțime de tot felul de prostii sofisticate. Dar cumva am găsit o soluție la problema mea.
M-a ajutat să citesc asta cout susține metodele sale. Și pe Internet toate sfaturile se referă la utilizarea funcției getline Din fericire pentru mine, am aflat foarte repede cum să folosesc această funcție și apoi am folosit-o în cod.
În general, merită menționat și descris această funcție, dar până acum nu prea o înțeleg, doar înțeleg că trebuie folosită și înțeleg cum, așa că voi da un exemplu mai corect al programului nostru în curs de dezvoltare :

#include
#include

int main()
{
char a,b,c; \\ 3 rânduri viitoare
clrscsr(); //Ștergerea ecranului

/* Introduceți valori pentru variabile*/

cout<<“Wwedi pervuu stroku” ; cin.getline(a,sizeof(a)); endl ;
cout<<“Wwedi wtoruu stroku” ; cin.getline(a,sizeof(b)); endl ;
cout<<“Wwedi tretuu stroku” ; cin.getline(a,sizeof(c)); endl ;
clrscr(); //După introducerea valorilor, ecranul a fost șters

/*Începe să lucrezi cu fișierul*/
ofstream out („C:\\\FromC\\myfile.txt”); // Deschiderea unui fișier pentru scriere
afară<
Notează primul rând
afară<Scrie a doua linie
afară<Notează a treia linie
out.close(); //Închiderea dosarului

//Resetează variabilele la zero

pentru (int i =0;i<=255 ;i ++)
(a =*“” ; b =*“” ; c=*“” ;)

/*Continuați să lucrați cu fișierul*/

dacă flux în („C:\\\FromC\\myfile.txt”);
in.getline(a,sizeof(a));// A
in.getline(b,sizeof(b));// Citirea unei linii într-o variabilă b
in.getline(c,sizeof(c)); // Citirea unei linii într-o variabilă c
in.close(); //Închiderea dosarului

/* Citim primul rând caracter cu caracter și îl afișăm pe ecran */

pentru (i =0 ;a !=*“” ;i++)
{
dacă (i >dimensiunea(a)) pauză ;
cout<

}
cout<<“\n” ; \\ A mutat cursorul pe o linie nouă

/* Citim a doua linie caracter cu caracter și o afișăm pe ecran */

pentru (i =0 ;b !=*“” ;i ++)
{
dacă (i > dimensiunea (b)) pauză ;
cout<
}
cout<<“\n” ; \\ A mutat cursorul pe o linie nouă

/* Citim a treia linie caracter cu caracter și o afișăm pe ecran */

pentru (i =0 ;с !=*“” ;i++)
{
dacă (i>dimensiunea (c)) pauză ;
cout<<с[i];
}

getch(); \\Se așteaptă apăsarea tastei Enter
returnează 0;
}
===================

Acest material descrie un exemplu de citire a informațiilor personaj cu caracter. Din moment ce nu am descris lucrul cu variabile precum char, atunci începătorii pot întâmpina unele inconveniente în înțelegerea codului. Doar că nu știam ce tip char are unele particularități și credeam că totul era mai simplu. Prin urmare, câteva momente de neînțeles ale programului de mai sus pot fi citite în articolul următor lucrul cu char V C++ pentru începători

În caz contrar, exemplul dat despre cum să citești linii dintr-un fișier text în C++ ar trebui să fie accesibil și destul de ușor de înțeles. Aceasta nu este opțiunea optimă de implementare în acest moment și am omis câteva puncte importante, dar din moment ce începem să învățăm limbajul C++, acest lucru este suficient deocamdată. Mai târziu voi ajunge probabil la ceea ce mi-a ratat, dar acum trebuie să percep doar ceea ce este necesar.

Dacă tu și cu mine înțelegem acest material, înseamnă că am făcut un mic pas spre profesionalismul nostru.

Notă:
pauză ;– Aceasta este comanda care iese din buclă. Avem dacă contorul de cicluri pentru devine mai mare decât dimensiunea declarată a variabilei char, apoi ieșim forțat din buclă
!= – Aceasta este condiția pe care o punem. Această condiție este indicată de inegalitate
dacă (a !=b)– Citește ca și cum A nu este egal b

endl ; – Aceasta este pentru a muta cursorul pe o nouă linie în interiorul consolei (din câte am înțeles)
Această comandă este similară cu „\n”

Pentru programator, un fișier deschis este reprezentat ca o secvență de date citite sau scrise. Când un fișier este deschis, acesta este asociat cu Fluxul I/O . Informațiile de ieșire sunt scrise în flux, informațiile de intrare sunt citite din flux.

Când un flux este deschis pentru I/O, acesta este asociat cu o structură FILE standard, care este definită în stdio.h. Structura FILE conține informațiile necesare despre fișier.

Deschiderea unui fișier se face folosind funcția fopen(), care returnează un pointer către o structură de tip FILE care poate fi folosită pentru operațiunile ulterioare asupra fișierului.

FIȘIER *fopen(nume, tip);

nume – numele fișierului de deschis (inclusiv calea),
tip - indicator către un șir de caractere care definește modul în care este accesat fișierul:

· „r” - deschideți fișierul pentru citire (fișierul trebuie să existe);

· "w" - deschide un fișier gol pentru scriere; dacă fișierul există, conținutul acestuia se pierde;

· „a” - deschideți fișierul pentru scriere până la sfârșit (pentru anexare); fisierul este creat daca nu exista;

· „r+” - deschideți fișierul pentru citire și scriere (fișierul trebuie să existe);

· „w+” - deschideți un fișier gol pentru citire și scriere; dacă fișierul există, conținutul acestuia se pierde;

· „a+” - deschideți fișierul pentru citire și adăugare dacă fișierul nu există, acesta este creat;

Valoarea returnată este un pointer către fluxul deschis. Dacă este detectată o eroare, este returnat NULL.

Funcția fclose() închide fluxul sau fluxurile asociate fișierelor deschise folosind funcția fopen(). Fluxul de închis este determinat de argumentul funcției fclose().

Valoare returnată: valoarea 0 dacă fluxul a fost închis cu succes; EOF constantă dacă a apărut o eroare.

#include
int main()

char name="my.txt";

if(fp = fopen(nume, "r")!=NULL)

// a fost posibil să deschidem fișierul?
... // acțiuni necesare asupra datelor

else printf("Deschiderea fișierului a eșuat");

Citirea unui caracter dintr-un fișier:

char fgetc(stream);

Argumentul funcției este un pointer către un flux de tip FILE. Funcția returnează codul caracterului citit. Dacă se ajunge la sfârșitul fișierului sau apare o eroare, este returnată constanta EOF.
Scrierea unui simbol într-un fișier:

fputc(char, stream);

Argumentele funcției sunt un caracter și un pointer către un flux de tip FILE. Funcția returnează codul caracterului citit.

Funcțiile fscanf() și fprintf() sunt similare cu funcțiile scanf() și printf(), dar funcționează cu fișiere de date și au un pointer către fișier ca prim argument.

fscanf(stream, „Format de intrare”, argumente);
fprintf(stream, „Format de ieșire”, argumente);

Funcțiile fgets() și fputs() sunt concepute pentru intrarea/ieșirea șirurilor de caractere sunt analoge cu funcțiile gets() și puts() pentru lucrul cu fișiere.

fgets(Pointer la linie, Număr de caractere, flux);

Caracterele sunt citite din flux până când este citit un caracter newline „\n”, care este inclus în șir, sau până când fluxul se termină EOF sau a fost citit numărul maxim de caractere. Rezultatul este plasat într-un indicator și se termină cu caracterul nul „\0”. Funcția returnează adresa șirului de caractere.

fputs(Pointer To String, flux);

Copiază un șir în flux din poziția curentă. Caracterul nul final nu este copiat.
Exemplu Introduceți numărul și salvați-l în fișierul s1.txt. Citiți numărul din fișierul s1.txt, măriți-l cu 3 și salvați-l în fișierul s2.txt.

Lucrul cu fișiere text în C++.

Există două tipuri principale de fișiere: text și binare. Fișierele permit utilizatorului să citească cantități mari de date direct de pe disc, fără a fi nevoie să le introducă de la tastatură.

    Text sunt apelate fișiere formate din orice caractere. Ele sunt organizate în rânduri, fiecare se termină cu un caracter de final de linie. Sfârșitul fișierului în sine este indicat de simbolul „sfârșitul fișierului”. Când scrieți informații într-un fișier text, care poate fi vizualizat folosind orice editor de text, toate datele sunt convertite într-un tip de caracter și stocate sub formă de caractere.

    ÎN binarÎn fișiere, informațiile sunt citite și scrise sub formă de blocuri de o anumită dimensiune, în care pot fi stocate date de orice tip și structură.

Pentru a lucra cu fișiere, special tipuri de date, numit cursuri. curgere ifstream este folosit pentru a lucra cu fișiere în modul de citire și ofstreamîn modul înregistrare. Pentru a lucra cu fișiere atât în ​​modul de scriere, cât și în modul de citire, se folosește un flux fstream.

În programele C++, atunci când lucrați cu fișiere text, trebuie să includeți bibliotecile iostream și fstream.

Pentru a scrie date într-un fișier text, aveți nevoie de:

    descrie o variabilă de tip de flux.

    scoateți informații într-un fișier.

    asigurați-vă că închideți fișierul.

Pentru citind date dintr-un fișier text, aveți nevoie de:

    descrie o variabilă de tip ifstream.

    deschideți un fișier folosind funcția de deschidere.

    închideți fișierul.

Record informații într-un fișier text

    După cum am menționat mai devreme, pentru a începe să lucrați cu un fișier text, trebuie să definiți o variabilă de tip de flux. De exemplu, așa:

    O variabilă F va fi creată pentru a scrie informații în fișier.

    În etapa următoare, fișierul trebuie deschis pentru scriere. În general, operatorul de deschidere a fluxului va arăta astfel:

F.open(„fișier”, mod);

Aici F este o variabilă descrisă ca ofstream,

fișier - numele complet al fișierului de pe disc,

mod - modul de lucru cu fișierul deschis.

Vă rugăm să rețineți că atunci când specificați numele complet al fișierului, trebuie să utilizați o bară oblică dublă. De exemplu, numele complet al fișierului noobs.txt, aflat în folderul jocului de pe unitatea D:, va trebui scris astfel:

D:\\joc\\noobs.txt.

Fișierul poate fi deschis în unul dintre următoarele moduri:

ios::in - deschideți fișierul în modul de citire a datelor, acest mod este modul implicit pentru ifstreams;

ios::out - deschideți un fișier în modul de scriere a datelor (în acest caz, informațiile despre fișierul existent sunt distruse), acest mod este modul implicit pentru ofstreams;

ios::app - deschideți fișierul în modul de scriere a datelor până la sfârșitul fișierului;

ios::ate - trece la sfârșitul unui fișier deja deschis;

ios::trunc - șterge fișierul, asta se întâmplă și în modul ios::out;

ios::nocreate - nu deschideți un fișier dacă acesta nu există;

ios::noreplace - nu deschideți un fișier existent.

Parametrul mode poate fi absent, caz în care fișierul este deschis în modul implicit pentru acest flux.

După deschiderea cu succes a fișierului (în orice mod), variabila F va stoca true, altfel false. Acest lucru vă va permite să verificați corectitudinea operațiunii de deschidere a fișierului.

Puteți deschide un fișier (să luăm ca exemplu fișierul D:\\game\\noobs.txt) în modul înregistrare în unul dintre următoarele moduri:

// primul cale

din fluxul F;

F.open("D:\\game\\noobs.txt", ios::out);

//a doua metodă, modul ios::out este modul implicit

// Pentru curgereofstream

din fluxul F;

//a treia metodă combină descrierea variabilei și tipul fluxului

//și deschiderea fișierului într-o singură instrucțiune

ofstream F("D:\\game\\noobs.txt", ios::out);

După deschiderea fișierului în modul de scriere, va fi creat un fișier gol în care puteți scrie informații.

Dacă doriți să deschideți un fișier existent în modul scris înainte, modul ar trebui să fie ios::app.

După deschiderea unui fișier în modul de înregistrare, puteți scrie în el în același mod ca pe ecran, doar în locul dispozitivului de ieșire standardcouttrebuie să specificați numele fișierului deschis.

De exemplu, pentru a scrie variabila a în fluxul F, instrucțiunea de ieșire va arăta astfel:

Pentru ieșirea secvențială în fluxul G de variabile b, c, d, operatorul de ieșire va deveni astfel:

G<

Închiderea unui flux se face folosind operatorul:

EXEMPLU:

Creați un fișier text D:\\game\\noobs.txt și scrieți n numere reale în el.

#include „stdafx.h”

#include

#include

#include

folosind namespace std;

int main()

setlocale(LC_ALL, "RUS");

int i, n;

dublu a;

//descrie un flux pentru scrierea datelor într-un fișier

ofstream f;

//deschideți fișierul în modul de scriere,

//modulios:: afarăinstalat implicit

f.open("D:\\game\\noobs.txt", ios::out);

//introduceți numărul de numere reale

cout<<" n="; cin>> n;

//buclă pentru introducerea numerelor reale

//și scrieți-le într-un fișier

pentru (i=0; i

cout<<"a=";

//introduceți un număr

cin>>a;

f<

//închiderea fluxului

f.close();

sistem(„pauză”);

returnează 0;

_______________________________________________________________

Pentru a citi informații dintr-un fișier text, trebuie să descrii o variabilă precum ifstream. După aceasta, trebuie să deschideți fișierul pentru citire folosind operatorul deschis. Dacă variabila se numește F, atunci primele două afirmații vor fi astfel:

F.open("D:\\joc\\noobs.txt", ios::in);

După deschiderea unui fișier în modul de citire, puteți citi informațiile din acesta în același mod ca și de la tastatură, doar în loc decinspecificați numele fluxului din care vor fi citite datele.

De exemplu, pentru a citi din fluxul F în variabila a, instrucțiunea de intrare ar arăta astfel:

Două numere dintr-un editor de text sunt considerate separate dacă există cel puțin unul dintre caracterele între ele: spațiu, tab, sfârșit de rând. Este bine dacă programatorul știe dinainte câte și ce valori să stocheze în fișierul text. Cu toate acestea, adesea tipul de valori stocate în fișier este pur și simplu cunoscut, dar numărul acestora poate varia. Pentru a rezolva această problemă, trebuie să citiți valorile din fișier pe rând și, înainte de fiecare citire, verificați dacă s-a ajuns la sfârșitul fișierului. Există o funcție pentru asta F. eof().

Aici F este numele firului de execuție, funcția returnează o valoare booleană: adevărat sau fals, în funcție de sfârșitul fișierului. Prin urmare, o buclă pentru a citi conținutul întregului fișier poate fi scrisă astfel:

//organizare pentru citirea valorilor dintr-un fișier, execuție

//bucla se va rupe când ajungem la sfârșitul fișierului,

//în acest caz F.eof() va returna adevărat

în timp ce (!F.eof())

EXEMPLU:

Fișierul text D:\\game\\noobs.txt stochează numere reale, le afișează pe ecran și le calculează numărul.

#include „stdafx.h”

#include

#include

#include

#include

folosind namespace std;

int main()

setlocale(LC_ALL, "RUS");

int n=0;

plutire a;

fstream F;

//deschideți fișierul în modul de citire

F.open("D:\\joc\\noobs.txt");

//dacă fișierul a fost deschis corect, atunci

//buclă pentru citirea valorilor dintr-un fișier; execuția buclei va fi întreruptă,

// când ajungem la sfârșitul fișierului, în acest caz F.eof() va returna true.

în timp ce (!F.eof())

//citirea următoarei valori din fluxul F în variabila a

F>>a;

//trimite valoarea variabilei a pe ecran

cout<

//crește numărul de numere citite

//închiderea fluxului

F.close();

//introduceți pe ecran numărul de numere citite

cout<<"n="<

//dacă deschiderea fișierului a fost incorectă, atunci rezultatul

//mesaje despre absența unui astfel de fișier

altfel cout<<" Файл не существует"<

sistem(„pauză”);

returnează 0;

C++. Procesarea fișierelor binare

Când scrieți informații într-un fișier binar, caracterele și numerele sunt scrise ca o secvență de octeți.

Pentru a scrie date într-un fișier binar, aveți nevoie de:

    descrieți o variabilă de fișier de tip FAIL * folosind operatorul FILE *filename; Aici filename este numele variabilei în care va fi stocat indicatorul către fișier.

    scrieți informații într-un fișier folosind funcția fwrite

Pentru a considera b date dintr-un fișier binar, trebuie să:

    descrie o variabilă de tip FILE *

    deschideți un fișier folosind funcția fopen

    închideți un fișier folosind funcția fclose

Funcții de bază necesare pentru a lucra cu fișiere binare.

Pentru descoperiri Fișierul este destinat funcției fopen.

FILE *fopen(const *nume fișier, const char *mod)

Aici filename este un șir care stochează numele complet al fișierului deschis, mode este un șir care determină modul de lucru cu fișierul; sunt posibile următoarele valori:

„rb” - deschideți fișierul binar în modul de citire;

„wb” - creați un fișier binar pentru înregistrare; dacă există, conținutul său este șters;

„ab” - creați sau deschideți un fișier binar pentru a adăuga la sfârșitul fișierului;

„rb+” - deschideți un fișier binar existent în modul citire-scriere;

„wb+” - deschideți fișierul binar în modul citire-scriere, fișierul existent este șters;

„ab+” - un fișier binar este deschis sau creat pentru a corecta informațiile existente și pentru a adăuga informații noi la sfârșitul fișierului.

Funcția returnează valoarea NULL în variabila fișier f dacă deschiderea fișierului eșuează. După deschiderea unui fișier, al 0-lea octet al acestuia este disponibil, indicatorul fișierului este 0, a cărui valoare, pe măsură ce este citit sau scris, este deplasată cu numărul de octeți citiți (scriși). Valoarea curentă a indicatorului de fișier este numărul de octeți de la care va avea loc operația de citire sau scriere.

Pentru închidere fișierul este destinat funcției fclose

int fclose(FIȘIER *nume fișier);

Returnează 0 dacă fișierul a fost închis cu succes, NULL în caz contrar.

Funcția de eliminare este pentru îndepărtare fişiere.

int remove(const char *nume fișier);

Această funcție șterge de pe disc un fișier numit fileenema. Fișierul de șters trebuie să fie închis. Funcția returnează o valoare diferită de zero dacă fișierul nu a putut fi șters.

Pentru redenumire fișiere, funcția de redenumire este destinată:

int rename(const char *oldfilename, const char *newfilename);

Primul parametru este numele vechiului fișier, al doilea este cel nou. Returnează 0 dacă programul se încheie cu succes.

Citind dintr-un fișier binar se face folosind funcția fread:

fread(void *ptr, size, n, FILE *filename);

Funcția fread citește n elemente cu dimensiunea dimensiunii din numele fișierului într-o matrice ptr. Funcția returnează numărul de elemente citite. După citirea dintr-un fișier, indicatorul acestuia este deplasat cu n*size octeți.

Record la un fișier binar se face folosind funcția fwrite:

fwrite(const void *ptr, size, n, FILE *filename);

Funcția fwrite scrie în fișier nume de fișier dintr-o matrice ptr de n elemente cu dimensiunea mărimii. Funcția returnează numărul de elemente scrise. După scrierea informațiilor în fișier, indicatorul este deplasat cu n*size octeți.

Pentru control la sfârșitul fișierului există o funcție de:

int feof(FIȘIER *nume fișier);

Returnează o valoare diferită de zero dacă se ajunge la sfârșitul fișierului.

EXEMPLU:

Creați un fișier binar D:\\game\\noobs.dat și scrieți n numere întregi și n numere reale în el.

#include „stdafx.h”

#include

folosind namespace std;

int main()

setlocale(LC_ALL, "RUS");

int n, i;

dublu a;

//creăm un fișier binar în modul de scriere

f=fopen("D:\\game\\noobs.dat", "wb");

// intrare numeren

cout<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//buclă pentru a introduce n numere reale

pentru (i=0; i

//introduceți următorul număr real

cout<<"a=";

cin>>a;

//scrierea unui număr real într-un fișier binar

fwrite(&a, sizeof(double), 1, f);

// închide fişier

fclose(f);

sistem(„pauză”);

returnează 0;

EXEMPLU:

Afișați conținutul fișierului binar D:\\game\\noobs.dat creat în sarcina anterioară

#include „stdafx.h”

#include

folosind namespace std;

int main()

setlocale(LC_ALL, "RUS");

int n, i;

dublu *a;

DOSAR *f; //descrieți variabila fișier

//deschideți fișierul binar existent în modul citire

//citește un număr întreg din fișier în variabila n

//ieșire n pe ecran

cout<<"n="<

//alocarea memoriei pentru o matrice de n numere

a=dublu nou[n];

//citește n numere reale din fișier în tabloul a

//Ieșiți matricea pe ecran

pentru (i=0; i

cout<

cout<

// închide fişier

fclose(f);

sistem(„pauză”);

returnează 0;

Fisier binar- structura secventiala a datelor, dupa deschiderea unui fisier, primul octet stocat in acesta este disponibil. Puteți scrie sau citi date dintr-un fișier secvenţial. Să presupunem că trebuie să numărați al cincisprezecelea număr și apoi primul. Folosind accesul secvenţial, acest lucru se poate face în felul următor:

int n, i;

dublu a;

DOSAR *f;

f=fopen("D:\\game\\noobs.dat", "rb");

pentru (i=0; i<15; i++)

fclose(f);

f=fopen("D:\\game\\noobs.dat", "rb");

fread(&a, sizeof(double), 1, f);

fclose(f);

După cum puteți vedea, citirea numerelor dintr-un fișier și apoi deschiderea din nou a fișierului nu este cea mai convenabilă modalitate. Va fi mult mai convenabil să folosiți funcția fseek pentru a muta indicatorul fișierului pe un octet dat.

int fseek(FIȘIER *nume fișier, offset int lung, origine int);

Funcția setează indicatorul de poziție a fișierului curent F în conformitate cu valorile de origine și offset. Parametrul offset este egal cu numărul de octeți cu care indicatorul fișierului va fi decalat în raport cu originea specificată de parametrul origine. Valoarea parametrului de origine trebuie să fie una dintre următoarele valori de offset definite în antetul stdio.h:

SEEK_SET - de la începutul fișierului;

SEEK_CUR - din pozitia curenta;

SEEK_END - de la sfârșitul fișierului.

Funcția returnează o valoare zero dacă operația a avut succes, diferită de zero dacă a avut loc un eșec în timpul execuției offsetului

Funcția fseek implementează de fapt accesul direct la orice valoare dintr-un fișier. Trebuie doar să știți locația (numărul de octeți) a valorii din fișier. Să ne uităm la utilizarea accesului direct în fișierele binare folosind următoarea problemă ca exemplu.

EXEMPLU

În fișierul binar D:\\game\\noobs.dat creat mai devreme, schimbați cele mai mari și cele mai mici numere reale.

Algoritmul de rezolvare a problemei constă din următoarele etape:

    citirea reale dintr-un fișier în matrice a.

    căutați în tabloul a valorile maxime (max) și minime (min) și numerele acestora (imax, imin).

    mutarea indicatorului de fișier la valoarea maximă și scrierea min.

    mutarea indicatorului de fișier la valoarea minimă și scrierea max.

Mai jos este textul programului pentru rezolvarea problemei cu comentarii.

#include „stdafx.h”

#include

folosind namespace std;

int main()

setlocale(LC_ALL, "RUS");

int n, i, imax, imin;

dublu *a, max, min;

DOSAR *f;

//deschide un fișier în modul citire-scriere

f=fopen("D:\\game\\noobs.dat", "rb+");

//citește numărul din fișier în variabila n

//numerele reale din fișier

fread(&n, sizeof(int), 1, f);

cout<<"n="<

//aloca memorie pentru stocarea numerelor reale,

//care va fi stocat în tabloul a

a=dublu nou[n];

//citește din fișier în matrice și numere reale

fread(a, sizeof(double), n, f);

//căutați elemente maxime și minime

//în tabloul a și indicii acestora

pentru (imax=imin=0, max=min=a, i=1; i

dacă (a[i]>max)

max=a[i];

dacă (a[i]

min=a[i];

// in miscare indicator La maxim element

fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);

// scrie elementul minim în loc de maxim

fwrite(&min, sizeof(double), 1, f);

// in miscare indicator La minim element

fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);

// scrie max în loc de elementul de fișier minim

fwrite(&max, sizeof(double), 1, f);

//închiderea fișierului

fclose(f);

//memorie libera

șterge [ ]A;

sistem(„pauză”);

– 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 de declarare a indicatorului de 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;

– marcați 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 o pereche de caractere text „line feed”, „carriage return” este înlocuit cu un singur caracter: „line feed” pentru toate funcțiile de scriere a datelor în fișier și 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 denumirea 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 nume_fișier și permisiuni „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ă finalizarea programului sau după închiderea fișierului temporar, 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 grupe: 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 octeților 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.