Salvarea unei matrice într-un fișier text C. Intrare din fișier și ieșire în fișier

Ultima actualizare: 31.10.2015

Clasă FileStream reprezintă capacitățile de a citi dintr-un fișier și de a scrie într-un fișier. Vă permite să lucrați atât cu fișiere text, cât și cu cele binare.

Să luăm în considerare cele mai importante proprietăți și metode ale sale:

    Proprietatea Length: returnează lungimea fluxului în octeți

    Proprietatea poziției: returnează poziția curentă în flux

    Metoda de citire: citește datele dintr-un fișier într-o matrice de octeți. Preia trei parametri: int Read(byte array, int offset, int count) și returnează numărul de octeți citiți cu succes. Următorii parametri sunt utilizați aici:

    • matrice - o matrice de octeți în care vor fi plasate datele citite din fișier

      offset reprezintă offset-ul în octeți din matricea în care vor fi plasați octeții citiți

      count - numărul maxim de octeți care trebuie citiți. Dacă există mai puțini octeți în fișier, atunci toți vor fi citiți.

    Metodă Long Seek (offset lung, origine SeekOrigin): setează poziția în flux cu un offset cu numărul de octeți specificat în parametrul offset.

    Metoda de scriere: scrie date dintr-o matrice de octeți într-un fișier. Ia trei parametri: Write(byte array, int offset, int count)

    • matrice - o matrice de octeți din care datele vor fi scrise în fișier

      offset - decalajul în octeți din matricea de unde încep să se scrie octeții în flux

      count - numărul maxim de octeți de scris

FileStream reprezintă accesul la fișier la nivel de octet, deci, de exemplu, dacă trebuie să citiți sau să scrieți una sau mai multe linii într-un fișier text, atunci matricea de octeți trebuie convertită în șiruri de caractere folosind metode speciale. Prin urmare, alte clase sunt folosite pentru a lucra cu fișiere text.

În același timp, atunci când lucrați cu diferite fișiere binare care au o anumită structură, FileStream poate fi foarte util pentru extragerea anumitor informații și procesarea acestora.

Să ne uităm la un exemplu de citire și scriere într-un fișier text:

Console.WriteLine("Introduceți o linie pentru a scrie în fișier:"); string text = Console.ReadLine(); // scrierea într-un fișier utilizând (FileStream fstream = new FileStream(@"C:\SomeDir\noname\note.txt", FileMode.OpenOrCreate)) ( // convertiți șirul în bytes byte array = System.Text.Encoding. Implicit. GetBytes(text); // scrierea unei matrice de octeți într-un fișier fstream.Write(array, 0, array.Length); Console.WriteLine("Text scris în fișier"); ) // citirea dintr-un fișier folosind (FileStream fstream = Fișier. OpenRead(@"C:\SomeDir\noname\note.txt")) ( // convertește șirul în octeți byte array = octet nou; // citește datele fstream.Read(array, 0, array.Length); // decodifică octeți în șirul textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine ("Text din fișier: (0)", textFromFile); ) Console.ReadLine() ;

Să ne uităm la acest exemplu. Atât citirea cât și scrierea folosesc declarația using. Această declarație nu trebuie confundată cu directiva using, care include spații de nume la începutul fișierului de cod. Instrucțiunea using vă permite să creați un obiect într-un bloc de cod, după finalizarea căruia este apelată metoda Dispose a acelui obiect și astfel obiectul este distrus. În acest caz, variabila fstream servește ca un astfel de obiect.

Obiectul fstream este creat în două moduri diferite: prin constructor și printr-una dintre metodele statice ale clasei File.

Aici doi parametri sunt trecuți constructorului: calea fișierului și enumerarea FileMode. Această enumerare indică modul de acces la fișier și poate lua următoarele valori:

    Adăugați: dacă fișierul există, textul este atașat la sfârșitul fișierului. Dacă fișierul nu există, acesta este creat. Fișierul este deschis doar pentru scriere.

    Creare: este creat un fișier nou. Dacă un astfel de fișier există deja, acesta este suprascris

    CreateNew: este creat un nou fișier. Dacă un astfel de fișier există deja, atunci aplicația aruncă o eroare

    Deschide: Deschide un fișier. Dacă fișierul nu există, se aruncă o excepție

    OpenOrCreate : dacă fișierul există, acesta este deschis, dacă nu, se creează unul nou

    Trunchiați: dacă fișierul există, acesta este suprascris. Fișierul este deschis doar pentru scriere.

