Tabelle aus Datei lesen
-
Hallo
Ich muß eine Datei die Messwerte enthält konvertieren. Die Datei ist ungefähr so aufgebaut:
a b c
0 -0.00004 -1.44433 -0.00003
1 -0.00003 -1.22222 -0.00044
uswIn der neuen Datei sollen die Spalten die Zeilen sein.
Jetzt will ich erstmal die einzelnen Werte in Variablen zum Weiterarbeiten speichern.
Beim auslesen hab ich aber schon das Problem, daß stringstream mir nur eine Zahl nach dem "Komma" mitgibt.
Hier mal mein Code:#include <iostream> #include <string> #include <fstream> #include <sstream> using namespace std; int main() { ifstream fin("rein",ios::binary ); ofstream fout("raus",ios::binary ); string str; int j=0,i=0; double v[10]; cout << "Hier der Inhalt der Datei:\n"; while (fin.good()) { getline(fin,str,'\n'); cout <<str<<endl; stringstream s; s<<str; s>>v[i++]>>v[i++]; } cout<< "\nEnde der Ausgabe\n"; cout<<"Variableninhalt:\n"; for(j=0;j<i;j++) { cout<<v[j]<<endl; } fin.close(); fout.close(); cin.get(); }Ich bin leider mit C++ nicht sehr bewandert und such mir das Zeug im Netz zusammen.Try&Error eben.
Also wenn einer 'ne Idee hätte...Danke!
LG
Stefan
-
#include <iostream> #include <string> #include <fstream> #include <sstream> int main() { std::ifstream file_in("data.dat", std::ios::in); if (!file_in) std::cout << "Couldn't find file!" << std::endl; return 0; std::cout << "Dateiinhalt:\n << =======<>======= >> " << std::endl; std::stringstream ss; ss << file_in.rdbuf(); std::string file_content = ss.str(); std::cout << file_content << "\n << =======<>======= >> " << std::endl; }so hasse schonmal den Dateinhalt ... sollte so gehen ^^ hab es nicht kontrolliert ...
hmm aber in deinem Fall wäre es so besser:
#include <iostream> #include <string> #include <fstream> #include <sstream> int main() { std::ifstream file_in("data.dat", std::ios::in); if (!file_in) std::cout << "Couldn't find file!" << std::endl; return 0; std::cout << "Dateiinhalt:\n << =======<>======= >> " << std::endl; std::vector<std::vector<std::string>> data; std::string file_line; while (std::getline(file_in, file_line)) { std::cout << file_line << std::endl; std::vector<std::string> cur_line_data; for (std::size_t pos = file_line.find_first_of(' '); !file_line.empty(); pos = file_line.find_first_of(' ')) { cur_line_data.push_back(file_line.substr(0, pos)); file_line.erase(0, pos); } data.push_back(cur_line_data); } std::cout << " << =======<>======= >> " << std::endl; }... data[0][1] wäre bsw. "0" ... und data[0][2] dann "-0.00004" ...
-
(D)Evil schrieb:
if (!file_in) std::cout << "Couldn't find file!" << std::endl; return 0;Hallo (D)Evil,
ich hatte Dein Programm ausprobiert und schon an mir verzweifelt bevor ich den fatalen Fehler in dieser Zeile gefunden habe!Hallo Stefan,
wenn ich Deine Anforderung richtig verstanden habe, so sollte folgendes Programm ein Lösungsansatz sein:#include <iostream> #include <fstream> #include <iomanip> #include <string> #include <iterator> #include <vector> struct Entry { int m_id; double m_abc[3]; }; std::istream& operator>>( std::istream& in, Entry& e ) { return in >> e.m_id >> e.m_abc[0] >> e.m_abc[1] >> e.m_abc[2]; } int main() { using namespace std; ifstream fin( "rein" ); if( !fin.is_open() ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -1; } string kopf[3]; fin >> kopf[0] >> kopf[1] >> kopf[2]; // a b c lesen vector< Entry > buf( (istream_iterator< Entry >( fin )), istream_iterator< Entry >() ); cout << buf.size() << " Eintraege gelesen" << endl; ofstream fout( "raus" ); // vier Zeilen schreiben const int spalte1_breite = 4; const int spalteN_breite = 9; // 1. Zeile fout << setw(spalte1_breite) << " "; // 1.Spalte leer for( vector< Entry >::iterator i = buf.begin(); i != buf.end(); ++i ) fout << setw(spalteN_breite) << i->m_id; fout << endl; fout << fixed << setprecision( spalteN_breite - 4 ); // Anzahl Nachkommastellen: breite - (1xZwischenraum + 1xVorzeichen + 1xDezimalpunkt + 1xVorkommastelle) // 2.- 4. Zeile for( int idx = 0; idx < 3; ++idx ) { fout << setw(spalte1_breite) << kopf[idx]; // 1.Spalte for( vector< Entry >::iterator i = buf.begin(); i != buf.end(); ++i ) fout << setw(spalteN_breite) << i->m_abc[idx]; fout << endl; } return 0; }Gruß
Werner
-
Hallo (D)Evil,
ich hatte Dein Programm ausprobiert und schon an mir verzweifelt bevor ich den fatalen Fehler in dieser Zeile gefunden habe!Hmm ... hasst de recht ... war mir nicht sicher ob das nicht doch ging ... steht ja in einer Zeile

Ähm ich war nicht davon ausgegangen das immer genau 3 Inhalte drin stehen und das abc jeweils überschriften sind sowohl 012 usw. die Zeilennummern ... dann kannst du es so machen wie Werner meinte ... dynamische Anzahl von Spalten und Zeilen usw. hasse aber bei meinem Ansatz

-
Hallo
erstmal vielen Dank für eure Hilfe. Werd im Moment anderswo gebraucht (Praktikant halt)und somit liegt das Prog wieder auf Eis.
Ich verstehe bei den Programmen leider einiges nicht, werd sie aber als Anregung betrachten und mich anhand den Schlagwörtern einlesen.
Wir hatten leider in den 2 C/C++Semester einen Prof, bei dem wir nicht wirklich was lernten. Ich kann jetzt mit Schleifen, Fallunterscheidungen, Klassen usw. umgehen, aber z.b. using namespacestd, std::, strings, ifstream, arbeiten mit Dateien usw sind mir fremd.
Werd wohl noch ein Selbststudium dranhängen
LG
Stefan
-
using namespace std;Wenn de das schreibst, musst du kein std:: mehr vor die Funktionen schreiben ... untergräbst aber auch den Sinn von Namespaces ... da du so bsw. eine Funktion ausm Global-Namespace und eine ausm std-Namespace mitm gleichen Namen usw. nicht ohne weiters unterscheiden kannst.
std::stringNaja ... http://www.cplusplus.com/reference/string/string/ ... ist halt sozusagen der C++ ersetz für einen char-array ... aber guck es dir mal genauer an ...
http://www.highscore.de/ hat nen ganz nettes Tutorial ... auch wenn die Codesnippets nicht immer 100% optimiert sind
