czytanie z pliku

0

Witam,
napisałem klasę, która czyta z pliku. Klasę, bo chcę ją wykorzystać też w innych programach.

#include <iostream>
#include <fstream>

using namespace std;

///////////////////////////////////////////////
class baza {
    fstream plik;
public:
    baza(){
        plik.open("nazwiska.txt", ios::in | ios::out | ios::ate);
    fstream plik("nazwiska.txt");
    };
    void czytaj();
};
/////////////////////////////////////////////
void baza::czytaj() {
    int licznik =0;
    string wers[10];
    fstream plik("nazwiska.txt");
        while(getline(plik,wers[licznik]) )
        {
              cout<<wers[licznik]<<endl;;
              licznik++;
        }
}
//////////////////////////////////////////////
int main()
{
    baza nazwiska;
    nazwiska.czytaj();

    return 0;
}
 

Chciałem, żeby plik był dostępny z całej klasy, otwierany już przy jej inicjalizacji. Dlatego

 
    fstream plik("nazwiska.txt");

wpisałem w konstruktor. Ale okazuje się, że bez wpisania tej linijki do funkcji

czytaj()

program nie widzi tego pliku. Tak, jakby był wciąż zamknięty i nic o nim nie wiedział. Czy ktoś jest mi w stanie wytłumaczyć dlaczego tak się dzieje? Przecież fstream wywoływane jest już przy inicjalizacji klasy.

1
  fstream plik("nazwiska.txt");

W ten sposób deklarujesz nową zmienną lokalną o nazwie 'plik', nie przypisujesz jej do pola klasy o nazwie 'plik'.

Przykład tego co robisz, w trochę prostszej wersji:

int plik = 5;

int main() {
    int plik = 4;
    cout << plik << endl; // co zostanie wypisane?
}

Teraz zamiast globalnej zmiennej wstaw pole klasy, a zamiast 'main', 'czytaj' i sam widzisz czemu to tak działa.

Poprawiona wersja:

#include <iostream>
#include <fstream>
 
using namespace std;
 
///////////////////////////////////////////////
class baza {
    fstream plik;
public:
    baza() : plik("nazwiska.txt") { } // następuje wywołanie konstruktora pola `'plik'` z argumentem `"nazwiska.txt"`.
    void czytaj();
};
/////////////////////////////////////////////
void baza::czytaj() {
    int licznik =0;
    string wers[10];
    while(getline(plik,wers[licznik]) ) {
         cout<<wers[licznik]<<endl;;
         licznik++;
    }
}
0

Dzięki wielkie. Do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1