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

[C++] Wczytywanie danych z pliku do zmiennych (różne typy)

Ostatnio zmodyfikowano 2014-01-24 22:10
Autor Wiadomość
cancer
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie danych z pliku do zmiennych (różne typy)
» 2014-01-24 15:44:03
Witam,

Mam program, który zapisuje do pliku dane z list... Wymyśliłem, że jeżeli zapiszę je tak:

C/C++
baza.open( "baza.txt", ios::in );
baza << temp->id << ";;" << temp->nazwisko << ";;" << temp->specjalnosc << ";;" << temp->srednia << endl;

to nie będę miał problemów z odczytem, jednak nie mogę sobie z nim poradzić, ponieważ są to inne typy zmiennych (int, string, string, float)...

Myślałem nad czymś takim
baza >> temp->id >> ";;" >> temp->nazwisko >> ";;" >> temp->specjalnosc >> ";;" >> temp->srednia >> "\n";
ale to nie chodzi...

Albo nad czymś takim:
baza >> temp->id >> temp->nazwisko >> temp->specjalnosc >> temp->srednia;
ale to tym bardziej nie chodzi...

Na początku chciałem to zrobić tak (część kodu - dla zmiennej id):
C/C++
getline( baza, linia );
while( linia[ i ] != '\n' ) {
    if( zmienna == 0 ) {
        while(( int )( linia[ i ] ) != 59 ) { //; - 59
            while(( int )( linia[ i ] ) != 59 ) {
                chwilowy[ j ] = linia[ i ];
                i++;
                j++;
            }
            i++;
        }
        temp->id =( int )( chwilowy );
        j = 0;
        zmienna++;
    }
}
Jednak problem pojawił się przy rzutowaniu, ponieważ mi go nie puszczało...

Próbowałem zrobić to jeszcze innym sposobem:
C/C++
baza.open( "baza.txt", ios::in );
if( baza.good() ) {
    while( true ) { //!baza.eof()
        baza >> temp->id >> temp->nazwisko >> temp->specjalnosc >> temp->srednia;
       
        if( baza.good() )
             temp = temp->nastepna;
        else
             break;
       
    }
    baza.close();
}

Lecz wyrzuciło mi błąd:
Unhandled exception at 0x689E2208 (msvcp110d.dll) in projekt2.exe: 0xC0000005: Access violation writing location 0x00000000.

Możecie mi jakoś pomóc? Coś poradzić? Bo muszę jakoś ten odczyt z pliku wykombinować, żeby mi mógł do zmiennych przypisywać.

Pozdrawiam
P-103040
pekfos
» 2014-01-24 18:50:32
to nie będę miał problemów z odczytem
Efekt odwrotny. Jako separatorów używaj spacji, lub innego białego znaku. Wtedy wszystko wczytasz w jednym ciągu (ten "tym bardziej niedziałający sposób"). Jedyny problem, jaki może być, to spacja w stringu. To możesz rozwiązać na 2 sposoby: zmień przy zapisie spację na inny znak, a po odczytaniu z powrotem zmień na spację, lub zmień separator na inny biały znak, a string wczytuj przez getline().
Jeśli chcesz pozostać przy separatorach, które nie są białymi znakami, to najlepszym sposobem będzie wczytywanie wszystkiego przez getline() i konwertowanie danych na określone typy.

Próbowałem zrobić to jeszcze innym sposobem:
Elementy listy same się nie tworzą. Strzelam, że to jest przyczyną.
P-103089
cancer
Temat założony przez niniejszego użytkownika
» 2014-01-24 19:18:57
Czyli jak mogę to wczytać? Bo getline musi być chyba przypisane do jakiegoś stringa, tak?
A potem jak to będę konwertował to tak tego stringa podzielić?
P-103099
pekfos
» 2014-01-24 19:21:51
A potem jak to będę konwertował to tak tego stringa podzielić?
getline() automatycznie podzieli, jak mu podasz separator.
P-103100
cancer
Temat założony przez niniejszego użytkownika
Podział getline()
» 2014-01-24 21:07:09
OK. Tylko mam problem z typem zmiennych...

Zrobiłem to tak:

