Operacje na plikach (odczyt i zapis)

Biblioteka odpowiedzialna za obsługę plików

Pisząc nasze programy, prędzej czy później zajdzie potrzeba zapisywania danych na dysku. Z pomocą przychodzi tu biblioteka fstream, dzięki której uzyskujemy funkcje pozwalające nam zarówno zapisywać pliki jak i je odczytywać.

Typ zmiennej fstream

Zanim zaczniemy odczytywać, bądź zapisywać dane z/do pliku, musimy posiadać zmienną, dzięki której będziemy mogli wykonywać operacje na wybranym pliku. W tym celu utworzona została klasa fstream. Klasa ta jest umieszczona w przestrzeni nazw std::. Klasa ta udostępnia nam cały interfejs, dzięki któremu będziemy mogli obsłużyć dowolny plik znajdujący się na dysku lub innym nośniku danych.

fstream plik;

Otwieranie pliku

Zmienna, którą utworzyliśmy aktualnie nie wskazuje na żaden plik. Aby przypisać konkretny plik do zmiennej wywołujemy funkcję open(), której definicja wygląda następująco:

void open( const char * nazwa_pliku, ios_base::openmode tryb_otwarcia_pliku );

Tryb Opis trybu
ios::app (append – dopisywanie danych do pliku) Ustawia wewnętrzny wskaźnik zapisu pliku na jego koniec. Plik otwarty w trybie tylko do zapisu. Dane mogą być zapisywane tylko i wyłącznie na końcu pliku.
ios::ate (at end) Ustawia wewnętrzny wskaźnik pliku na jego koniec w chwili otwarcia pliku.
ios::binary (binary) Informacja dla kompilatora, aby dane były traktowane jako strumień danych binarnych, a nie jako strumień danych tekstowych.
ios::in (input – wejście/odczyt) Zezwolenie na odczytywanie danych z pliku.
ios::out (output – wyjście/zapis) Zezwolenie na zapisywanie danych do pliku.
ios::trunc (truncate) Zawartość pliku jest tracona, plik jest obcinany do 0 bajtów podczas otwierania.

Wszystkie wymienione tryby możemy łączyć ze sobą – oznacza to, że jeśli chcemy otrzymać plik do odczytu i zapisu wystarczy oddzielić je pojedynczym operatorem |. np

fstream plik;
plik.open( “nazwa_pliku.txt”, ios::in | ios::out );

Czy udało otworzyć się plik?

Zdecydowana większość kursów pomija ten bardzo ważny krok, jaki należy implementować we własnych kodach źródłowych – sprawdzanie czy plik został otwarty prawidłowo. Operacja jest bardzo prosta, jednak prawie zawsze zaniedbywana nawet w książkach poświęconych programowaniu!
Po wykonaniu operacji otwarcia pliku, wewnątrz klasy ustawiane są odpowiednie flagi, które informują o tym, czy otrzymaliśmy dostęp do pliku czy też nie. Funkcje, jakie umożliwiają nam sprawdzenie tego stanu to good() oraz is_open(). Definicja tych funkcji wygląda następująco:

bool good();
bool is_open();

Obie funkcje zwrócą wartość true, jeśli uzyskano dostęp do pliku, w przeciwnym wypadku otrzymamy wartość false.

fstream plik;
plik.open( “nazwa_pliku.txt”, ios::in | ios::out );
if( plik.good() == true )
{
    std::cout << “Uzyskano dostep do pliku!” << std::endl;
    //tu operacje na pliku
} else cout << “Dostep do pliku zostal zabroniony!” << endl;

Zamykanie pliku

Każdy plik należy zamykać po zakończeniu pracy z nim. Jeśli plik ma być używany tylko przez jednego użytkownika szkodliwość jest stosunkowo mała – klasa fstream sama zamknie plik przed usunięciem zmiennej z pamięci. Jeśli natomiast zapomnisz zamknąć plik, którego dane mają być współdzielone przez kilku użytkowników, automatycznie uniemożliwisz im dostęp do tego zasobu. Funkcja odpowiedzialna na zamykanie pliku nosi nazwę close(). Deklaracja wygląda następująco:

void close( void );

—————————————————————–

eof() = EOF jest anglojęzycznym skrótem ‘End of File’, który należy tłumaczyć jako ‘koniec pliku’.

źródło: http://cpp0x.pl

============================================================================================

ODCZYT Z PLIKU TXT

  1. Pobierz plik i zapisz w nowym folderze -> dane_6_3.txt
  2. Przekopiuj kod źródłowy do pliku w tym samym folderze#include<iostream>
    #include <conio.h>
    #include<fstream>
    #include<cstdlib>
    using namespace std;int main()
    {
        //operacje na plikach
        
        ifstream plik_odczyt;
        bool good();
        char dana1[255];
        char dana2[255];
        int nrwiersza=0;
        plik_odczyt.open("dane_6_3.txt");
        if( plik_odczyt.good() == true )
        {
            cout << "Uzyskano dostep do pliku!" << endl << endl;
            cout<<"nr wiersza"<<"\t "<<"dana1"<<"\t "<<"dana2"<<endl;        
            while(!plik_odczyt.eof())
            {
                plik_odczyt>>dana1>>dana2;
                cout<<nrwiersza<<"\t"<<dana1<<"\t "<<dana2<<endl;
                nrwiersza++;
                //if(nrwiersza%20==0)
                //system("pause");
            }
            plik_odczyt.close();
        }
        else
        cout << "Dostep do pliku zostal zabroniony!" << endl;
    }

============================================================================================

ZAPIS DO PLIKU

  1. Przekopiuj kod źródłowy do pliku

    #include<iostream>
    #include<fstream>
    using namespace std;
    int main()
    {
    ofstream plik;
    plik.open("dane.txt");
    for(int i=1; i<=10; i++)
    plik<<i<<endl;
    plik.close();
    }

 

============================================================================================

Zadanie:

Napisz program:

1. Wczytaj plik dane.txt
2. Policz ile jest wszystkich firm w pliku
3. Policz sume wartosci ostatniej kolumny tylko dla tych danych w których trzecie kolumna = L
4. Zapisz w tablicy (i wyswietl) co 50 pierwsza kolumna

============================================================================================