C++: Podstawy obsługi plików

Darmowy Kurs C++ Online

Darmowy Kurs C++ Online

Temat: C++: Podstawy obsługi plików

W C++, obsługa plików tekstowych odbywa się głównie za pomocą biblioteki iostream oraz jej klas: fstream, ifstream i ofstream.

 

Rodzaje plików tekstowych
  1. Zwykłe Pliki Tekstowe (.txt): Są podstawowym formatem do przechowywania prostych danych tekstowych. Ich zaletą jest prosta struktura i łatwość w odczycie zarówno przez ludzi, jak i programy komputerowe.

  2. Pliki CSV (Comma-Separated Values): Używane do przechowywania danych w formie tabelarycznej, gdzie każdy wiersz to jeden rekord, a poszczególne wartości są oddzielone przecinkami. CSV jest często stosowany do importu i eksportu danych z arkuszy kalkulacyjnych i baz danych.

  3. Pliki Konfiguracyjne (np. .ini, .cfg): Te pliki zawierają ustawienia i parametry konfiguracyjne aplikacji, często w formacie klucz-wartość. Są one używane do personalizacji i dostosowania działania programów.

  4. Pliki XML/JSON: Są to formaty plików, które pozwalają na zapis skomplikowanych struktur danych w sposób hierarchiczny. XML jest często stosowany w aplikacjach sieciowych i do konfiguracji, podczas gdy JSON jest popularny w rozwiązaniach webowych i mobilnych ze względu na swoją prostotę i kompatybilność z JavaScript.

 

Otwieranie i Zamykanie Plików

W C++ do pracy z plikami wykorzystywane są trzy główne klasy biblioteki fstream:

  1. fstream: Klasa ogólna do pracy z plikami, umożliwiająca zarówno czytanie, jak i zapis. Jest używana, gdy potrzebujemy obu tych funkcji jednocześnie.

  2. ifstream (Input File Stream): Specjalizowana klasa do odczytywania danych z plików. Jest ona wykorzystywana, gdy naszym głównym celem jest czytanie danych z pliku.

  3. ofstream (Output File Stream): Klasa dedykowana do zapisu danych do plików. Stosowana, gdy nasz program głównie zapisuje informacje do pliku.

 

Otwieranie Plików

Otwieranie plików w C++ realizowane jest poprzez utworzenie instancji odpowiedniej klasy (ifstream, ofstream, fstream) i powiązanie jej z konkretnym plikiem. Możemy to zrobić na dwa sposoby:

 

Podczas tworzenia obiektu: Przy tworzeniu instancji klasy przekazujemy ścieżkę do pliku jako argument konstruktora.

ifstream inputFile("example.txt");
ofstream outputFile("output.txt");

 

Używając metody open(): Utworzymy najpierw obiekt, a następnie wykorzystamy metodę open(), by otworzyć konkretny plik.

ifstream inputFile;
inputFile.open("example.txt");

Pliki można otwierać w różnych trybach (np. do odczytu, zapisu, dopisywania na końcu), wybierając odpowiedni flagi w konstruktorze lub metodzie open.

 

Zamykanie Plików

Po zakończeniu pracy z plikiem należy go zamknąć. Można to zrobić na dwa sposoby:

  1. Automatycznie: Gdy obiekt klasy strumienia pliku wychodzi poza zakres (np. na końcu funkcji), plik jest zamykany automatycznie przez destruktor.

  2. Ręcznie: Używając metody close().

 

inputFile.close();
outputFile.close();

Zamykanie plików jest ważne, by zwolnić zasoby systemowe i zapewnić zapis wszystkich danych do pliku.

 

Weryfikacja Dostępności Pliku

W języku C++ możliwe jest sprawdzenie, czy plik istnieje i jest dostępny do odczytu lub zapisu,

 

Po próbie otwarcia pliku za pomocą fstream, ifstream, czy ofstream, można sprawdzić, czy operacja się powiodła, korzystając z metody is_open():

ifstream inputFile("example.txt");
if (!inputFile.is_open()) {
    cerr << "Nie można otworzyć pliku." << endl;
}

 

lub sprawdzając stan strumienia w instrukcji warunkowej:

ifstream inputFile("example.txt");
    // Bezpośrednie sprawdzenie stanu strumienia
    if (!inputFile) {
        cerr << "Nie można otworzyć pliku." << endl;
    } else {
        // Kontynuacja operacji na pliku
        cout << "Plik został pomyślnie otwarty." << endl;
        // Operacje na pliku...
    }
    inputFile.close();

 

Obsługa Błędów

Po wykonaniu operacji na pliku, możemy sprawdzić stan strumienia (np. po zapisie, czy odczycie) za pomocą metod good(), eof(), fail(), i bad().

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile) {
        cerr << "Nie można otworzyć pliku." << endl;
        return 1; // Zakończ program, jeśli plik nie może być otwarty
    }

    // Przeprowadź operacje na pliku
    // ...

    // Sprawdzenie różnych stanów strumienia
    if (inputFile.good()) {
        cout << "Operacja na pliku zakończona pomyślnie." << endl;
    }
    if (inputFile.eof()) {
        cout << "Koniec pliku osiągnięty." << endl;
    }
    if (inputFile.fail()) {
        cerr << "Błąd podczas odczytu pliku." << endl;
    }
    if (inputFile.bad()) {
        cerr << "Krytyczny błąd wejścia/wyjścia." << endl;
    }

    inputFile.close();
    return 0;
}

 

Testy przypięte do lekcji
Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się
Aby widzieć ocenę lekcji - Zaloguj się