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

Wczytywanie ciągu znaków do struktury.

Ostatnio zmodyfikowano 2017-09-07 20:41
Autor Wiadomość
SzymSzym
Temat założony przez niniejszego użytkownika
Wczytywanie ciągu znaków do struktury.
» 2017-08-30 19:30:47
Mój problem polega na tym, że kiedy wewnątrz struktury znajduje się zmienna typu string
C/C++
struct CD
{
    string nazwa;
    string wykonawca;
    string kategoria;
    float cena;
    int numer;
} disc;
To po jej wczytaniu z klawiatury wyświetla się komunikat, że program przestał działać. W przypadku, gdy w kodzie jest
C/C++
getline( cin, disc.nazwa );
To program przestaje działać jeszcze zanim cokolwiek wpiszę. Natomiast gdy użyję samego cin
C/C++
cin >> disc.nazwa;
To program wywala się dopiero po wpisaniu danych.
Ktoś wie coś na temat zmiennej typu string w strukturze, co mogło spowodować tego typu błąd? Dodam jeszcze, że nie jest to (raczej) wina błędu w kodzie, bo potem jest wczytanie pozostałych danych, które już się nie wykonuje, więc problemem jest ta linijka.
P-164409
pekfos
» 2017-08-30 19:55:01
Może najpierw podaj kod, zanim stwierdzisz że nie w nim problem.
P-164416
karambaHZP
» 2017-08-30 21:54:18
Skoro program się wywala pewnie pojawia się jakiś komunikat.
Można go przytoczyć?
P-164430
mateczek
» 2017-08-31 15:06:42
jeśli program przestaje działać i zwyczajnie się wysypuje. To jest to niestety przeważnie wina błędu w kodzie.
Początkujący adept programowania raczej nie znajdzie bug-a w kompilatorze ;)
P-164457
SzymSzym
Temat założony przez niniejszego użytkownika
» 2017-09-04 16:26:17
C/C++
void nowy()
{
    bool flag;
    do
    {
        flag = false;
        cout << "Podaj numer przegrodki:  ";
        cin >> disc.numer;
        cout << endl;
        for( int i = 0; i < ilosc; i++ )
        {
            if( sloty[ i ] == disc.numer )
            {
                cout << "Przegrodka zajeta. Sprobuj ponownie." << endl; //sprawdzenie czy przegrodka nie jest zajeta
                system( "Pause" );
                flag = true;
            }
        }
    } while( disc.numer < 1 || disc.numer > MAX || flag == true );
   
    sloty[ ilosc ] = disc.numer;
    ilosc++;
    return;
}

void zajete()
{
    int i = 0;
    ilosc = 0;
    if(( baza = fopen( NAZWA_BAZA, "r" ) ) != NULL )
    {
        while( fread( & disc, sizeof( disc ), 1, baza ) == 1 ) //wczytanie bazy
        {
            sloty[ i ] = disc.numer;
            i++;
            ilosc++;
        }
        fclose( baza );
        return;
    }
    else
    {
        cout << "Brak dostepu do bazy" << endl;
        return;
    }
}

void dodaj()
{
    if( ilosc >= MAX )
    {
        cout << "Brak miejsca na kolejne plyty" << endl;
        system( "Pause" );
        return;
    }
    if(( baza = fopen( NAZWA_BAZA, "a" ) ) == NULL )
    {
        cout << "Brak dostepu do bazy" << endl;
        return;
    }
    cout << "Podaj dane plyty:" << endl << "Podaj nazwe plyty:  ";
    getline( cin, disc.nazwa );
    cout << endl << "Podaj wykonawce plyty:  ";
    getline( cin, disc.wykonawca );
    cout << endl << "Podaj kategorie plyty:  ";
    getline( cin, disc.kategoria );
    cout << endl << "Podaj cene plyty:  ";
    cin >> disc.cena;
    nowy();
    fwrite( & disc, sizeof( disc ), 1, baza );
    fclose( baza );
    return;
}

int main()
{
    char tryb;
    zajete();
    do
    {
        cout << "Program obslugi kolekcji plyt" << endl << "1 Dodaj plyte" << endl << "2 Usun plyte" << endl << "3 Modyfikuj dane o plycie" << endl << "4 Zmien polozenie plyty" << endl << "5 Znajdz plyte" << endl;
        cout << "6 Wyswietl liste plyt" << endl << "7 Zakoncz" << endl;
        cin >> tryb;
        cout << endl;
        zajete();
        switch( tryb )
        {
        case '1':
            dodaj();
            break;
        case '2':
            usun();
            break;
        case '3':
            zmien();
            break;
        case '4':
            przesun();
            break;
        case '5':
            znajdz();
            break;
        case '6':
            lista();
            break;
        }
    } while( tryb != '7' );
   
    return 0;
}

Problem leży najprawdopodobniej w funkcji dodaj, przytaczanie pozostałych chyba nie ma sensu, bo i tak się nie wykonują, a jest ich sporo.
P-164583
Monika90
» 2017-09-04 16:46:59
C/C++
fwrite( & disc, sizeof( disc ), 1, baza );
fread( & disc, sizeof( disc ), 1, baza )
Takim sposobem nie da się zapisywać ani odczytywać z pliku struktury zawierającej std::string, wymyśl coś innego. Nawet mamy artykuł na ten temat http://cpp0x.pl/artykuly/?id=72
P-164586
SzymSzym
Temat założony przez niniejszego użytkownika
» 2017-09-04 21:48:26
Dodam jeszcze, że problem z wczytaniem łańcuchów do struktury występuje również w innych programach, bez dostępu do plików. Dotyczy zarówno obiektu cin jak i funkcji getline i zarówno tablic znaków jak i zmiennych typu string.
P-164599
mateczek
» 2017-09-06 05:54:17
Dodam jeszcze, że problem z wczytaniem łańcuchów do struktury występuje również w innych programach, bez dostępu do plików.
A z problemami w innych programach kontaktuj się z "wróżbita Maciej" (duży wybór narzędzi diagnostycznych :P  fusy, tarot, kryształowa kula). Na forum obecnie brak jasnowidzów :P
P-164625
« 1 » 2
  Strona 1 z 2 Następna strona