Metoda statică OpenRead a clasei File deschide un fișier pentru citire și returnează un obiect FileStream.

Constructorul clasei FileStream are, de asemenea, o serie de supraîncărcări care vă permit să personalizați mai precis obiectul creat. Toate aceste versiuni pot fi vizualizate pe msdn.

Atât scrierea, cât și citirea folosesc obiectul de codificare Encoding.Default din spațiul de nume System.Text. În acest caz, folosim două dintre metodele sale: GetBytes pentru a obține o matrice de octeți dintr-un șir și GetString pentru a obține un șir dintr-o matrice de octeți.

Drept urmare, șirul pe care l-am introdus este scris în fișier notă.txt. În esență, acesta este un fișier binar (nu un fișier text), deși dacă scriem doar o linie în el, putem vizualiza acest fișier într-o formă care poate fi citită de om, deschizându-l într-un editor de text. Cu toate acestea, dacă scriem octeți aleatori în el, de exemplu:

Fstream.WriteByte(13); fstream.WriteByte(103);

Atunci s-ar putea să avem probleme în a înțelege. Prin urmare, clasele separate sunt concepute pentru a funcționa direct cu fișiere text - StreamReader și StreamWriter.

Acces aleatoriu la fișiere

Adesea fișierele binare reprezintă o structură specifică. Și, cunoscând această structură, putem lua informația necesară din fișier sau, dimpotrivă, putem scrie un anumit set de octeți într-un anumit loc din fișier. De exemplu, în fișierele wav, datele audio în sine încep de la 44 de octeți, iar până la 44 de octeți există diverse metadate - numărul de canale audio, frecvența de eșantionare etc.

Folosind metoda Seek() putem controla poziția cursorului de flux, pornind de la care este citit sau scris fișierul. Această metodă ia doi parametri: offset și poziția în fișier. O poziție într-un fișier este descrisă de trei valori:

    SeekOrigin.Begin : începutul fișierului

    SeekOrigin.End : sfârșitul fișierului

    SeekOrigin.Current : poziția curentă în fișier

Cursorul fluxului de la care începe citirea sau scrierea este deplasat înainte prin offset față de poziția specificată ca al doilea parametru. Offset-ul poate fi negativ, apoi cursorul se deplasează înapoi, dacă este pozitiv, apoi înainte.

Să ne uităm la un exemplu:

