ifstream infile / Double X[n] / n unbekannt
-
Hallihallo,
habt am Namen bestimmt schon gesehen wo mein Problem liegt. Aber nochmal ganz ausführlich falls ich was nicht beachtet habe:
Arbeite mir Root; Ich weiß, ist kein c++, nutzt aber die selbe Sprache. Ziel bei mir ist es Messwerte aus xxxx.dat einzulesen die derart gestaltet sind, zB:
x y z
1 234 2
45 111 2
...
Bisher habe ich es immer folgendermaßen eingelesen:
const Int_t n=134,
k=0;
Double_t I[n],A[n];
ifstream infile;
infile.open("macros/Praktikum2/V248/Alle.dat");
while (infile.good()){
infile >> I[k]>> A[k];
if (!infile.good()) break;
k++;}
infile.close();
rechne rechne rechne fertig.
Wollte nun aber gerne zum Vergnügen Dateien einlesen die sehr sehr sehr SEHR viele einträge haben, bzw ist Int_t n=????Somit zu meiner Frage: Wie kann ich die Werte derart (s.o.) einlesen ohne das mir das array bekannt ist mit folgenden Bedingungen: Es bleibt Double X[n]; und n kann nach dem Einleseprozess als const double abgespeichert werden und in weiteren Rechnungen verwendet werden aka Fehlerrechnung etc.
Die Lösung muss nicht elegant sein. Am besten so einfach wie möglich da Root nicht alle c++ Befehle übernimmt, habe aber ehrlich gesagt keine Ahnung auf wecher c++ Version es beruht.
Was ich bisher fand waren variable arrays, habe davon aber iwi nix verstanden und bin mir auch nicht sicher ob die mir da weiterhelfen. Pointer hab ich auch nicht wirklich verstanden zumal, das Prinzip zwar schon, aber nicht wie das mein Problem lösen kann.
Gibt es da vllt eine Möglichkeit wie evntl:
if (!infile.good()) break;
n+=1,k++;
Mit n als Zeilenzahl? Und wie bestimme ich im Double den Array, Problem: Ich kann den Daouble nicht in die infile Schleife packen da dann infile X[n] nicht bekannt bzw nicht einlesen da n nicht bekannt......Grüße
Der Fragenhabende
-
Also jetzt nochmal. Du willst Messwerte aus einer Datei einlesen, wobei es pro Zeile 3 Messwerte sind? Achja, wieso brauchst du 2 Arrays?
-
Fragenhabende schrieb:
Was ich bisher fand waren variable arrays
Stehen dir die Container der STL zur Verfügung? Wenn ja, nimm einen std::vector<double> und du brauchst dich um die Speicherverwaltung nicht mehr zu kümmern.
Variable Arrays sind in C (C99) vorhanden (und auch da sollte man sie, wenn überhaupt, nur mit Bedacht einsetzen) - mit einem vector bist du jedenfalls besser beraten.
-
Oh nene, mein Fehler^^ Sorry für die Unverständlichkeit.
Habe nur als Bsp einfach die infile routine aus einer existierenden Datei kopiert, die Struktur der Datei die ich als Beispiel gegeben habe war rein willkürlich gewählt. Wenn es 3 Messwerte wären hätte ich natürlich in der infileroutine auch 3 Arrays. Aber die Menge der Arrays ist ja unbedeutend, ob 2 oder 200 das ändert ja nix.
In der infileroutine habe ich deshalb k statt n gewählt das es bei komplizierteren einlese und rechenvorgängen bei mir öfter zu Problemen gekommen ist. Daher habe ich die Zahl n vom Double anders definiert als das k vom Double in der infileroutine. Das ist aber auch nicht weiter von Bedeutung, hat nur Rechengründe.
Neues Beispiel:
Datei:
x y
1 2
3 1
2 2
....
Mit infile<< x[k]<<y[k]
etc.Mit Vektoren habe ich im c++ auch schonmal gearbeitet, jedoch habe ich sie anders definiert: Als Beispiel einer bel. andren Rechnung:
vector<double> Ua(n) ,f(n) ,O(n) ,A(n) ,eA(n) ,eUa(n) ,ef(n) ,eO(n);
und bei Kalkulationen:
for (vector<double>::size_type i = 0; i < n; i++).....
Dabei habe ich aber nach wie vor 2 Probleme:
1. vector konnte ich in root bisher noch nicht funktionsfähig einbauen. Es basiert zwar auf root wie aber bereits erwähnt ist mir die Version nicht bekannt und ein root-tutorial derart gibt es nicht, daher ja auch die Forderung das es mit einem Vektor als Double X[n]; funktionieren muss.
2. Auch im vector<double> X(n); muss die Zahl n doch bekannt sein, aber grade die ist mir ja unbekannt bzw soll sie ja grade beim einlesen als einen andere Konstante als const double für weitere Rechnugnen abgelegt werden um sie zB auch in for-Schleifen als Begrenzer einzusetzen wie zB:
for(i=0;i< "c" ;i++){.....
wobei c dann grade die Zahl sein soll die der Menge der Einträge im Double entspricht zB:
Int n=2;
Double x[n]={1,5};
for(i=0;i<n;i++){rechne rechne....
Ich suche daher eine möglichkeit mit der ich a) Werte Einlesen kann nach obiger Struktur ohne die Anzahl der einzelnen Werte pro Double zu kennen; Wobei alle Double die gleiche Anzahl an Werten habe, immer (bei meinen Problemen^^)
und b) Während bzw direkt nach dem Einlesevorgang mir eine Konstante bestimmen kann die gleich der Anzahl der Einträge im Double ist um eben mit den Werten rechnen zu können (siehe for-Schleife).
Zweck soll sein für alle Werte 1 bis n über alle Vektoren als Double Rechenoperationen durchführen zu können, zB:
for(i=0;i<n;i++){
x2[i]=sqrt(pow((x[i]+7.34),5))-1;
}
wobei x2 natürlich vor der Operation als Double definiert wurde zB Double x2[n];
Nur benötige ich dafür ja auch grade die Zahl n, die Menge der Einträge pro Vektor, um eben damit rechnen zu können.Grüße
Der Fragenhabende
-
Fragenhabende schrieb:
Auch im vector<double> X(n); muss die Zahl n doch bekannt sein
Eben nicht. Du kannst einem vector zwar eine Startgröße auf den Weg geben, jedoch können mittels push_back jederzeit Daten angehängt werden.
Die Größe lässt sich jederzeit mit der Memberfunktion size() erfragen. Wenn du also diesen Container einbinden kannst, würde ich dies in jedem Fall nutzen.
Aber auch wenn nicht, die Funktionalität gerade eines vectors nachzuprogrammieren ist keine größe Kunst (zumal die der Quellcode der Implementierungen auch noch offen liegt).
-
Vektor muss aber von der Art: Double x[n] sein, nicht vector<double> x(n). Es reicht schon wenn man nur die Anzahl der Zeilen bestimmen lassen kann und diese als const double abspeichert.
-
Fragenhabende schrieb:
Vektor muss aber von der Art: Double x[n] sein, nicht vector<double> x(n).
Wo steht das? Es gibt 2 Möglichkeiten, das trotzdem mit std::vector zu machen:
- Schreibe die Funktion, die bisher ein Array wollte, so um, dass sie einen vector nimmt
- Zur Not kann man mit std::vector<>::data() auf das Array zugreifen, das eigentlich in dem vector liegt. std::vector ist nämlich nicht viel mehr als ein verwaltetes dynamisches Array

-
hab wohl nicht das richtige Forum erwischt. Aber dennoch danke für eure Mühe.
Grüße
Der Fragenhabende