String auslesen
-
Jochen Kalmbach schrieb:
Die vorherigen Zeilen einlesen, bis zu letzten Zeile?
Hi!
Ich muss die vorherigen Zeilen anders auslesen, als die letzte Zeile.
Daher wollte ich in meiner Klasse eine if-Abfrage machen, wenn die letzte Zeile erreicht ist.
Danke Tronador
-
Ob die letzte Zeile erreicht ist, bemerkst du normalerweise erst nach dem Einlesen, wenn der nächste Leseversuch einen EOF meldet. Aber eine Möglichkeit wäre es zu verfolgen, wo du gerade in der Datei stehst:
ifstream datei(...,ios::in|ios::ate); ios::pos_type endpos = datei.tellg(); datei.seekg(0); while(getline(datei,zeile)) { if(datei.tellg()==endpos) cout<<"und die letzte Zeile der Datei lautet: "<<zeile; }(Anmerkung: das ist die Lösung für std-C++ - die .NET-Klassen sollten ähnlich funktionieren)
-
@CStoll: Die Lösung passt nicht zum Forum

Besser wäre:
StreamReader sr("Filename.txt"); String ^line; String ^lastLine; while ((line = sr.ReadLine()) != nullptr) { lastLine = line; }
-
Vielen Dank, ich werde es versuchen...
Tronador
-
Irgendwie bin ich nicht zufrieden mit meiner Lsg.!
Meine Datei besteht aus mehreren Werten:
Zeitpunkt: 1 Wert: 50
Zeitpunkt: 2 Wert: 60
Zeitpunkt: 2 Wert: 70
Zeitpunkt: 3 Wert: 80Man muss dazu sagen, dass ich grundsätzlich nach jeder Zeile eine Funktion einer anderen Klasse aufrufen muss, die den Zeitpunkt und den Wert als Parameter übergeben bekommt. Wenn die Zeitpunkte jedoch identisch sind, dann wird die Fkt. mit dem letzten "Wert" aufgerufen, bevor(hier im Bsp.: Funktion x mit (2, 70) sich der Zeitpunkt verändert.
Ich habe bisher jeweils zwei help-Variablen global deklariert. Im ersten Schritt werden beide Hilfsvariablen auf die Werte der ersten Zeile gesetzt. Anschliessend wird in der nächsten Zeile abgefragt, ob der aktuelle Zeitpunkt mit dem gespeicherten der einen Hilfsvariable übereinstimmt. Ist dies nicht der Fall, wird die besagte Fkt. x aufgerufen, andernfalls wird nur der neue "Wert" in der zweiten Hilfsvariablen gespeichert.
Deshalb bin ich auf das Problem des Auslesens in der letzten Zeile gekommen, weil hier nur mit den vorherigen(eine Zeile zuvor) Werten gearbeitet wird.
In dieser Klasse passiert nur folgendes:
void processLine(const char* line){ string what; double zeit = -1; ... istringstream is(line) while(is) { is >> what; if(what.compare("Zeitpunkt:") == 0) break; } if(is) { string s; is >> s; istringstream(s) >> zeit; }Mir ist jedenfalls nicht ganz klar, wie ich Eure Hilfestellungen hier einbauen soll?
MfG Tronador
-
Machst Du jetzt C++ oder C++/CLI? Sonst verschiebe ich dich...
-
Jochen Kalmbach schrieb:
Machst Du jetzt C++ oder C++/CLI? Sonst verschiebe ich dich...
C++....
-
Könnte eventuell bitte jemand das Thema in den Bereich C++ verschieben?
Danke
MfG Tronador
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Irgendwie sowas:
struct data { double time; unsigned int value; data() : time(0.0), value(0) {} }; void process_line(const std::string& string_line, data& dest) { std::size_t pos = string_line.find_first_not_of(" ", string_line.find_first_of("Zeitpunkt:")); std::istringstream ss(string_line.substr(pos)); ss >> dest.time; if (!ss) throw std::runtime_error("invalid input data"); ss.clear(); pos = string_line.find_first_not_of(" ", string_line.find_first_of("Wert:")); ss.str(string_line.substr(pos)); ss >> dest.value; if (!ss) throw std::runtime_error("invalid input data"); }...
test.dat
Zeitpunkt:5.0 Wert: 10 Zeitpunkt: 6.1 Wert: 14int main() { std::ifstream file("test.dat"); std::string line; data file_data; for (std::size_t cur_pos = 1; std::getline(file, line); ++cur_pos) { process_line(line, file_data); std::cout << cur_pos << ": Zeit => " << file_data.time << " Wert => " file_data.value << std::endl; } }...
-
Danke für die Hilfe.
Hätte man auch die Möglichkeit irgendwie die Fkt. eof() einzubauen, um das Ende der Datei abzufragen?