File Parser - Daten aus Datei einlesen
-
Hallo zusammen,
für mein Programm habe ich mir einen File-Parser geschrieben.
Bisher sieht dieser wie folgt aus:std::ifstream file; std::vector<double> tempVector; double tempValueOne, tempValueTwo; std::ifstream filePath(nameOfFile.c_str()); for( int i=0; i < 325 && filePath; ++i ) { filePath >> tempValueOne >> tempValueTwo; tempVector.push_back(tempValueOne); tempVector.push_back(tempValueTwo); data_dblvec.push_back(tempVector); // std::vector<std::vector<double>> tempVector.clear(); }Die funktioniert auch alles.
Mein Problem ist nun aber, dass wenn meine Datei aus mehr Zeilen besteht müsste ich die Schleife ja ändern.
Ebenso wenn mehr Double Werte in einer Zeile stehen.Gibt es hierfür so etwas wie einen Iterator, der solange die Zeile abarbeitet bis darin keine Symbole mehr auftauchen?
Ebenso der solange die nächste Zeile bearbeitet, bis es eben keine nächste Zeile mehr gibt?
(Ich kenne dies aus Java, wo so etwas möglich ist)
-
#include <string> #include <vector> #include <fstream> #include <sstream> int main() { double value; std::string line; std::vector<double> tempVector; std::ifstream file(nameOfFile.c_str()); while(std::getline(file, line)) { std::istringstream iss(line); while(iss >> value) { tempVector.push_back(value); } } // ... return 0; }std::getline: http://www.cplusplus.com/reference/string/getline.html
std::ios::operator void*(): http://www.cplusplus.com/reference/iostream/ios/operator_voidpt.htmlGrüssli
-
#include <fstream> #include <iostream> #include <string> #include <vector> int main() { std::vector< std::vector<double> > data_dblvec; std::string nameOfFile = "input.txt"; std::ifstream filePath( nameOfFile.c_str() ); for( std::vector< double > tempVector(2); filePath >> tempVector[0] >> tempVector[1]; ) data_dblvec.push_back( tempVector ); return 0; }Bem.: getline ist wirklich meistens doof; und in diesem Fall garantiert
Gruß
Werner
-
Tja, und was ist dann mit:
redbomber schrieb:
Ebenso wenn mehr Double Werte in einer Zeile stehen.
?
-
Ja genau, bei mir könnten also auch viele Double Werte in einer Zeile stehen.
Vielen Dank euch allen, hat super geklappt.
Nun noch eine Frage:
Um Fehler abzufangen überprüfe ich die Größe vom Vector in den alle Double Werte geschrieben werden. Falls dieser leer ist gebe ich eine Fehler aus.
Würdet ihr das genauso machen oder hättet ihr einen besseren Vorschlag um Fehler beim einlesen abzufangen?
-
redbomber schrieb:
Nun noch eine Frage:
Um Fehler abzufangen überprüfe ich die Größe vom Vector in den alle Double Werte geschrieben werden. Falls dieser leer ist gebe ich eine Fehler aus.
Würdet ihr das genauso machen oder hättet ihr einen besseren Vorschlag um Fehler beim einlesen abzufangen?Ja, das kannst du machen. Je nachdem kannst du auch eine Exception werfen - kommt halt drauf an, wie häufig der Fehler vorkommt. Wenn man normalerweise nicht damit rechnet, ist eine Exception angebracht, sonst nicht.
Zudem kannst du den Filestream auf
fail()abfragen, um zu sehen, ob intern was schief gelaufen ist. Eventuell ist auch eine manuelle Überprüfung derdouble-Werte angebracht, wenn diese z.B. bestimmte Wertebereiche oder andere Bedingungen einhalten müssen.
-
Naja, Werner hat schon recht.
getlineist hier eigentlich mit dem Beispiel doof. Aber es kommt etwas drauf an, was du mit den doubles machst. Wenn du sie einfach nur alle in dem Vektor haben willst, egal auf welcher Zeile sie waren, dann wäre wohl das folgende besser:#include <vector> // vector #include <fstream> // ifstream #include <iterator> // istream_iterator, back_inserter #include <algorithm> // copy // ... std::ifstream file("..."); std::vector<double> vec; std::copy(std::istream_iterator<double>(file), std::istream_iterator<double>(), std::back_inserter(vec));std::istream_iteratorliest mit demoperator >>. Per Default ist skip whitespace als Option aktiviert. Jeglicher Linefeed, Carriage Return, Space und Tab wird ignoriert. Die Copy Anweisung kopiert nun jeglicher double im File in den Vektor, bis das Ende des Files erreicht wird.Grüssli
-
Ok, in meinem Fall wäre es dann aber doch mit getline angebracht, da die Werte in einer Zeile zusammen gehören.