Nie kojarzę żadnego maturalnego zadania, na którym nie wymagano by stworzenia programu pracującego na danych z pliku tekstowego. Jeśli nie potrafisz tego zrobić to nie łudź się, że zdobędziesz jakiekolwiek punkty z zadania na program. W tym wpisie pokażę jak zrobić odczyt i zapis danych z pliku w językach C++, Java oraz Python.
Odczyt danych z pliku tekstowego
W celu odczytania danych z pliku tekstowego posługiwać będziemy się obiektami klasy fstream w języku C++. W Javie posłużymy się obiektem typu BufferedReader, a Pythonie użyjemy wbudowanej funkcji open. Zakres wiedzy wymaganej na maturze z informatyki nie zahacza właściwie o programowanie obiektowe, więc dla uproszczenia powiedzmy sobie, że będziemy używać zmiennych plikowych i przypisanych im funkcji.
Otwieranie pliku – C++ i Python
W pierwszej kolejności tworzymy zmienną plikową, postępując analogicznie do deklarowania zmiennej liczbowej czy tekstowej.Następnie musimy otworzyć plik, aby mieć do niego jakikolwiek dostęp. W C++ i Python użyjemy metody open (w C++ jest ona wbudowana w zmienną plikową, zaś w Pythonie jest ona dostępna globalnie). Metody te przyjmują dwa argumenty. Pierwszym jest nazwa pliku wraz z rozszerzeniem .txt podana jako łańcuch znaków, a drugim tryb otwarcia pliku. W tym przypadku jest to tryb input (ang. wejście – w sensie do pliku źródłowego) w postaci ios::in w C++ oraz „r” w Pythonie. W języku C++ niezbędne jest dodanie do pliku biblioteki fstream za pomocą dyrektywy preprocesora #include <fstream>.
1 |
fstream plik;//tworzymy zmienną plikową plik.open("nazwa.txt", ios::in);//używamy metody open |
1 |
file = open("nazwa.txt", "r") #tworzymy zmienną plikową przy uzyciu methody open |
Otwieranie pliku – Java
Nieco inaczej sytuacja wygląda w języku Java. Tutaj najpierw deklarujemy zmienną plikową za pomocą new File(„ścieżkadopliku.txt”). Następnie wypada sprawdzić, czy podany plik w ogóle istnieje. Jeżeli wszystko jest OK, to tworzymy zmienną typu BufferedReader. Tworząc ją korzystamy również z obiektu FileReader, w którym wskażemy plik.
1 2 3 4 5 6 7 |
File f = new File("nazwa.txt"); //tworzymy zmienną plikową - używamy tutaj obiektu File z java.io if(!f.exists()) //przed rozpoczęciem jakichkolwiek prac z plikiem warto sprawdzić, czy w ogóle istnieje { System.out.println("Plik " + f.getName() + " nie został odnaleziony."); //jeżeli nie, to zakańczamy pracę programu return; } BufferedReader br = new BufferedReader(new FileReader(f)); // do odczytu plików tworzymy nowa instancję BufferedReader |
Otworzyliśmy plik – co dalej?
Następnie należy sprawdzić, czy w ogóle udało się otworzyć plik. Jest kilka możliwości. Metod sprawdzania poprawności otworzenia pliku jest kilka, ale ja nie będę się rozdrabniał i pokażę wam czego sam używam:
C++
1 |
if(!plik) { cout << "Uuuu kiepściutko. Nie udało się. return 1; //do zasygnalizowania, że coś poszło nie tak i zakończenia programu }else { //dalsza część programu } |
Java
1 2 3 4 5 6 7 8 9 |
if(br.ready()) { //jeżeli BufferedReader jest gotowy do odczytu, to oznacza, że możemy przystąpić do pracy z plikiem //dalsza część programu } else { System.out.println("Karamba, coś poszło nie tak."); //jeżeli nie, to zakańczamy pracę programu br.close(); //zwalniamy zasoby return; } |
Python
1 2 3 |
if file.closed: #jezeli plik od razu jest zamkniety print("Plik " + file.name + " nie moze zostac otworzony.") #to oznacza ze cos poszlo nei tak #dalszy program |
Czytanie zawartości pliku
C++
Z pliku tekstowego w C++ zazwyczaj czytamy w ten sposób, że pobieramy każdą kolejną wartość oddzieloną białymi znakami. To znaczy, że nieważne, czy wartości będą oddzielone enterem, tabulatorem, kilkoma spacjami i tak odczytana zostanie ta wartość po białych znakach. No dobra ale jak to zrobić? Otóż wystarczy stworzyć zmienną typu string, int itd (w zależności od potrzeb) i zadziałać tak samo jak przy obiekcie cin, tzn.:
1 |
plik >> zmienna; |
Program pobierze z pliku daną wartość i zapisze ją do naszej zmiennej.
Java i Python
W języku Java i Python czytamy cały wiersz do zmiennej. W obu przypadkach wiersz zostanie wczytany jako zmienna tekstowa. Jeżeli chcemy więc odczytać liczby z pliku, to musimy najpierw je odpowiednio przekonwertować.
1 |
String line = br.readLine(); //czytanie pojedynczego wiersza do zmiennej w Javie |
1 |
line = file.read() #czytanie pojedynczego wiersza do zmiennej w Pythonie |
Wczytywanie w pętli
Jeżeli do odczytania mamy więcej niż jedną daną to możemy użyć pętli. Najwygodniejsza będzie pętla while w Javie i C++ oraz pętla for w Pythonie.
1 |
while(plik >> zmienna) { <br>//Rób coś <br>} |
1 2 3 4 |
String line; while((line = br.readLine()) != null) { //dopóki za zmienną line nie zostanie przypisana wartość null wykonuj kod //zrób coś z wierszem } |
1 2 3 |
for wiersz in file: #petla for iterujaca poprzez wszystkie wiersze w pliku print(wiersz) #uwaga: wiersz zazwyczaj zakonczony jest symbolem \n - trzeba to zawsze uwzglednic #rob cos dalej z wierszem... |
W tym przypadku program będzie wypisywał każdą kolejną daną z pliku, aż do jego końca.

Zapis danych do pliku
C++ i Python
Na początku postępujemy podobnie jak to miało miejsce w przypadku odczytu danych z pliku. Tworzymy zmienną plikową i korzystamy z open(). Jednakże tym razem zamiast trybu input użyjemy trybu output (ang. wyjście, w sensie z pliku źródłowego).
1 2 |
fstream plik;//tworzymy zmienną plikową plik.open("nazwa.txt", ios::out);//używamy metody open |
1 |
file = open("nazwa.txt", "w") #otwieramy plik nazwa.txt w trybie zapisywania - jezeli plik nie istnieje utworzy go #jezeli zas plik istnieje - zostanie nadpisany |
W C++ zapisujemy do pliku tak samo, jak to robimy w przypadku wypisywania w konsoli. Z tą malutką różnicą, że zamiast cout wpisujemy nazwę zmiennej plikowej. W Pythonie posłużymy się metodą write().
1 |
plik << 45.77; plik << " " << nazwa_jakiejs_zmiennej << "\t" << "tekst" << endl; plik << "\n\n\n\n"; plik << 9+11; |
1 |
file.write("Coś, co wpisze do pliku \n") #wpisujemy wiersz do pliku, symbol \n oznacza nowy wiersz |
Java
W przypadku Javy również tworzymy zmienną typu File. Następnie jednak korzystamy z obiektu BufferedWriter. Inicjalizujemy go za pomocą obiektu FileWriter, który wskazuje plik.
1 2 3 4 5 6 7 |
File f1 = new File("nazwa.txt"); //tworzymy zmienną plikową - używamy tutaj obiektu File z java.io if(!f1.exists()) //przed rozpoczęciem jakichkolwiek prac z plikiem warto sprawdzić, czy w ogóle istnieje { System.out.println("Plik " + f1.getName() + " nie został odnaleziony."); //jeżeli nie, to zakańczamy pracę programu return; } BufferedWriter bw = new BufferedWriter(new FileWriter(f1)); // do zapisu do pliku używamy instancji obiektu BufferedWriter |
Następnie, podobnie jak w Pythonie, korzystamy z metody write():
1 2 |
bw.write("Coś, co wpiszę do pliku"); // w ten sposób zapisujemy tekst do pliku(uwaga - dopóki nie przejdziemy do następnego wiersza, BufferedWriter będzie zapisywał wszystko w jednej linii) bw.newLine(); // jeżeli chcemy przejść do nowego wiersza używamy metody newLine() - można również to osiągnąć dodając \n w String |
Zamykanie pliku
Zarówno w przypadku odczytywania danych, jak i zapisywania należy pamiętać o zamknięciu pliku, jeżeli nie mamy w nim nic więcej do roboty. Dzięki temu ustrzeżemy się problemów. Plik zamykamy w następujący sposób:
1 |
plik.close();<br> |
1 2 |
bw.close();// w obu przypadkach musimy pamiętać, aby zamknąć plik br.close();// w celu zwolnienia zasobów |
1 |
file.close() #zawsze trzeba zamknac plik, gdy przestanie nam on być potrzebny |
Odczyt i zapis danych z pliku C++, Java, Python
Pozwoliłem stworzyć sobie krótkie zadanie, na którym przedstawię całą wiedzę zawartą powyżej. Mamy stworzyć programy, które wypiszą zarobki pana Z w poszczególnych miesiącach podane w pliku zarobki.txt oraz zsumuje je i zapisze w nowym pliku.
Tutaj macie link z danymi i kodem źródłowym.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <iostream> #include <fstream> using namespace std; int main() { cout << "Tak wygladaja zarobki pana Z z ubieglego roku:" << endl; fstream plik; plik.open("zarobki.txt", ios::in); if(!plik) { cout << "Dupa blada. Nie udalo sie utworzyc pliku."; return 1; }else { string miesiac; float pensja, suma=0; while(plik >> miesiac >> pensja) { cout << miesiac << " - " << pensja << endl; suma+=pensja; } cout << "Przez caly rok Pan Z zarobil: " << suma << endl; plik.close(); plik.open("suma.txt", ios_base::out); if(!plik) { cout << "Dupa blada. Nie udalo się utworzyc pliku."; return 1; }else { plik << suma; plik.close(); } } return 0; } |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package matura; import java.io.IOException; import java.io.Writer; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.Reader; import java.io.BufferedReader; import java.io.FileReader; import java.io.File; public class Main { public static void main(final String[] args) throws IOException { File f = new File("zarobki.txt"); if (!f.exists()) { System.out.println("Plik " + f.getName() + " nie został odnaleziony."); return; } final BufferedReader br = new BufferedReader(new FileReader(f)); if (!br.ready()) { System.out.println("Ajajaj, coś poszło nie tak."); br.close(); return; } float suma = 0.0f; float pensja = 0.0f; String line; while ((line = br.readLine()) != null) { final String[] splitted = line.split(" "); final String miesiac = splitted[0]; pensja = Float.parseFloat(splitted[1]); System.out.println(String.valueOf(miesiac) + " - " + pensja); suma += pensja; } System.out.println("Przez cały rok Pan Z zarobił " + suma); br.close(); f = new File("suma.txt"); if (!f.exists()) { System.out.println("Plik " + f.getName() + " nie został odnaleziony."); return; } final BufferedWriter bw = new BufferedWriter(new FileWriter(f)); bw.write("Suma zarobków: " + suma); bw.close(); } } |
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
file = open("zarobki.txt", "r") suma = 0.0 pensja = 0.0 for line in file: splitted = line.split(" ") miesiac = splitted[0] pensja = float(splitted[1]) print(miesiac + " - " + str(pensja)) suma += pensja print("Przez cały rok Pan Z zarobił " + str(suma)) file.close() file = open("suma.txt", "w") file.write("Suma zarobków: " + str(suma)) file.close() |
Clay
says:Jakby wyglądał kod jeśli chcielibyśmy wyświetlić zarobki z konkretnego miesiąca