[C++] Wczytywanie danych z tekstu.
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

[C++] Wczytywanie danych z tekstu.

AutorWiadomość
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie danych z tekstu.
» 2017-01-11 19:01:19
Witam,
Mam pewien problem podczas wczytywania tekstu z pliku. Otóż planuje wczytać tekst, którego schemat wygląda tak:

1970;Francja;Citroen CX 25 GTi Turbo;229 km/h
1976;Francja;Renault Alpine A310;220 km/h
1986;Francja;Renault Alpine GTA;249 km/h
1989;Francja;Citroen XM 3.0i V6 24v;235 km/h

Mam jednak pewien problem. Gdy staram się wczytać kraj pochodzenia, tekst wczytuje mi się wraz ze średnikiem i nazwą po średniku. Chciałbym tego uniknąć, lecz nie do końca wiem jak sobie z tym poradzić. Wiem, że mógłbym zmodyfikować plik źródłowy ale to się mija z celem.

Kod programu:
C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include<string.h>


using namespace std;

struct cars {
    int rok;
    string krajPochodzenia;
   
    string model;
    int predkosc;
   
   
};

int main()
{
    fstream dane;
    vector < cars > lista;
    dane.open( "cars.csv", ios::in );
    if( dane.is_open() )
    {
        while( !dane.eof() )
        {
            cars temp;
            string kmh;
            dane >> temp.rok;
            char znak; dane >> znak;
            dane >> temp.krajPochodzenia;
            char znak1; dane >> znak1;
            getline( dane, temp.model );
            char znak2; dane >> znak2;
            dane >> temp.predkosc;
            dane >> kmh;
            lista.push_back( temp );
        }
    }
    dane.close();
    system( "pause" );
}
P-156331
» 2017-01-11 19:21:58
Pobieraj jedną linijkę tekstu i szukaj w nich średników.
http://en.cppreference.com/w​/cpp/string/basic_string/find
P-156333
Temat założony przez niniejszego użytkownika
» 2017-01-11 19:40:59
A potem mam to dzielić po znalezieniu iteratora przez funkcję find?
P-156334
» 2017-01-11 20:10:28
Tak.
P-156335
» 2017-01-11 20:18:44
Nie mieszaj getline() z cin >> . Skazujesz się wtedy na niepotrzebne problemy braku czyszczenia bufora w którym zostaje '\n'. Podział możesz zrobić find() ale szybciej chyba tak:
C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

struct cars {
    int rok;
    string krajPochodzenia;
   
    string model;
    int predkosc;
};

int main() {
    ifstream dane( "cars.csv" );
    vector < cars > lista;
    string line;
    while( dane ) {
        if( not getline( dane, line ) ) {
            break;
        }
        istringstream stream( line );
        while( stream ) {
            string field;
            if( not getline( stream, field, ';' ) ) {
                break;
            }
            // A tu sobie pola zamienisz na okdeślone dane
            //
            // Dla diagnostyki
            cout << field << '\n';
        }
    }
    system( "pause" );
}
P-156336
Temat założony przez niniejszego użytkownika
» 2017-01-11 23:38:10
Poradziłem sobie z tym problemem, używając iteratorów. Dzięki za pomoc ;)
P-156348
« 1 »
 Strona 1 z 1