Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Kurs C++

Wczytywanie danych z pliku za pomocą operatora >>

[lekcja] Rozdział 33. Odczytywanie zawartości pliku tekstowego za pomocą operatora >>.

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:
C/C++
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:
C/C++
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 » standard Cisspace 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:
C/C++
#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 ) //pętla nieskończona
    {
        int a;
        std::string b;
        int c;
        plik >> a >> b >> c;
        if( !plik.fail() )
             wykonajOperacje( a, b, c );
        else
             break; //zakończ wczytywanie danych - wystąpił jakiś błąd (np. nie ma więcej danych w pliku)
       
    } //while
    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.
Poprzedni dokument Następny dokument
Podstawy obsługi plików Wczytywanie zawartości pliku, a kontrola błędów