Integer aus Datei lesen und in Vector speichern
-
Hallo,
ich habe eine .txt-Datei, in der in jeder Zeile 3 Integer stehen. Die erste Zahl soll in graph[i].from, die 2. in graph[i].to und die 3. in graph[i].cost gespeichert werden. Ich will dafür den STL-vector mit Elementen meiner Klasse, die aus den 3 Integer-Variablen "from","to" und "cost" besteht, benutzen. In C hab ich das mit einem Struct schon gemacht und zum Auslesen fscanf() benutzt. Das sah dann so aus:for(i=0;i<=(edges-1);++i){ /*Einlesen der Knoten Kanten und Kosten*/ fscanf(datei,"%i%i%i",&graph[i].from,&graph[i].to,&graph[i].cost); }Ich hab keine Ahnung, wie das in C++ geht, da man scanf() soweit ich wiess vermeiden sollte.
Hoffe ich hab genug Infos gegeben und mir kann jemand weiterhelfen.
-
Hier mal das Einlesen der Datei:
using namespace std; #include <fstream> #include <string> ifstream FileIn("test.txt"); if (FileIn) { // Solange kein Fehler auftritt und nicht eof for ( string ReadString; getline(FileIn, ReadString); ) { // hier kommt ein Textparser hin, der die einzeln integerwerte rausparst. } }Dann musst du dir noch einen Textparser programmieren, der einen String in seine Einzelteile zerlegt. Ich hab mir mal irgendwann sowas geschrieben. Den brauch man öfter mal.
-
Danke.
Allerdings hatte eigentlich vor, genau das nicht machen zu müssen, sondern die Werte eben nicht als String, sondern direkt als Zahlen aus der Datei zu lesen. So wie das in dem Beispiel mit dem fscanf() gemacht wurde. Vielleicht ist das aber auch einfach keine gute Idee, keine Ahnung.
-
Wenn nur die 3 Integer pro Zeile dort sind, kannst du das somachen:
std::ifstream in ( "file.txt" ); for (int i = 0; i < edges; ++i ) in >> graph[i].from >> graph[i].to >> graph[i].cost;Wenn noch andere Sachen vorkommen, dann must du die halt auch einlesen. (und dann halt verwerfen, wenn sie nicht benötig werden).
-
Irgendwie scheint es da noch Probleme zu geben.
Hier mal ein Bespiel:
#include <iostream> #include <fstream> using namespace std; int k=3,l=2; int main(){ std::ifstream in ( "C:\test.txt" ); in >> k >> l ; cout << "\nk: " << k << "\tl: " << l; return 0; }In C:\test.txt steht nichts ausser einer 1, dann ein Leerzeichen und dann eine 4.
Die Ausgabe des Programms ist trotzdem " k: 3 l: 2".
Das versteh ich gar nicht.
-
Du solltest prüfen ob die Datei überhaupt offen ist.
und mach mal aus "C:\Text.txt" -> "C:/Text.txt"
-
Oh Mann, es war tatsächglich "/" statt "\", blöder Fehler.
Eins noch: Was mach ich denn, wenn "from","to" und "cost" private Datenelemente sind und ich da nur über Funktionen in der Klasse rankomme? Ich könnte natürlich erst die Werte in 3 Hilfsvariablen einlesen und dann nach dem Auslesen der 3 Werte an die Funktionen übergeben, aber das geht doch bestimmt eleganter.
Danke schonmal für die tolle Hilfe hier.
-
alx3400 schrieb:
Oh Mann, es war tatsächglich "/" statt "\", blöder Fehler.
Eins noch: Was mach ich denn, wenn "from","to" und "cost" private Datenelemente sind und ich da nur über Funktionen in der Klasse rankomme? Ich könnte natürlich erst die Werte in 3 Hilfsvariablen einlesen und dann nach dem Auslesen der 3 Werte an die Funktionen übergeben, aber das geht doch bestimmt eleganter.
Danke schonmal für die tolle Hilfe hier.
dazu überlädst du am besten den operator >> für deine Klasse.