Poniżej zamieszczono przykładowy program ilustrujący zapis i odczyt plików w języku C++ zarówno w trybie tekstowym, jak i binarnym.
#include <iostream> #include <fstream> /* Nagłówek niezbędny dla obsługi plików */ int main() { using namespace std; /* Ścieżka względna do pliku - plik będzie utworzony w katalogu startowym programu. Można również podać ścieżkę bezwzględną, np. sciezka[] = "c:/dane/kontakty.txt" lub sciezka[] = "c:\\dane\\kontakty.txt" */ const char sciezka[] = "kontakty.txt"; /* Klasa std::ostream służy do zapisu plików. Domyślny konstruktor tworzy plik, jeżeli takowy nie istnieje albo nadpisuje istniejący plik usuwając poprzednią zawartość (!) */ ofstream plik_z(sciezka); if (plik_z.is_open()) { // Metoda is_open zwraca true, gdy otwarcie pliku powiodło się // Wpisz do pliku przykładowe dane plik_z << "Anna Nowak" << endl << 20 << endl; plik_z.close(); // Skończyliśmy używać plik, zamykamy } /* Klasa std::ifstream służy do odczytu pliku, domyślny konstruktor otwiera plik do odczytu w trybie tekstowym, co skutkuje m.in. automatyczną konwersją pary znaków kończących wiersz \r\n (CR + LF) na pojedynczy znak \n w przypadku systemu Windows. */ ifstream plik_o(sciezka); if (plik_o.is_open()) { // 1. Sposób odczytu - wiersz po wierszu string wiersz; while( getline(plik_o, wiersz) ) { cout << wiersz << endl; } cout << "Czy koniec pliku: " << plik_o.eof() << endl; // Gdy bit oznaczający koniec pliku jest ustawiony (eof() == 1) to // wszystkie operacje na strumieniu będą ignorowane, aż do jego // wyzerowania plik_o.clear(); // Zeruje bity eofbit, failbit i badbit // Kursor po odczycie znajduje się za ostatnim znakiem cout << "Pozycja kursora w pliku: " << plik_o.tellg() << endl; plik_o.seekg(0); // Przesuń kursor na początek pliku // 2. Sposób odczytu - formatowany string imie, nazwisko; int wiek; plik_o >> imie >> nazwisko >> wiek; // wczytuj do podanych zmiennych cout << "Wczytałem: " << imie << " " << nazwisko << " " << wiek << endl; plik_o.close(); // 3. Sposób - odczyt znak po znaku plik_o.open(sciezka, ios::binary); // binary wyłącza konwersję CR+LF -> \n w Windows char z; while ( plik_o.get(z) ) { // Odczyt znak po znaku, nie pomija spacji cout << z; } plik_o.close(); } // Dopisz dane do istniejącego pliku const char tel[] = "123-456-789"; plik_z.open(sciezka, ios::app); // Otwórz w trybie dopisywania plik_z << tel; plik_z.close(); // Klasa std::fstream pozwala zarówno na odczyt, jak i zapis danych fstream plik_oz(sciezka); string imie, nazwisko, nr_tel; int wiek; plik_oz >> imie >> nazwisko >> wiek >> nr_tel; // Odczyt formatowany cout << "Wczytałem: " << imie << " " << nazwisko << " " << wiek << " " << nr_tel << endl; // Ups, nr tel. jest błędny - cofnij pozycję w pliku i nadpisz streampos poz = plik_oz.tellp(); // pobierz aktualną pozycję kursora w pliku cout << "Aktualna pozycja kursora w pliuk: " << poz << endl; poz -= nr_tel.size(); // zmniejsz pozycję o liczbę znaków z których składa się nr tel. plik_oz.seekg(poz); // cofnij za pomocą metody seekg // zamiast powyższego wystarczy: plik_oz.seekg(-int(nr_tel.size()), plik_oz.cur) plik_oz << "123-456-777" << endl; // nadpisz stary nr tel. nowym plik_oz.close(); int liczby[] = { 1, 2, 3 }; // Zapis binarny do pliku wymaga otwarcia go w trybie ios::binary ofstream bin_z("liczby.dat", ios::binary); if (bin_z.is_open()) { // Zapisz całą tablicę jako ciąg bajtów (char), drugi par. to liczba // bajtów do zapisu bin_z.write( (char *)liczby, 3 * sizeof(int) ); bin_z.close(); } // Odczyt danych binarnych ifstream bin_o("liczby.dat", ios::binary); if (bin_o.is_open()) { // Odczytaj całą tablicę jako ciąg bajtów (char), drugi par. to liczba // bajtów do odczytu int liczby2[3] = { 0 }; bin_o.read((char *)liczby2, 3 * sizeof(int)); bin_o.close(); for (int i = 0; i < 3; ++i) { cout << liczby2[i] << endl; } } return 0; } |