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
-
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.
-
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.
-
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.
-
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:
-
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.
-
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.
-
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:
-
Automatycznie: Gdy obiekt klasy strumienia pliku wychodzi poza zakres (np. na końcu funkcji), plik jest zamykany automatycznie przez destruktor.
-
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ę |