Problem: Datei einlesen und Werte zurückgeben
-
Hallo,
ich möchte gerne folgendes machen:
Ich habe mehrere Dateien, die eingelesen werden sollen. Die Dateien enthalten Variablen, mit denen anschließend weiter gerechnet werden soll.
Dafür habe ich in der Klasse "test" eine allgemeine read-Funktion zur Verfügung, die alle Dateien einfach nur einliest, sowie eine find-Funktion, die mir anhand eines Schlüsselwortes den jeweiligen Wert zurückgibt.
Früher waren die read- und die find-Funktion in einer zusammengefasst, jetzt wollte ich die Funktionen aber aufteilen, so dass es nur noch eine einzige read-Funktion im ganzen Programm gibt und nur die find-Funktion je nach Datei anders aussieht.In der main-Funktion rufe ich also folgende Funktionen auf:
int main() { test frage; frage.read("datei.txt"); frage.find("ABC"); return 0; }
Die read-Funktion könnte dann ja so aussehen:
bool test::read(const string dateiname) { ifstream IN; IN.open (dateiname.c_str()); if (IN.good()) { string zeile; while (getline(IN, zeile)) { if (!zeile.empty()) { return true; } } } else { cout<<"FEHLER\n"; return false; } IN.close(); }
In der find-Funktion werden später dann mehrere Fälle für die unterschiedlichen Dateien unterschieden, aber bis jetzt sieht es so aus:
const double test::find(const string& schluesselwort) const { string zeile; double wert; if (zeile.find(schluesselwort) != string::npos) { // hier wird dann die entsprechende Zeile zerlegt und der Wert herausgeschrieben return wert; } }
Wie muss ich denn jetzt die beiden Funktionen "verknüpfen", dass es dann auch funktioniert? Denn bis jetzt weiß ja die find-Funktion nicht, wo sie eigentlich nach dem Schlüsselwort suchen soll...
Vielen Dank schon mal!
-
Am besten, du speicherst die einzelnen Zeilen in einen std::vectorstd::string (oder alternativ auch in einen einzigen std::string).
Such mal hier im Forum nach "Datei einlesen" o.ä.
-
Wie mach ich denn das Speichern in einen einzigen String?
bool test::read(const string dateiname) { ifstream IN; IN.open (dateiname.c_str()); if (IN.good()) { string zeile; while (getline(IN, zeile)) { if (!zeile.empty()) { [b] test::bsp = line;[/b] } } return true; } else { cout<<"FEHLER\n"; return false; } IN.close(); }
Dementsprechend heißt es dann in der find-funktion:
...
if (test::bsp.find(schluesselwort) != string::npos)
...Nur wenn ich das so mache, dann steht in dem string "bsp" natürlich nur die letzte Zeile. Geht das nicht auch, dass ich alle Zeilen zur Verfügung hab?
-
zB indem du der Funktion read eine Referenz auf einen std::vectorstd::string übergibst und dort die Zeilen reinschreibst. Diesen gibst du dann auch an die find-Methode weiter oder läßt die find-Methode durch eine Schleife über jede Zeile laufen.