MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Citirea și scrierea fișierelor text

Fluxurile pentru lucrul cu fișiere text sunt obiecte pentru care nu este setat modul de deschidere ios::binary.

Scrierea în fișier

Pentru a scrie în fișier, se utilizează operatorul << pentru obiectele ofstream sau fstream (la fel ca la afișarea pe consolă):

#include <iostream>
#include <fstream>

int main()
{
    std::ofstream out;          // flux pentru scriere
    out.open("hello.txt");      // deschidem fișierul pentru scriere
    if (out.is_open())
    {
        out << "Hello World!" << std::endl;
    }
    out.close(); 
    std::cout << "File has been written" << std::endl;
}

Aici se presupune că fișierul hello.txt se află în aceeași folder ca fișierul sursă al programului. Acest mod de lucru va rescrie fișierul de fiecare dată. Dacă dorim să adăugăm text la sfârșitul fișierului, trebuie să utilizăm modul ios::app pentru deschiderea fișierului:

std::ofstream out("hello.txt", std::ios::app);
if (out.is_open())
{
    out << "Welcome to C++" << std::endl;
}
out.close();

Citirea din fișier

Dacă dorim să citim un întreg șir sau chiar toate șirurile dintr-un fișier, cel mai bine este să folosim funcția încorporată getline(), care primește fluxul de citire și variabila în care trebuie citit textul:

#include <iostream>
#include <fstream>
#include <string>     // pentru std::getline

int main()
{
    std::string line;

    std::ifstream in("hello.txt"); // deschidem fișierul pentru citire
    if (in.is_open())
    {
        while (std::getline(in, line))
        {
            std::cout << line << std::endl;
        }
    }
    in.close();     // închidem fișierul
}

De asemenea, pentru citirea datelor din fișier, pentru obiectele ifstream și fstream poate fi utilizat și operatorul >> (la fel ca la citirea de la consolă):

#include <iostream>
#include <fstream>
#include <vector>

struct Point
{
    Point(double x, double y): x{x}, y{y} {}
    double x;
    double y;
};

int main()
{
    std::vector<Point> points{ Point{0, 0}, Point{4, 5}, Point{-5, 7}};
      
    std::ofstream out("points.txt");
      
    if (out.is_open())
    {
        // scriem toate obiectele Point în fișier
        for (const Point& point: points)
        {
            out << point.x << " " << point.y << std::endl;
        }
    }
    out.close();
  
    std::vector<Point> new_points;
    std::ifstream in("points.txt"); // deschidem fișierul pentru citire
    if (in.is_open())
    {
        double x, y;
        while (in >> x >> y)
        {
            new_points.push_back(Point{x, y});
        }
    }
    in.close();
  
    for (const Point& point: new_points)
    {
        std::cout << "Point X: " << point.x << "\tY: " << point.y << std::endl;
    }
}

Aici, vectorul de structuri Point este scris într-un fișier.

for (const Point& point: points)
{
    out << point.x << " " << point.y << std::endl;
}

În acest caz, valorile variabilelor sunt separate de un spațiu. Fișierul va fi creat în formatul următor:

0 0
4 5
-5 7

Folosind operatorul >>, putem citi datele în mod secvențial în variabilele x și y și le putem folosi pentru a inițializa structura:

double x, y;
while (in >> x >> y)
{
    new_points.push_back(Point{x, y});
}

Totuși, trebuie menționat că acest mod de citire este limitat, deoarece atunci când citim fișierul, fluxul in folosește spațiile pentru a separa valorile și astfel citește aceste valori în variabilele x și y. Dacă trebuie să citim un șir care conține spații și alte date, acest mod nu va funcționa.