Utilizarea System.IO; folosind System.Text; Class Program ( static void Main(string args) ( string text = "hello world"; // scrierea într-un fișier folosind (FileStream fstream = new FileStream(@"D:\note.dat", FileMode.OpenOrCreate)) ( / / convertiți șirul în octeți byte input = Encoding.Default.GetBytes(text); // scrieți o matrice de octeți într-un fișier fstream.Write(input, 0, input.Length); Console.WriteLine("Text scris în fișier "); // mutați indicatorul la sfârșitul fișierului, cinci octeți până la sfârșitul fișierului fstream.Seek(-5, SeekOrigin.End); // minus 5 caractere de la sfârșitul fluxului // citește patru caractere din poziția curentă byte output = new byte; fstream.Read( output, 0, output.Length); // decodifică octeții într-un șir textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Text din fișier: (0)", textFromFile); // worl // înlocuiește în fișier cuvântul lume cu cuvântul house șir replaceText = "house"; fstream.Seek(-5, SeekOrigin.End); // minus 5 caractere de la sfârșitul fluxului de intrare = Encoding.Default.GetBytes(replaceText);fstream.Write(input , 0, input.Length); // citește întregul fișier // returnează pointerul la începutul fișierului fstream.Seek(0, SeekOrigin.Begin); ieșire = octet nou; fstream.Read(ieșire, 0, ieșire.Lungime); // decodifică octeții într-un șir textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Text din fișier: (0)", textFromFile); // salut casa ) Console.Read(); ) )

Ieșire din consolă:

Text scris în fișier Text din fișier: worl Text din fișier: salut casă

Apelarea fstream.Seek(-5, SeekOrigin.End) mută cursorul fluxului la sfârșitul fișierelor înapoi cu cinci caractere:

Adică, după ce ați scris linia „hello world” într-un fișier nou, cursorul se va afla în poziția caracterului „w”.

După aceasta, citim patru octeți care încep cu caracterul „w”. În această codificare, 1 caracter va reprezenta 1 octet. Prin urmare, citirea a 4 octeți va echivala cu citirea a patru caractere: „lumea”.

Apoi, din nou, trecem la sfârșitul fișierului, fără a ajunge la sfârșitul a cinci caractere (adică din nou din poziția caracterului „w”) și scriem șirul „casa”. Deci șirul „casa” înlocuiește șirul „lume”.

Închiderea unui fir

În exemplele de mai sus, o construcție de utilizare este utilizată pentru a închide un flux. După ce toți operatorii și expresiile din blocul de utilizare au fost procesate, obiectul FileStream este distrus. Cu toate acestea, putem alege o altă cale:

FileStream fstream = nul; încercați ( fstream = new FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // operațiuni cu fluxul ) catch(Exception ex) ( ) finally ( if (fstream != null) fstream.Close() ;)

Dacă nu folosim construcția using, atunci trebuie să apelăm în mod explicit metoda Close(): fstream.Close()

Pentru a facilita accesul, informațiile din dispozitivele de stocare sunt stocate sub formă de fișiere.

Un fișier este o zonă denumită a memoriei externe alocată pentru stocarea unei matrice de date. Datele conținute în fișiere sunt de natură foarte diversă: programe în limbaj algoritmic sau mașină; date inițiale pentru funcționarea programului sau rezultatele execuției programului; texte libere; imagini grafice etc.

Director (dosar, director) - o colecție numită de octeți pe un mediu de stocare care conține numele subdirectoarelor și fișierelor, utilizate în sistemul de fișiere pentru a simplifica organizarea fișierelor.

Sistemul de fișiere numită partea funcțională a sistemului de operare care efectuează operațiuni asupra fișierelor. Exemple de sisteme de fișiere sunt FAT (FAT - File Allocation Table), NTFS, UDF (utilizat pe CD-uri).

Există trei versiuni principale de FAT: FAT12, FAT16 și FAT32. Ele diferă prin adâncimea de biți a înregistrărilor din structura discului, adică numărul de biți alocați pentru a stoca numărul clusterului. FAT12 este folosit în principal pentru dischete (până la 4 KB), FAT16 – pentru discuri de capacitate mică, FAT32 – pentru unități FLASH de mare capacitate (până la 32 GB).

Să ne uităm la structura sistemului de fișiere folosind FAT32 ca exemplu.

Structura fișierului FAT32

Dispozitivele de memorie externe din sistemul FAT32 au mai degrabă adresare bloc decât adresare octet. Informațiile sunt scrise pe un dispozitiv de memorie extern în blocuri sau sectoare.

Un sector este unitatea minimă adresabilă de stocare a informațiilor pe dispozitivele de stocare externe. De obicei, dimensiunea sectorului este fixată la 512 octeți. Pentru a mări spațiul de adrese al dispozitivelor de memorie externe, sectoarele sunt combinate în grupuri numite clustere.

Un cluster este o unire a mai multor sectoare, care poate fi considerată ca o unitate independentă cu anumite proprietăți. Proprietatea principală a unui cluster este dimensiunea sa, măsurată în numărul de sectoare sau numărul de octeți.

Sistemul de fișiere FAT32 are următoarea structură.

Clusterele utilizate pentru scrierea fișierelor sunt numerotate începând de la 2. De regulă, clusterul nr. 2 este folosit de directorul rădăcină, iar începând de la clusterul nr. 3 se stochează matricea de date. Sectoarele utilizate pentru stocarea informațiilor deasupra directorului rădăcină nu sunt grupate.
Dimensiunea minimă de fișier necesară pe disc corespunde unui cluster.

Sectorul de boot începe cu următoarele informații:

  • EB 58 90 – săritură necondiționată și semnătură;
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 – numărul de octeți din sector (de obicei 512);
  • 1 octet – numărul de sectoare din cluster;
  • 2 octeți – numărul de sectoare de rezervă.

În plus, sectorul de boot conține următoarele informații importante:

  • 0x10 (1 octet) – numărul de tabele FAT (de obicei 2);
  • 0x20 (4 octeți) – numărul de sectoare de pe disc;
  • 0x2С (4 octeți) – numărul de cluster al directorului rădăcină;
  • 0x47 (11 octeți) – etichetă de volum;
  • 0x1FE (2 octeți) – semnătura sectorului de pornire (55 AA).

Sectorul de informații despre sistemul de fișiere conține:

  • 0x00 (4 octeți) – semnătură (52 52 61 41);
  • 0x1E4 (4 octeți) – semnătură (72 72 41 61);
  • 0x1E8 (4 octeți) – numărul de clustere libere, -1 dacă necunoscut;
  • 0x1EC (4 octeți) – numărul ultimului cluster înregistrat;
  • 0x1FE (2 octeți) – semnătură (55 AA).

Tabelul FAT conține informații despre starea fiecărui cluster de pe disc. Cei 2 octeți inferiori ai tabelului FAT stochează F8 FF FF 0F FF FF FF FF FF (care corespunde stării clusterelor 0 și 1, care lipsesc fizic). În continuare, starea fiecărui cluster conține numărul clusterului în care fișierul curent continuă sau următoarele informații:

  • 00 00 00 00 – clusterul este liber;
  • FF FF FF 0F – sfârșitul fișierului curent.
  • 8 octeți – numele fișierului;
  • 3 octeți – extensia fișierului;

Directorul rădăcină conține un set de înregistrări de informații pe 32 de biți despre fiecare fișier, care conține următoarele informații:

Când lucrați cu nume lungi de fișiere (inclusiv nume rusești), numele fișierului este codificat folosind sistemul de codare UTF-16. În acest caz, 2 octeți sunt alocați pentru codificarea fiecărui caracter. În acest caz, numele fișierului este scris în următoarea structură:

  • 1 octet secvență;
  • 10 octeți conțin cele 5 caractere inferioare ale numelui fișierului;
  • atribut de 1 octet;
  • 1 octet rezervat;
  • 1 octet – suma de control al numelui DOS;
  • 12 octeți conțin cele 3 caractere inferioare ale numelui fișierului;
  • 2 octeți – numărul primului cluster;
  • caracterele rămase ale numelui lung.

Lucrul cu fișiere în limbaj C

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ă 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),
tipul este un 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ți 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ă, atunci este creat.

Valoarea returnată este un pointer către fluxul deschis. Dacă se întâlnește 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include
int main() (
FIȘIER *fp;
numele caracterului = "my.txt" ;
if ((fp = fopen(nume, "r" )) == NULL )
{
printf( "Deschiderea fișierului a eșuat");
getchar();
întoarce 0;
}
// am reușit să deschid fișierul
... // acțiuni necesare asupra datelor
fclose(fp);
getchar();
întoarce 0;
}

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 de fișier ca prim argument.

fscanf(stream, „InputFormat”, argumente);

Majoritatea programelor de calculator funcționează cu fișiere și, prin urmare, este nevoie de a crea, șterge, scrie, citi, deschide fișiere. Ce este un fișier? Un fișier este un set numit de octeți care poate fi stocat pe un dispozitiv de stocare. Ei bine, acum este clar că un fișier înseamnă o anumită secvență de octeți care are propriul nume unic, de exemplu file.txt. Fișierele cu aceleași nume nu pot fi localizate în același director. Numele fișierului se referă nu numai la numele său, ci și la extensia acestuia, de exemplu: fișier.txt și fișier.dat fișiere diferite, deși au aceleași nume. Există un nume de fișier complet - aceasta este adresa completă a directorului de fișiere care indică numele fișierului, de exemplu: D:\docs\file.txt. Este important să înțelegeți aceste concepte de bază, altfel va fi dificil să lucrați cu fișiere.

Pentru a lucra cu fișiere, trebuie să includeți un fișier antet . ÎN sunt definite mai multe clase și sunt incluse fișiere de antet fişier de intrare şi ieșire fișier.

File I/O este similar cu I/O standard, singura diferență este că I/O este efectuată mai degrabă către un fișier decât către ecran. Dacă I/O către dispozitive standard se realizează folosind obiectele cin și cout, atunci pentru a organiza I/O fișiere este suficient să creați propriile obiecte care pot fi utilizate în mod similar cu operatorii cin și cout.

De exemplu, trebuie să creați un fișier text și să scrieți în el linia Lucru cu fișierele în C++. Pentru a face acest lucru, trebuie să urmați următorii pași:

  1. creați un obiect din clasa ofstream ;
  2. asociați un obiect de clasă cu fișierul în care urmează să fie scris;
  3. scrieți o linie într-un fișier;
  4. închideți fișierul.

De ce este necesar să se creeze un obiect ofstream mai degrabă decât un obiect ifstream? Deoarece trebuie să scrieți într-un fișier și, dacă aveți nevoie să citiți date dintr-un fișier, ar fi creat un obiect de clasă ifstream.

// creează un obiect pentru scriere în fișierul fluxului /*nume obiect*/; // obiect al clasei de flux

Să numim obiectul fout. Iată ce obținem:

Ofstream fout;

De ce avem nevoie de un obiect? Obiectul este necesar pentru a putea scrie într-un fișier. Obiectul a fost deja creat, dar nu este asociat cu fișierul în care trebuie scris șirul.

Fout.open("cppstudio.txt"); // asociem obiectul cu fișierul

Prin operația punct, obținem acces la metoda clasei open(), în care indicăm numele fișierului în paranteze. Fișierul specificat va fi creat în directorul curent cu programul. Dacă există un fișier cu același nume, fișierul existent va fi înlocuit cu cel nou. Deci, fișierul este deschis, tot ce rămâne este să scrieți linia necesară în el. Acest lucru se face astfel:

Fout<< "Работа с файлами в С++"; // запись строки в файл

Folosind operația de flux împreună cu obiectul fout, șirul Lucru cu fișiere în C++ este scris într-un fișier. Deoarece nu mai este nevoie să se schimbe conținutul fișierului, acesta trebuie închis, adică obiectul trebuie separat de fișier.

Fout.close(); // închide fișierul

Rezultat - a fost creat un fișier cu linia Lucru cu fișiere în C++.

Pașii 1 și 2 pot fi combinați, adică într-o singură linie, creați un obiect și asociați-l cu un fișier. Acest lucru se face astfel:

Ofstream fout("cppstudio.txt"); // creează un obiect din clasa ofstream și îl asociază cu fișierul cppstudio.txt

Să combinăm tot codul și să obținem următorul program.

// file.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include folosind namespace std; int main(int argc, char* argv) ( ofstream fout("cppstudio.txt"); // creează un obiect din clasa ofstream pentru înregistrare și îl asociază cu fișierul cppstudio.txt fout<< "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

Rămâne să verificați dacă programul funcționează corect și, pentru a face acest lucru, deschideți fișierul cppstudio.txt și uită-te la conținutul său, ar trebui să fie - Lucrul cu fișiere în C++.

  1. creați un obiect din clasa ifstream și asociați-l cu fișierul din care se va efectua citirea;
  2. citiți fișierul;
  3. închideți fișierul.
// file_read.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include #include folosind namespace std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // afișarea corectă a caracterului chirilic buff; // buffer pentru stocarea intermediară a textului citit dintr-un fișier ifstream fin("cppstudio.txt") ; // a deschis fișierul pentru a citi fin >><< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

Programul arată două moduri de a citi dintr-un fișier, primul folosește operația de transfer într-un flux, al doilea folosește funcția getline() . În primul caz, se citește doar primul cuvânt, iar în al doilea caz se citește un șir de 50 de caractere. Dar, din moment ce au rămas mai puțin de 50 de caractere în fișier, caracterele până la ultimul inclusiv sunt citite. Vă rugăm să rețineți că citiți a doua oară (linia 17) a continuat după primul cuvânt, și nu de la început, deoarece primul cuvânt a fost citit înlinia 14. Rezultatul programului este prezentat în Figura 1.

Lucrul cu fișierele în C++ Pentru a continua, apăsați orice tastă. . .

Figura 1 - Lucrul cu fișiere în C++

Programul a funcționat corect, dar acest lucru nu se întâmplă întotdeauna, chiar dacă totul este în ordine cu codul. De exemplu, numele unui fișier inexistent a fost transmis programului sau a existat o eroare în nume. Ce atunci? În acest caz, nu se va întâmpla absolut nimic. Fișierul nu va fi găsit, ceea ce înseamnă că nu va fi posibil să îl citiți. Prin urmare, compilatorul va ignora liniile în care se lucrează la fișier. Ca urmare, programul se va închide corect, dar nimic nu va fi afișat pe ecran. S-ar părea că aceasta este o reacție complet normală la o astfel de situație. Dar un simplu utilizator nu va înțelege ce se întâmplă și de ce linia din fișier nu a apărut pe ecran. Deci, pentru a clarifica totul, C++ oferă o astfel de funcție - is_open(), care returnează valori întregi: 1 - dacă fișierul a fost deschis cu succes, 0 - dacă fișierul nu a fost deschis. Să modificăm programul prin deschiderea unui fișier, astfel încât dacă fișierul nu este deschis, să fie afișat un mesaj corespunzător.

// file_read.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include #include folosind namespace std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // afișarea corectă a caracterului chirilic buff; // buffer pentru stocarea intermediară a textului citit dintr-un fișier ifstream fin("cppstudio.doc") ; // ( AI INTRODAT UN NUME DE FIȘIER INVALID) dacă (!fin.is_open()) // dacă fișierul nu este deschis<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >> buff; // am numărat primul cuvânt din fișierul cout<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

Rezultatul programului este prezentat în Figura 2.

Fișierul nu poate fi deschis! Pentru a continua, apăsați orice tastă. . .

Figura 2 - Lucrul cu fișiere în C++

După cum se poate vedea din Figura 2, programul a raportat că a fost imposibil să deschideți fișierul. Prin urmare, dacă programul funcționează cu fișiere, este recomandat să utilizați această funcție, is_open(), chiar dacă sunteți sigur că fișierul există.

Moduri de deschidere a fișierelor

Modurile de deschidere a fișierelor determină modul în care sunt utilizate fișierele. Pentru a seta modul, clasa ios_base oferă constante care determină modul de deschidere a fișierului (vezi Tabelul 1).

Modurile de deschidere a fișierelor pot fi setate direct la crearea unui obiect sau la apelarea funcției open(). .

Ofstream fout("cppstudio.txt", ios_base::app); // deschideți fișierul pentru a adăuga informații la sfârșitul fișierului fout.open("cppstudio.txt", ios_base::app); // deschideți fișierul pentru a adăuga informații la sfârșitul fișierului

Modurile de deschidere a fișierelor pot fi combinate folosind o operație logică pe biți sau| , de exemplu: ios_base::out | ios_base::trunc - deschide un fișier pentru scriere după ce îl șterge.

Obiectele clasei ofstream, atunci când sunt asociate cu fișiere, conțin implicit moduri de deschidere a fișierelor ios_base::out | ios_base::trunc . Adică, fișierul va fi creat dacă nu există. Dacă fișierul există, conținutul acestuia va fi șters, iar fișierul în sine va fi gata de scris. Obiectele clasei ifstream, atunci când sunt asociate cu un fișier, au modul implicit de deschidere a fișierului ios_base::in - fișierul este deschis doar pentru citire. Modul de deschidere a fișierului se mai numește și steag; pentru lizibilitate, vom folosi acest termen în viitor. Tabelul 1 nu listează toate steaguri, dar acestea ar trebui să fie suficiente pentru a începe.

Rețineți că steagurile ate și aplicația sunt foarte asemănătoare ca descriere, ambele mută indicatorul la sfârșitul fișierului, dar stegulețul aplicației permite doar scrierea la sfârșitul fișierului, iar stegulețul ate mută pur și simplu indicatorul la sfârșit. a fișierului și nu limitează unde să scrieți.

Să dezvoltăm un program care, folosind operația sizeof(), va calcula caracteristicile principalelor tipuri de date din C++ și le va scrie într-un fișier. Caracteristici:

  1. numărul de octeți alocați pentru tipul de date
  2. valoarea maximă pe care o poate stoca un anumit tip de date.

Fișierul trebuie scris în următorul format:

/* tip de date octet valoare maximă bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 429490672 long int 4 7 4. semnat lung int = 4 4294967295.00 float = 4 2147483647,00 float lung = 8 9223372036854775800,00 dublu = 8 9223372036854775800,00 */

Un astfel de program a fost deja dezvoltat mai devreme în secțiune, dar acolo toate informațiile despre tipurile de date au fost trimise pe dispozitivul de ieșire standard și trebuie să refacem programul, astfel încât informațiile să fie scrise într-un fișier. Pentru a face acest lucru, trebuie să deschideți fișierul în modul de scriere, cu trunchierea preliminară a informațiilor despre fișierul curent ( linia 14). Odată ce fișierul este creat și deschis cu succes (liniile 16 - 20), în loc de instrucțiunea cout, în linia 22 folosim obiectul fout. astfel, în loc de ecran, informații despre tipurile de date vor fi scrise într-un fișier.

// write_file.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include #include // lucrul cu fișierele #include // manipulatoare de intrare/ieșire folosind namespace std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // asociați obiectul cu fișierul și deschideți fișierul în modul de scriere, ștergând mai întâi toate datele din acesta ofstream fout("data_types.txt ", ios_base::out | ios_base::trunc); if (!fout.is_open()) // dacă fișierul nu a fost deschis ( cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value "<< endl // anteturi de coloană <<"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout << "Данные успешно записаны в файл data_types.txt\n"; system("pause"); return 0; }

Este imposibil să nu observați că modificările în program sunt minime și totul datorită faptului că intrarea/ieșirea standard și intrarea/ieșirea fișierelor sunt utilizate exact în același mod. La finalul programului, la oralinia 45Am închis în mod explicit fișierul, deși acest lucru nu este necesar, dar este considerat o bună practică de programare. Este demn de remarcat faptul că toate funcțiile și manipulatoarele utilizate pentru a formata intrarea/ieșirea standard sunt, de asemenea, relevante pentru intrarea/ieșirea fișierelor. Prin urmare, nu au apărut erori la declarația cout a fost înlocuit cu un obiect fout.

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 ifstream-uri;

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 adevărat, altfel fals. 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 de î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 de scriere mai întâi, ar trebui să utilizați ios::app ca mod.

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ă”);

întoarce 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 întrerupe 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ă”);

întoarce 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 numara b date dintr-un fișier binar, aveți nevoie de:

    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ă NULL în variabila de fișier f dacă fișierul se deschide fără succes. 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șierul nume de fișier dintr-o matrice ptr de n elemente de dimensiune. 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ă”);

întoarce 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șierului

//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ă”);

întoarce 0;

Fisier binar- structură secvenţială a datelor, după deschiderea unui fişier, primul octet stocat în 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, o valoare diferită de zero dacă offset-ul a eșuat.

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

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

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

//închiderea fișierului

fclose(f);

//eliberarea memoriei

șterge [ ]A;

sistem(„pauză”);

Am învățat deja cum să scriem informații într-un fișier text. – 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 și 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)
============================
Să scriem un program simplu care va citi textul introdus 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ă prima linie
afară<Scrie a doua linie
afară<Notează a treia linie
out.close(); //Închiderea dosarului

//Resetați variabilele

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


ifstream in(„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ă prima linie
afară<Scrie a doua linie
afară<Notează a treia linie
out.close(); //Închiderea dosarului

//Resetați variabilele

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)– Se citește ca și cum A nu este egal b

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

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva