Wprowadzenie
Wczytywanie zawartości plików tekstowych przy pomocy funkcji
std::getline jest zazwyczaj satysfakcjonującym rozwiązaniem, jednak nie zawsze jest ono wygodne. Dane w pliku czasami są zapisane w postaci liczb, a te z kolei chcielibyśmy wczytywać od razu do zmiennych liczbowych, oszczędzając sobie tym samym problemów związanych z wyciąganiem ich ze zmiennej tekstowej. W niniejszym rozdziale poznasz rozwiązanie, które umożliwi Ci łatwe wczytywanie liczb z pliku tekstowego.
Odczytywanie danych za pomocą operatora >>
Zanim rozpoczniemy wykonywać jakiekolwiek działania na pliku, należy go uprzednio otworzyć. Jak już wiesz, plik w trybie do odczytu można otworzyć następująco:
std::ifstream plik;
plik.open( "nazwa-pliku.txt" );
Jeżeli otwarcie pliku zakończyło się powodzeniem, to możemy odczytywać już z niego interesujące nas dane. Dane z pliku można odczytywać na wiele sposobów, jednak aktualnie zajmiemy się operatorem >>. Operator >> umożliwia wczytywanie danych do zmiennych w taki sam sposób, w jaki wczytywaliśmy dane wprowadzane przy pomocy klawiatury. Tym samym napisanie:
int zmienna;
plik >> zmienna;
spowoduje, że z pliku wczytana zostanie liczba do podanej przez nas zmiennej. Jeżeli zmienna w powyższym przykładzie będzie typu
float to operator >> będzie umiał wczytać liczbę zmiennoprzecinkową. Jeżeli zmienna będzie typu std::string to wówczas operator >> wczyta
jeden wyraz z pliku. Jeżeli zmienna będzie typu
char to wówczas odczytany zostanie jeden znak, który
nie jest białym znakiem.
Pamiętaj, że operator >> zawsze pomija wszelkie napotkane białe znaki.
|
Co to jest biały znak?
Białymi znakami są nazywane te symbole, które są używane w tekście i nie posiadają swojej reprezentacji graficznej. Przykładem takiego znaku jest spacja, tabulacja czy też znak przejścia do nowej linii (enter). Wykaz białych znaków znajdziesz w opisie funkcji
isspace za pomocą której możesz stwierdzić czy znak o podanym kodzie ASCII zalicza się do białych znaków.
Przykład
Załóżmy, że mamy plik, w którym dane mamy zapisane następująco:
10 dodac 5
3 odjac 2
77 zonk 3
99 dodac 1
Jak nietrudno zauważyć, w każdym wierszu podanego pliku znajduje się liczba, później wyraz i ponownie liczba. Taki plik możemy sobie w łatwy sposób wczytać przy pomocy operatora >>, a następnie wykonać na nim jakieś operacje, np. operacje matematyczne. Poniższy kod prezentuje w jaki sposób można wczytać powyższy plik oraz jak wykonywać na nim operacje. Kod źródłowy:
#include <fstream>
#include <iostream>
#include <string>
void wykonajOperacje( int liczba1, std::string napis, int liczba2 )
{
if( napis == "dodac" )
{
std::cout << liczba1 << " + " << liczba2 << " = " << liczba1 + liczba2 << std::endl;
} else if( napis == "odjac" )
{
std::cout << liczba1 << " - " << liczba2 << " = " << liczba1 - liczba2 << std::endl;
} else
{
std::cout << "Nieznana operacja \"" << napis << "\" - nie mozna wykonac obliczen." << std::endl;
}
}
bool wczytajPlik( std::string nazwaPliku )
{
std::ifstream plik;
plik.open( nazwaPliku.c_str() );
if( !plik.good() )
return false;
while( true )
{
int a;
std::string b;
int c;
plik >> a >> b >> c;
if( !plik.fail() )
wykonajOperacje( a, b, c );
else
break;
}
return true;
}
int main()
{
if( !wczytajPlik( "dane.txt" ) )
std::cout << "Nie udalo sie otworzyc pliku!" << std::endl;
return 0;
}
W wyniku działania powyższego programu, na standardowym wyjściu pojawią się następujące komunikaty:
10 + 5 = 15
3 - 2 = 1
Nieznana operacja "zonk" - nie mozna wykonac obliczen.
99 + 1 = 100
Podsumowanie
W niniejszym rozdziale dowiedziałeś się, w jaki sposób można wczytywać dane z pliku przy pomocy operatora >>. W kolejnym rozdziale zajmiemy się obsługą błędów, jakie mogą wystąpić podczas wczytywania danych.
Zadanie domowe
Otwórz plik tekstowy, w którym będą znajdowały się tylko liczby całkowite, oddzielone od siebie spacjami. Następnie napisz program, który wczyta wszystkie liczby z pliku i wypisze sumę wszystkich liczb na standardowym wyjściu.