C/C++
void lista::wczytaj_liste() //Wczytywanie listy z pliku
{
    osoba * temp = pierwsza;
    fstream baza;
   
    int i = 0;
   
    string item;
    vector < int > elInt;
    vector < float > elFloat;
    vector < string > elString;
   
    baza.open( "baza.txt", ios::in );
    if( baza.good() )
    {
        while( true ) //!baza.eof()
        {
            while( getline( baza, item, ' ' ) ) {
                if( i == 0 )
                     elInt.push_back( item );
               
                if( i == 1 || i == 2 )
                     elString.push_back( item );
                else
                     elFloat.push_back( item );
               
                i++;
            }
           
            temp->id = elInt[ 0 ];
            temp->nazwisko = elString[ 0 ];
            temp->specjalnosc = elString[ 1 ];
            temp->srednia = elFloat[ 0 ];
           
            if( baza.good() )
                 temp = temp->nastepna;
            else
                 break;
           
        }
        baza.close();
    }
}

Ale są błędy przy kropce w
elInt.push_back( item );
 lub wersji z Float. Czyli chyba właśnie przez to, że item ma typ String... Nie wiem co zrobić, żeby to było dobrze...
P-103111
pekfos
» 2014-01-24 21:41:40
Konwertuj ręcznie. Jest do tego pełno różnych funkcji itp.
P-103116
cancer
Temat założony przez niniejszego użytkownika
atoi()... Dlaczego nie działa?
» 2014-01-24 21:44:49
Użyłem atoi():

C/C++
while( true ) { //!baza.eof()
    while( getline( baza, item, ' ' ) ) {
        el.push_back( item );
    }
   
    temp->id = atoi( el[ 0 ].c_str() );
    temp->nazwisko = el[ 1 ];
    temp->specjalnosc = el[ 2 ];
    temp->srednia = atoi( el[ 3 ].c_str() );
   
    if( baza.good() )
         temp = temp->nastepna;
    else
         break;
   
}

Lecz wyświetla mi komunikat:

Unhandled exception at 0x689E2208 (msvcp110d.dll) in projekt2.exe: 0xC0000005: Access violation writing location 0x00000000.

Wiecie może dlaczego nie mam dostępu do tego pliku?
P-103117
cancer
Temat założony przez niniejszego użytkownika
Znalazłem rozwiązanie problemu
» 2014-01-24 22:10:48
Znalazłem rozwiązanie, wrzucę kod, jakby komuś mogło się kiedyś przydać.

C/C++
void lista::wczytaj_liste() { //Wczytywanie listy z pliku
    fstream baza;
    string item;
    vector < string > el;
   
    int elem = 0;
   
    baza.open( "baza.txt", ios::in );
    if( baza.good() )
    {
        while( true ) //!baza.eof()
        {
            while( getline( baza, item, ' ' ) ) {
                el.push_back( item );
                elem++;
            }
           
            for( int rek = 0; rek < elem; rek = rek + 4 ) {
                osoba * nowa = new osoba; // tworzy nowy element listy
               
                nowa->id = atoi( el[ rek % 4 ].c_str() );
                nowa->nazwisko = el[ rek % 4 + 1 ];
                nowa->specjalnosc = el[ rek % 4 + 2 ];
                nowa->srednia = atof( el[ rek % 4 + 3 ].c_str() );
               
                if( pierwsza == 0 ) // sprawdzamy czy to pierwszy element listy
                {
                    // jeżeli tak to nowy element jest teraz początkiem listy
                    pierwsza = nowa;
                }
               
                else
                {
                    // w przeciwnym wypadku wędrujemy na koniec listy
                    osoba * temp = pierwsza;
                   
                    while( temp->nastepna )
                    {
                        // znajdujemy wskaźnik na ostatni element
                        temp = temp->nastepna;
                    }
                   
                    temp->nastepna = nowa; // ostatni element wskazuje na nasz nowy
                    nowa->nastepna = 0; // ostatni nie wskazuje na nic
                }
            }
           
            if( !baza.good() )
                 break;
           
        }
        baza.close();
    }
}

Dziękuję za pomoc i pozdrawiam :)
P-103118
« 1 »
  Strona 1 z 1