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

Umieszczenie danych pobranych z pliku w dynamicznej tablicy ('std::vector')

Ostatnio zmodyfikowano 2010-08-04 20:32
Autor Wiadomość
Dybusek
Temat założony przez niniejszego użytkownika
Umieszczenie danych pobranych z pliku w dynamicznej tablicy ('std::vector')
» 2010-08-04 13:59:14
Witam.
Mam problem z odczytem danych z pliku do vectora. Korzystając z zwykłych tablic wszystko jest ok. Próbowałem użyć czegoś takiego:
C/C++
plik >> dane;
klient_t[ i ].id_k.push_back( dane );
plik >> dane;
klient_t[ i ].imie_k.push_back( dane );
Ale wyskakuje blad:
D:\Szkola\Stypendium\1Biblioteka\main.cpp In function `int main()':
44 D:\Szkola\Stypendium\1Biblioteka\main.cpp no matching function for call to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(std::string&)'
 note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:782 candidates are: void std::basic_string<_CharT, _Traits, _Alloc>::push_back(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
Proszę o pomoc.
P-20393
steckel
» 2010-08-04 16:50:28
Pokaż cały kod.
P-20398
Dybusek
Temat założony przez niniejszego użytkownika
» 2010-08-04 17:25:52
Na razie nie mam jak dodać całego kodu ponieważ zmieniłem tablice na statyczne, żeby ruszyć dalej z projektem.
Mam w programie strukturę i chcę wczytać do tablicy vector typu strukturalnego dane z pliku(dane są różnych typów).
Ze statycznymi to nie ma problemu bo wystarczy, że dam:
C/C++
while( !plik.eof() )
{
    plik >> ksiazka_t[ i ].id_ks;
    plik >> ksiazka_t[ i ].autor;
    plik >> ksiazka_t[ i ].tytul;
    plik >> ksiazka_t[ i ].stan;
    ++i;
}
Chcę uzyskać taki sam efekt tylko za pomocą kontenerów.
P.S. Wolałbym nie pisać metod w środku struktury.
P-20402
ison
» 2010-08-04 18:45:07
musiałbyś dać cały kod

tu masz to samo co robisz tylko na vectorach:
C/C++
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class ksiazka
{
private:
    string id_ks, autor, tytul, stan; //dane dotyczące książki
   
public:
    ksiazka( string new_id_ks, string new_autor, string new_tytul, string new_stan ) //konstruktor
    {
        id_ks = new_id_ks;
        autor = new_autor;
        tytul = new_tytul;
        stan = new_stan;
    }
    ksiazka() { } //konstruktor bez argumentów
    ~ksiazka() { } //destruktor
};
vector < ksiazka > ksiazki; //vector klas typu ksiazka

int main()
{
    ifstream in( "baza_danych.txt" );
    string dana1, dana2, dana3, dana4; //zmienne które będą wczytywane z pliku
    while( in >> dana1 >> dana2 >> dana3 >> dana4 ) //wczytywanie danych aż do napotkania końca zbioru
    {
        ksiazki.push_back( ksiazka( dana1, dana2, dana3, dana4 ) ); //wrzucanie klas utworzonych przez konstruktor do vectora
    }
}

potem do poszczególnych komórek vectora odwołujesz się jak do zwykłej tablicy tzn
C/C++
ksiazki[ i ].id_ks;
P-20407
Dybusek
Temat założony przez niniejszego użytkownika
» 2010-08-04 19:07:30
Dzięki ison. O taki przykład właśnie mi chodziło.
Pozdrawiam serdecznie.

Edit:

Mam maly problem i nie wiem jak go naprawić. Zastosowałem to do Twojego wzoru lecz wyskakuje mi błąd. Nie wiem co jest nie tak.

C/C++
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class klient
{
private:
    int id_k;
    string imie_k, nazwisko_k, adres_zamieszkania_k;
public:
    klient( int new_id_k, string new_imie_k, string new_adres_zamieszkania_k )
    {
        id_k = new_id_k;
        imie_k = new_imie_k;
        nazwisko_k = new_imie_k;
        adres_zamieszkania_k = new_adres_zamieszkania_k;
    } //konstruktor
    klient() { } //konstruktor bez argumentow
    ~klient() { } //destruktor
};

int main()
{
    vector < klient > klient_t;
    ifstream plik;
    int dane1;
    string dane2, dane3, dane4;
    plik.open( "klient.txt" );
    if( !plik.good() )
    {
        cout << "Brak dostepu do pliku 'klient.txt'. Aby zakonczyc nacisnij ENTER";
        cin.sync();
        cin.get();
        return 1;
    }
    else
    while( !plik.eof() )
    {
        plik >> dane1;
        plik >> dane2;
        plik >> dane3;
        plik >> dane4;
        klient_t.push_back( klient( dane1, dane2, dane3, dane4 ) );
    }
    plik.close();
    plik.clear();
    cin.sync();
    cin.get();
}
P-20409
ison
» 2010-08-04 20:23:49
wtedy w moim poprzednim poście zrobiłem mały błąd: w while'u zamiast cin powinno być in(żeby z pliku wczytywał) taka mała literówka :p

co do twojego problemu to do konstruktora przekazujesz argumenty tak jak do funkcji
konstruktory możesz przeciążać tak jak funkcje. Ty próbujesz wywołać konstruktor dla: dana1,dana2,dana3,dana4 kiedy takowego nie masz. Masz konstruktor w którym przyjmujesz 3 argumenty i konstruktor bez argumentów.
poprawny konstruktor dla: id,imienia,nazwiska i miejsca zamieszkania
C/C++
klient( int new_id_k, string new_imie_k, string new_nazwisko_k, string new_adres_zamieszkania_k ) //poprzednio brakowało ci zmiennej new_nazwisko_k
{
    id_k = new_id_k;
    imie_k = new_imie_k;
    nazwisko_k = new_nazwisko_k;
    adres_zamieszkania_k = new_adres_zamieszkania_k;
}
P-20414
Dybusek
Temat założony przez niniejszego użytkownika
» 2010-08-04 20:32:49
Kurde faktycznie, że brakowało. Ale ze mnie gafa. Teraz już wszystko rozumiem.
Jeszcze raz dzięki.
Do zamknięcia.
P-20415
« 1 »
  Strona 1 z 1