Programowanie i algorytmy

Czytanie pliku

powrót

Otwarcie pliku w trybie do odczytu

Wszystkie funkcje (metody) oraz zmienne (atrybuty) zdefiniowane są w klasie o nazwie {tex}ifstream{/tex}, na podstawie której musimy utworzyć obiekt. Czytanie zawartości pliku można utożsamić z czytaniem danych z klawiatury. Należy tylko zmienić standardowe wejście z klawiatury na plik. Popatrzmy jeszcze raz, w jaki sposób czytamy dane z klawiatury:

          cin>>zmienna; 

 

gdzie {tex}cin{/tex} jest obiektem, który ma zdefiniowane niezbędne metody i atrybuty potrzebne do czytania z klawiatury. Czytanie pliku działa na takiej samej zasadzie. Różnica jest taka, że zamiast nazwy {tex}cin{/tex} wpisujemy własną, którą tworzymy w następujący sposób:

          ifstream jakas_nazwa; //zamiast cin bedzie jakas_nazwa
          jakas_nazwa.open("ścieżka do pliku (względna lub bezwzględna)");

 

Klasa {tex}ifsteram{/tex} ma zdefiniowane wszystkie elementy pozwalające czytać plik.

Jak mamy już obiekt, to możemy skorzystać z pierwszej jego funkcji, która określa fizyczny plik na dysku. W cudzysłowie podajemy ścieżkę do niego bezwzględną lub względną: bezwzględna ścieżka to cały adres do pliku np.: c:/dane/dane.txt, względna, to taka, która określa położenie pliku względem programu, np. jeśli program i plik z danymi znajdują się w tym samym miejscu, to wystarczy zapisać 

          jakas_nazwa.open("dane.txt"); 

 

Plik, który chcemy czytać, możemy zdefiniować od razu przy tworzeniu obiektu i pomijamy w tej sytuacji funkcję {tex}open{/tex}:

          ifstream jakas_nazwa("ścieżka do pliku");

 

 Teraz, dane wczytujemy za pomocą konstrukcji:

          jakas_nazwa>>zmienna; 

 

Przykład.

Załóżmy, że mamy utworzony plik tekstowy dane.txt z zapisanymi w nim dwiema liczbami np. 23 12. Chcemy odczytać te liczby i wykonać na nich działanie dodawania. Dodatkowo, nasz program wykonywalny jest w tym samym folderze co plik dane.txt.

 

#include<iostream>
#include<fstream>
 
using namespace std;
 
int main()
{
  int a, b;
  ifstream odczyt("dane.txt");
 
  odczyt>>a>>b;
 
  cout<<"Suma wczytanych liczb wynosi: "<<a+b;
 
  cin.get();
 
  odczyt.close(); //zamknięcie pliku
 
  return 0;
}
 

 

Do zamykania pliku służy funkcja {tex}close();{/tex}.

Pamiętajmy, że jeśli jakiś plik otwieramy, to po zakończonej pracy musimy go zamknąć!!

Czytanie całego pliku

Cały plik możemy przeczytać na kilka sposobów.

  • Pierwszy sposób to czytanie pliku znak po znaku:
#include<iostream>
#include<fstream>
 
using namespace std;
 
int main()
{
  int a, b;
  ifstream odczyt("dane.txt");
 
  if(odczyt.is_open())
  {
    char znak;
    while(odczyt>>znak) //dopóki jest co czytać
    {
      cout<<znak; //wypisz to co wczytałes z pliku
      //lub wykonaj inną operację
    }
  }
  else
    cout<<"Nie udało się otworzyć pliku";
 
  cin.get();
 
  return 0;
}
 
  •  drugi sposób to czytanie wyraz po wyrazie:
#include<iostream>
#include<fstream>
 
using namespace std;
 
int main()
{
  int a, b;
  ifstream odczyt("dane.txt");
 
  if(odczyt.is_open())
  {
    char wyraz[100];//maksymalnie 99 znaków
    while(odczyt>>wyraz) //dopóki jest co czytać
    {
      cout<<wyraz<<" "; //wypisz to co wczytałes z pliku
      //lub wykonaj inną operację
    }
  }
  else
    cout<<"Nie udało się otworzyć pliku";
 
  cin.get();
 
  return 0;
}
  •  i trzeci sposób wiersz po wierszu:
#include<iostream>
#include<fstream>
 
using namespace std;
 
int main()
{
  int a, b;
  ifstream odczyt("dane.txt");
 
  if(odczyt.is_open())
  {
    char wiersz[10000];//maksymalnie 9999 znaków w wierszu
    while(odczyt.getline(wiersz,10000)) //dopóki jest co czytać
    {
      cout<<wiersz<<endl; //wypisz to co wczytałes z pliku
      //lub wykonaj inną operację
    }
  }
  else
    cout<<"Nie udało się otworzyć pliku";
 
  cin.get();
 
  return 0;
}