C++ Daten aus externer TXT einlesen und als Variable deklarieren

H

hobbicon

Gast
Hallo,

ich möchte eine bestimmt Anzahl an Zahlen von einer externen TXT einlesen und diese dann als Variablen deklarieren lassen. Habe dazu folgenden Code geschrieben.

Wird das so hinhauen bzw. kann man das noch einfacher schreiben? (Es muss als Klasse geschrieben werden...)


Code:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>

using namespace std;

// Klasse zum Einlesen der Rohrdaten
class Rohre {

private:     
char gesamtdaten[256]; // char-Array, um gesamte Textdatei einzulesen
string V_punkt_string, verlust_Verb_string, LRohr_string;

public:
double V_punkt, verlust_Verb, LRohr;
void einlesen(string dateiname, int zeile);

};

// Einlesefunktion (Klasse Rohre)
void Rohre::einlesen(string dateiname, int zeile) { 
 
ifstream einlesen; // stream erstellen      
einlesen.open(dateiname.c_str(), ios::in); // Datei öffnen 

// Fehlermeldung      
if (!einlesen) {
   cerr << "Datei konnte nicht geoeffnet werden." << endl;
   system("pause");
   exit(0);
}

int i=0;

// Datei auslesen      
while (!einlesen.eof()) {
einlesen.get(gesamtdaten[i]);
i++;      
}

einlesen.close(); // Datei schließen

// gewünschte Werte aus Gesamtdaten auslesen
int j = 11*zeile-11; // Festlegung der Startposition (11 Zeichen pro Zeile)
i = j;

// V_punkt_string einlesen
while (i<j+2) {
V_punkt_string += gesamtdaten[i];
i++;
}
i++;

// verlust_Verb_string einlesen
while (i<j+7) {
verlust_Verb_string += gesamtdaten[i];
i++;     
      }
i++;

// LRohr_string einlesen
while (i<j+10) {
LRohr_string += gesamtdaten[i];
i++;     
      }

// string-Variablen in double-Variablen umwandeln
std::istringstream stm1;
stm1.str(V_punkt_string);
stm1 >> V_punkt;

std::istringstream stm2;
stm2.str(verlust_Verb_string);
stm2 >> verlust_Verb;

std::istringstream stm3;
stm3.str(LRohr_string);
stm3 >> LRohr;

}


int main() {

// Zeile 1 bis 6 einlesen und anschließend die 3 eingelesenen Werte ausgeben    
for (int i=1;i<=6;i++) {
Rohre Rohr_i;
Rohr_i.einlesen("Daten.txt", i);

cout << Rohr_i.V_punkt << endl;
cout << Rohr_i.verlust_Verb << endl;
cout << Rohr_i.LRohr << endl << endl;
}

system("pause");

return 0;    
}
 
Zuletzt bearbeitet:
ifstream einlesen; // stream erstellen
einlesen.open(dateiname.c_str(), ios::in); // Datei öffnen


Das geht bei C++ so? Ich dachte auch da muss man Objekte nicht nur deklarieren sondern auch initialisieren? (var = new Klasse() bla)
 
ifsream erstellt man auf dem stack, daher muss man nicht var = new Klasse() machen. Wenn die funktion verlassen wird, wird der dekonstruktor aufgerufen und der stack speicher frei gegeben. Benutzt man wenn man nur kurzzeitig was machen will. Z.B. Dateien oeffnen, schreiben und wieder schliessen.
 
e-Laurin schrieb:
ifstream einlesen; // stream erstellen
einlesen.open(dateiname.c_str(), ios::in); // Datei öffnen


Das geht bei C++ so? Ich dachte auch da muss man Objekte nicht nur deklarieren sondern auch initialisieren? (var = new Klasse() bla)

Die Zeile ifstream einlesen; ist Definition und Initialisierung in einem, da die Klasse ifstream einen parameterlosen Default-konstruktor hat. Außerdem, mit new müßtest du hier nur dann arbeiten, wenn du die Instanz nicht auf dem Stack (wird automatisch aufgeräumt) sondern auf dem free store (um's Aufräumen mußt du dich selbst kümmern) anlegen möchtest.
 
Zurück
Oben