Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Brak możliwości dodania "fstream plik;" do klasy

Ostatnio zmodyfikowano 2012-10-15 23:06
Autor Wiadomość
cyklopek11
» 2012-10-15 20:39:18
Bo może wziąłeś sobie za bardzo do serca zalecenia programistów, aby nie korzystać zbyt często ze zmiennych globalnych :-)
P-66896
DejaVu
» 2012-10-15 21:49:18
Rozwiązywanie problemów metodą 'buta w drzwiach' w programowaniu, na dłuższą metę się po prostu nie sprawdza. Poza tym:
C/C++
#include <fstream>

class CKlasa
{
    std::fstream m_plik;
};
int main()
{
    CKlasa klasa;
    return 0;
}
Powyższy kod się kompiluje pod Code::Blocks (kompilator GCC - chyba w wersji 4.4.1).
P-66904
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-10-15 22:05:58
DejaVu, ok tylko dodaj do tego teraz vactor i nie działa. Wklej sobie mój kod i sprawdź ocb. Sam fstream w klasie wiadomo że się skompiluje.
P-66906
DejaVu
» 2012-10-15 22:14:02
Skoro chcesz umieścić w kontenerze std::vector obiekty std::fstream, to zmienna globalna niczego nie załatwi. Klasa std::fstream ma prywatny konstruktor kopiujący, ponieważ kopiowanie tego obiektu nie jest prawidłową operacją.
C/C++
#include <fstream>

int main()
{
    std::fstream a;
    std::fstream b( a );
    return 0;
}
Powyższy kod też Ciebie zaleje falą błędów.
P-66908
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-10-15 22:17:31
Nie chcę mieć fstream w kontenerze vector. Chce mieć raz zadeklarowany plik na którym będę wykonywał operacje zapisu odczytu.

Proszę mój program napisany na tablicy (wszystko działa)
C/C++
// Platforma: Windows (x32 & x64) //min. 480 linii
// Kompilator: GNU GCC
// Srodowisko: Code::Blocks 10.05
// Autor: XXX
// E-mail: XXX

#include <iostream> //standardowa biblioteka do obslugi m.in. cout, cin
#include <string> //biblioteka do obslugi lancuchow znakow
#include <fstream> //biblioteka do obsulgi plikow
#include <cstdlib> //biblioteka do obslugi komend m.in. ( zatrzymanie programu, usuwanie pliku )
using namespace std;

struct ksiazki //struktura tablicy
{
    string tytul;
    string autor;
    string wydawnictwo;
    int rok;
    int strony;
};

void czyszczenie_strumienia_i_buforu() //czyszczenie strumienia, buforu i flagi bledu
{
    cin.clear();
    cin.sync();
}

void naglowek() //glowny naglowek programu
{
    cout << "\t\t    Witaj w programie! Created by Unlimited!" << endl;
    cout << "\t\t       [ Projekt: zadanie domowe z PSiO ]" << endl << endl;
}

