2016-07-25 7 views
-2

Ich habe eine Datei mit der Bezeichnung Daten Daten aus der Datei beschriftet wie:C++ Lesung

Label1,0.002546,0.054126,... 
... 
... 
LabelN,0.025413,0.985412,... 

Was ich will, ist Etiketten zu speichern, um std::vector<std::string> und Daten zu std::vector<std::vector<double>> Also, das ist, was ich versucht:

input.open(files.at(0)); 

while (std::getline(input, line)) { 

    std::istringstream is(line); 

    // Get label 
    labels.push_back(*(++std::istream_iterator<string>(is))); 

    // Get data 
    data.push_back(std::vector<double>(++std::istream_iterator<double>(is), std::istream_iterator<double>())); 

} 

Aber das funktioniert nicht und ich erhalte immer

Debug Assertion Failed!
Programm: C: \ Windows \ system32 \ MSVCP120D.dll
Datei: c: \ Programme (x86) \ Microsoft Visual Studio 12.0 \ vc \ include Vektor
Zeile \: 72
Expression: Vektor-Iterator nicht dereferencable

+1

Welche Zeile ist 72? –

+0

@underscore_d Das ist, was Visual Studio Pop-up-Fenster sagt. – DimChtz

+1

Die Verwendung von temporären Iteratoren sieht wirklich verdächtig aus. Ich würde 'std :: iStream_iterator (is) 'eine benannte Variable in der Schleife machen und sehen, ob das Problem bestehen bleibt. – NathanOliver

Antwort

1

Ihre istream_iterator<string> wird die gesamte Zeile verbrauchen; Sie müssen auf , irgendwie tokenize, z.B .:

std::istringstream is(line); 
data.push_back({}); 

std::string token; 
std::getline(is, token, ','); 
labels.push_back(token); 
while (std::getline(is, token, ',')) { 
    double v; 
    std::istringstream(token) >> v; 

    data.back().push_back(v); 
} 

Beachten Sie, dass die leicht kryptische Doppel Parsing durch beispielsweise ersetzt werden könnte boost::lexical_cast oder ähnlicher Helfer.

+0

Obwohl jetzt, dass ich geschrieben habe, denke ich Schreiben separated_iterator 'könnte eine schöne Übung sein –

+0

Okay, ich habe es auf Ihre Weise . Jetzt mache ich keine Fehler, aber es liest nur die erste Nummer jeder Zeile – DimChtz

+0

Ich habe es behoben und es funktioniert einwandfrei. Vielen Dank – DimChtz

Verwandte Themen