void dodaj( ksiazki tablica[], int & n, int & ilosc, bool & sprawdz ) //dodawanie ksiazki
{
    naglowek();
    if( n < ilosc )
    {
        cout << "Podaj tytul ksiazki: ";
        czyszczenie_strumienia_i_buforu();
        getline( cin, tablica[ n ].tytul );
        cout << "Podaj autora: ";
        getline( cin, tablica[ n ].autor );
        cout << "Podaj wydawnictwo ksiazki: ";
        getline( cin, tablica[ n ].wydawnictwo );
        do
        {
            cout << "Podaj rok wydania: ";
            czyszczenie_strumienia_i_buforu();
            cin >> tablica[ n ].rok;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        do
        {
            cout << "Podaj ilosc stron: ";
            czyszczenie_strumienia_i_buforu();
            cin >> tablica[ n ].strony;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        n++;
        cout << endl << "Dodano pomyslnie!" << endl << endl;
    }
    else
    {
        cout << "Miejsca na ksiazki zostaly zapelnione!" << endl << endl;
    }
    system( "pause" );
}

void edytuj( ksiazki tablica[], int & n, int & x, bool & sprawdz ) //edytowanie ksiazki
{
    naglowek();
    if( n != 0 )
    {
        do
        {
            cout << "Podaj LP wpisu ksiazki: ";
            czyszczenie_strumienia_i_buforu();
            cin >> x;
            sprawdz = cin.good();
        } while( sprawdz == false || x > n || x <= 0 );
       
        cout << endl << "Aktualne zestawienie: " << endl;
        cout << x;
        x--;
        cout << ". Tytul: " << tablica[ x ].tytul << endl;
        cout << "   Autor: " << tablica[ x ].autor << endl;
        cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
        cout << "   Rok wydania: " << tablica[ x ].rok << endl;
        cout << "   Ilosc stron: " << tablica[ x ].strony << endl << endl;
        cout << "Podaj nowe zestawienie: " << endl;
        cout << x + 1 << ". Tytul: ";
        czyszczenie_strumienia_i_buforu();
        getline( cin, tablica[ x ].tytul );
        cout << "   Autor: ";
        getline( cin, tablica[ x ].autor );
        cout << "   Wydawnictwo: ";
        getline( cin, tablica[ x ].wydawnictwo );
        do
        {
            cout << "   Rok wydania: ";
            czyszczenie_strumienia_i_buforu();
            cin >> tablica[ x ].rok;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        do
        {
            cout << "   Ilosc stron: ";
            czyszczenie_strumienia_i_buforu();
            cin >> tablica[ x ].strony;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        cout << endl << "Zedytowano pomyslnie!" << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void usun( ksiazki tablica[], int & n, int & ilosc, int & x, bool & sprawdz ) //usuwanie ksiazki
{
    naglowek();
    if( n != 0 )
    {
        do
        {
            cout << "Podaj LP wpisu ksiazki: ";
            czyszczenie_strumienia_i_buforu();
            cin >> x;
            sprawdz = cin.good();
            x--;
        } while( sprawdz == false || x >= n || x < 0 );
       
        for( x; x < n; x++ )
        {
            if( x != ilosc - 1 )
            {
                tablica[ x ] = tablica[ x + 1 ];
            }
        }
        n--;
        cout << endl << "Usunieto pomyslnie!" << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void szukaj_tytul( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n ) //szukanie po tytule
{
    naglowek();
    if( n != 0 )
    {
        cout << "Podaj tytul: ";
        czyszczenie_strumienia_i_buforu();
        getline( cin, fraza );
        for( x = 0; x < n; x++ )
        {
            ZnalezionaFraza = tablica[ x ].tytul.find( fraza );
            if( ZnalezionaFraza != string::npos )
            {
                cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
                cout << "   Autor: " << tablica[ x ].autor << endl;
                cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
                cout << "   Rok wydania: " << tablica[ x ].rok << endl;
                cout << "   Ilosc stron: " << tablica[ x ].strony << endl;
            }
            else
            {
                cout << endl << x + 1 << ". Brak wynikow" << endl;
            }
        }
        cout << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void szukaj_autor( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n ) //szukanie po autorze
{
    naglowek();
    if( n != 0 )
    {
        cout << "Podaj autora: ";
        czyszczenie_strumienia_i_buforu();
        getline( cin, fraza );
        for( x = 0; x < n; x++ )
        {
            ZnalezionaFraza = tablica[ x ].autor.find( fraza );
            if( ZnalezionaFraza != string::npos )
            {
                cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
                cout << "   Autor: " << tablica[ x ].autor << endl;
                cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
                cout << "   Rok wydania: " << tablica[ x ].rok << endl;
                cout << "   Ilosc stron: " << tablica[ x ].strony << endl;
            }
            else
            {
                cout << endl << x + 1 << ". Brak wynikow" << endl;
            }
        }
        cout << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void szukaj_wydawnictwo( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n ) //szukanie po wydawnictwie
{
    naglowek();
    if( n != 0 )
    {
        cout << "Podaj wydawnictwo: ";
        czyszczenie_strumienia_i_buforu();
        getline( cin, fraza );
        for( x = 0; x < n; x++ )
        {
            ZnalezionaFraza = tablica[ x ].wydawnictwo.find( fraza );
            if( ZnalezionaFraza != string::npos )
            {
                cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
                cout << "   Autor: " << tablica[ x ].autor << endl;
                cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
                cout << "   Rok wydania: " << tablica[ x ].rok << endl;
                cout << "   Ilosc stron: " << tablica[ x ].strony << endl;
            }
            else
            {
                cout << endl << x + 1 << ". Brak wynikow" << endl;
            }
        }
        cout << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void szukaj_rok( ksiazki tablica[], int & liczba, int & x, int & n, bool & sprawdz ) //szukanie po roku wydania
{
    naglowek();
    if( n != 0 )
    {
        do
        {
            cout << "Podaj rok wydania: ";
            czyszczenie_strumienia_i_buforu();
            cin >> liczba;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        for( x = 0; x < n; x++ )
        {
            if( tablica[ x ].rok == liczba )
            {
                cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
                cout << "   Autor: " << tablica[ x ].autor << endl;
                cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
                cout << "   Rok wydania: " << tablica[ x ].rok << endl;
                cout << "   Ilosc stron: " << tablica[ x ].strony << endl;
            }
            else
            {
                cout << endl << x + 1 << ". Brak wynikow" << endl;
            }
        }
        cout << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void szukaj_strony( ksiazki tablica[], int & dol, int & gora, int & x, int & n, bool & sprawdz ) //szukanie po ilosci stron
{
    naglowek();
    if( n != 0 )
    {
        do
        {
            cout << "Podaj dolny prog ilosci stron: ";
            czyszczenie_strumienia_i_buforu();
            cin >> dol;
            sprawdz = cin.good();
        } while( sprawdz == false );
       
        do
        {
            cout << "Podaj gorny prog ilosci stron: ";
            czyszczenie_strumienia_i_buforu();
            cin >> gora;
            sprawdz = cin.good();
        } while( sprawdz == false || gora < dol );
       
        for( x = 0; x < n; x++ )
        {
            if( tablica[ x ].strony >= dol && tablica[ x ].strony <= gora )
            {
                cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
                cout << "   Autor: " << tablica[ x ].autor << endl;
                cout << "   Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
                cout << "   Rok wydania: " << tablica[ x ].rok << endl;
                cout << "   Ilosc stron: " << tablica[ x ].strony << endl;
            }
            else
            {
                cout << endl << x + 1 << ". Brak wynikow" << endl;
            }
        }
        cout << endl << endl;
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void wyswietl( ksiazki tablica[], int & n ) //wyswietlanie wszystkich ksiazek
{
    naglowek();
    if( n != 0 )
    {
        int lp = 1;
        for( int v = 0; v < n; v++ )
        {
            cout << lp << ". Tytul: " << tablica[ v ].tytul << endl;
            cout << "   Autor: " << tablica[ v ].autor << endl;
            cout << "   Wydawnictwo: " << tablica[ v ].wydawnictwo << endl;
            cout << "   Rok wydania: " << tablica[ v ].rok << endl;
            cout << "   Ilosc stron: " << tablica[ v ].strony << endl << endl;
            lp++;
        }
    }
    else
    {
        cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
    }
    system( "pause" );
}

void utworz_plik( fstream & plik, string & odnosnik, int & n, ksiazki tablica[] ) //tworzenie pliku z danymi
{
    naglowek();
    plik.open( odnosnik.c_str(), ios::out );
    plik.close();
    if( plik.good() )
    {
        if( n != 0 )
        {
            plik.open( odnosnik.c_str(), ios::out | ios::app );
            plik << "\t\t    Witaj w programie! Created by Unlimited!" << endl;
            plik << "\t\t       [ Projekt: zadanie domowe z PSIO ]" << endl << endl;
            int lp = 1;
            for( int v = 0; v < n; v++ )
            {
                plik << lp << ". Tytul: " << tablica[ v ].tytul << endl;
                plik << "   Autor: " << tablica[ v ].autor << endl;
                plik << "   Wydawnictwo: " << tablica[ v ].wydawnictwo << endl;
                plik << "   Rok wydania: " << tablica[ v ].rok << endl;
                plik << "   Ilosc stron: " << tablica[ v ].strony << endl << endl;
                lp++;
            }
            plik.close();
            cout << "Dane zostaly zapisane pomyslnie!" << endl << endl;
        }
        else
        {
            cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
        }
    }
    else
    {
        cout << "Error! Nie udalo sie utworzyc pliku!" << endl << endl;
        cout << "Mozliwe bledy:" << endl;
        cout << "  - odnosnik do pliku nie zostal podany" << endl;
        cout << "  - odnosnik do pliku jest nieprawidlowy" << endl;
        cout << "  - brak odpowiednich uprawnien w systemie" << endl << endl;
    }
    system( "pause" );
}

void usun_plik( string & odnosnik ) //usuwanie pliku z danymi
{
    remove( odnosnik.c_str() );
}

void sciezka( string & odnosnik ) //podawanie sciezki do pliku
{
    naglowek();
    cout << "Uwaga!!! Pamietaj aby podac prawidlowa sciezke do pliku!" << endl;
    cout << "Podajac sama nazwe pliku np - plik.txt - dokument tekstowy" << endl;
    cout << "zostanie utworzony w katalogu z uruchomionym programem." << endl << endl;
    cout << "Podaj sciezke pliku z rozszerzeniem .txt: ";
    czyszczenie_strumienia_i_buforu();
    getline( cin, odnosnik );
}

void pokaz( fstream & plik, string & odnosnik, string & napis, int & n ) //wyswietlanie zawartosci pliku
{
    naglowek();
    plik.open( odnosnik.c_str(), ios::in );
    plik.close();
    if( plik.good() )
    {
        plik.open( odnosnik.c_str(), ios::in );
        while( !plik.eof() )
        {
            getline( plik, napis );
            cout << napis << endl;
        }
        plik.close();
    }
    else
    {
        cout << "Error! Nie udalo sie otworzyc pliku!" << endl << endl;
        cout << "Mozliwe bledy:" << endl;
        cout << "  - plik nie istnieje" << endl;
        cout << "  - brak odpowiednich uprawnien w systemie" << endl;
    }
    cout << endl;
    system( "pause" );
}

void sprawdz_sciezke( string & odnosnik ) //sprawdzanie aktualnej sciezki do pliku
{
    naglowek();
    cout << "Aktualny plik to: " << odnosnik << endl << endl;
    system( "pause" );
}

void info() //informacje dodatkowe
{
    naglowek();
    cout << "Wykonanie: XXX" << endl;
    cout << "Klasa: II bT (2011/2012)" << endl;
    cout << "Srodowisko: Code::Bloks 10.05" << endl;
    cout << "Kompilator: GNU GCC" << endl;
    cout << "E-mail: XXX" << endl << endl;
    cout << "Dodatkowe:" << endl;
    cout << "   + Program zabezpieczony jest przed 'niesfornym' uzytkownikiem" << endl;
    cout << "     i nie da sie go 'zcrashowac' np podajac litere badz wyraz" << endl;
    cout << "     do zmiennej 'int' (rok wydania, ilosc stron)." << endl;
    cout << "   + Program dostepny na platformy: Linux / Windows (x32, x64)" << endl;
    cout << "   - Program konsolowy. Byc moze niedlugo bedzie graficzny." << endl;
    cout << "   - Nie gwarantuje poprawnosci kodu zrodlowego programu z innymi" << endl;
    cout << "     kompilatorami niz w/w." << endl << endl;
    system( "pause" );
}

int main() //glowna czesc programu
{
    int n = 0;
    int ilosc, wybor1, wybor2, wybor3, x, liczba, dol, gora;
    bool sprawdz;
    string odnosnik, napis, fraza;
    fstream plik;
    size_t ZnalezionaFraza;
   
    do
    {
        system( "cls" );
        naglowek();
        cout << "\t      Na ile ksiazek zrobic miejsce?: (rozmiar tablicy) ";
        czyszczenie_strumienia_i_buforu();
        cin >> ilosc;
        sprawdz = cin.good();
    } while( sprawdz == false || ilosc <= 0 );
   
    ksiazki tablica[ ilosc ];
   
    do
    {
        do
        {
            system( "cls" );
            naglowek();
            cout << "[1] Dodaj nowa ksiazke" << endl;
            cout << "[2] Edytuj ksiazke" << endl;
            cout << "[3] Usun ksiazke" << endl;
            cout << "[4] Wyswietl/Wyszukaj ksiazki" << endl;
            cout << "[5] Opcje" << endl;
            cout << "[6] Wykonanie/Kontakt" << endl;
            cout << "[0] Zakoncz" << endl << endl;
            cout << "Twoj wybor: ";
            czyszczenie_strumienia_i_buforu();
            cin >> wybor1;
            sprawdz = cin.good();
            system( "cls" );
        } while( sprawdz == false );
       
        switch( wybor1 )
        {
        case 1:
            {
                dodaj( tablica, n, ilosc, sprawdz );
                break;
            }
        case 2:
            {
                edytuj( tablica, n, x, sprawdz );
                break;
            }
        case 3:
            {
                usun( tablica, n, ilosc, x, sprawdz );
                break;
            }
        case 4:
            {
                do
                {
                    do
                    {
                        system( "cls" );
                        naglowek();
                        cout << "[1] Szukaj - Tytul" << endl;
                        cout << "[2] Szukaj - Autor" << endl;
                        cout << "[3] Szukaj - Wydawnictwo" << endl;
                        cout << "[4] Szukaj - Rok wydania" << endl;
                        cout << "[5] Szukaj - Ilosc stron" << endl;
                        cout << "[6] Pokaz wszystkie" << endl;
                        cout << "[0] Powrot" << endl << endl;
                        cout << "Twoj wybor: ";
                        czyszczenie_strumienia_i_buforu();
                        cin >> wybor2;
                        sprawdz = cin.good();
                        system( "cls" );
                    } while( sprawdz == false );
                   
                    switch( wybor2 )
                    {
                    case 1:
                        {
                            szukaj_tytul( ZnalezionaFraza, tablica, fraza, x, n );
                            break;
                        }
                    case 2:
                        {
                            szukaj_autor( ZnalezionaFraza, tablica, fraza, x, n );
                            break;
                        }
                    case 3:
                        {
                            szukaj_wydawnictwo( ZnalezionaFraza, tablica, fraza, x, n );
                            break;
                        }
                    case 4:
                        {
                            szukaj_rok( tablica, liczba, x, n, sprawdz );
                            break;
                        }
                    case 5:
                        {
                            szukaj_strony( tablica, dol, gora, x, n, sprawdz );
                            break;
                        }
                    case 6:
                        {
                            wyswietl( tablica, n );
                            break;
                        }
                    }
                } while( wybor2 != 0 );
               
                break;
            }
        case 5:
            {
                do
                {
                    do
                    {
                        system( "cls" );
                        naglowek();
                        cout << "[1] Utworz plik z danymi" << endl;
                        cout << "[2] Usun plik z danymi" << endl;
                        cout << "[3] Podaj sciezke pliku" << endl;
                        cout << "[4] Pokaz zawartosc pliku" << endl;
                        cout << "[5] Sprawdz aktualny odnosnik pliku" << endl;
                        cout << "[0] Powrot" << endl << endl;
                        cout << "Twoj wybor: ";
                        czyszczenie_strumienia_i_buforu();
                        cin >> wybor3;
                        sprawdz = cin.good();
                        system( "cls" );
                    } while( sprawdz == false );
                   
                    switch( wybor3 )
                    {
                    case 1:
                        {
                            utworz_plik( plik, odnosnik, n, tablica );
                            break;
                        }
                    case 2:
                        {
                            usun_plik( odnosnik );
                            break;
                        }
                    case 3:
                        {
                            sciezka( odnosnik );
                            break;
                        }
                    case 4:
                        {
                            pokaz( plik, odnosnik, napis, n );
                            break;
                        }
                    case 5:
                        {
                            sprawdz_sciezke( odnosnik );
                            break;
                        }
                    }
                } while( wybor3 != 0 );
               
                break;
            }
        case 6:
            {
                info();
                break;
            }
        }
    } while( wybor1 != 0 );
   
    return 0;
}

Program napisany na vector zamiast tablicy = nie działa.
P-66910
DejaVu
» 2012-10-15 22:34:14
Dostałeś uzasadnienie dlaczego nie działa. Nie można wywołać konstruktora kopiującego na std::fstream. Jak zapewnisz, że przy kopiowaniu klasy nie zostanie wywołany konstruktor kopiujący std::fstream to zawsze wszystko zadziała.
C/C++
#include <fstream>
#include <vector>

class CKlasa
{
public:
    CKlasa() { }
    CKlasa( const CKlasa & klasa ) { }
    CKlasa & operator =( const CKlasa & klasa ) { return * this; }
   
private:
    std::fstream m_plik;
};

int main()
{
    std::vector < CKlasa > vDane;
    vDane.push_back( CKlasa() );
    return 0;
}
/edit:
A tablica działa tylko i wyłącznie dlatego, że wszystkie obiekty są tworzone od razu. Równie dobrze możesz napisać:
C/C++
#include <fstream>
#include <vector>

class CKlasa
{
    std::fstream m_plik;
};

int main()
{
    std::vector < CKlasa > vDane( 100 );
    return 0;
}
i powyższy kod również zadziała (no i uzyskasz dokładnie ten sam efekt jak dla zwykłej tablicy).
P-66914
Unlimited
Temat założony przez niniejszego użytkownika
» 2012-10-15 22:48:20
Vector deklarowałem w sekcji main i działało ale lipa trochę była ponieważ nie mogłem w żaden sposób dać go jako argument do funkcji.
P-66918
DejaVu
» 2012-10-15 22:50:21
Czyli robiłeś to po prostu źle. Nie ma takiej opcji 'że się nie da'.
P-66919
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona