daten unbekannter länge einlesen
-
Hallo Zusammen,
kann mir jemand helfen? Ich möchte eine unbestimmte anzahl integer werte (0 bis 1000) aus einem textfile einlesen.
bei bestimmter länge hab ich das so gemacht:
#include "Gitter.h" #include <iostream> #include <fstream> #include <math.h> #include <vector> using namespace std; vector <int> bonds; vector <double> energy; Bondzahl::Bondzahl() { ifstream SPIN ("bond_T2.txt", ios::in); if (SPIN.is_open()) { for (int i = 0; i < steps; ++i) { SPIN >> bonds[i] >> energy[i]; //cout << bonds[i] << endl; } cout << bonds.size() << endl; SPIN.close(); } else cout << "Unable to open file"; }Da die Anzahl steps grösser ist, als die Anzahl Integer-Werte im File, werden Nullen drangehängt. Das ist gar nicht gut. Un mit einer while-schleife kann ich das ja auch nicht machen, oder? weil auch nullen im file stehen.
ich könnte in der klasse "Gitter" die integer-werte, die dort in das file eingegeben werden zählen, nur weiss ich nicht, wie ich darauf zugreifen kann.
Kann mir einer einen Tipp geben.
Vielen Dank
Nijntje
-
Zeig mal den Aufbau der Textfile.
-
der ist nur so:
1 2
2 3
0 4
3 0
1 1
usw.
mit jeweils einem Tabulator-Schritt dazwischen.
Aber es geht mir primär um die erste Zeile.
Danke
-
for(double first, second; in >> first >> second; v1.push_back(first), v2.push_back(second));
-
Ich nehme an, dass Spalte 1 bonds, und Spalte 2 energy ist. Dann kannst du es z.B. so machen:
#include <iostream> #include <fstream> #include <vector> using namespace std; int main() { ifstream SPIN ("bond_T2.txt"); // ios::in brauchst du nicht, ist automatisch gesetzt, da ifstream. vector<int> bonds; vector<double> energy; if(SPIN.is_open() ) { for(int i=0, value=0; SPIN>>value; ++i) { if( i%2==0 ) { bonds.push_back(value); } else { energy.push_back(value); } } } else { cerr << "could not open file"; } }edit: Oder natürlich so wie PI.
-
Danke euch beiden

super, genau das habe ich gesucht...
grüsse
nijntje
-
Edit: Gelöst? Dann ist alles jut.
-
Außerdem solltest du dir im Klaren sein, wie die Vorgehensweise beim Lesen ist:
1. Wert aus der Datei lesen.
2. Prüfen, ob das Lesen erfolgreich war.for(...; SPIN>>value; ...)... // Wenn du den Lesevorgang in den Bedingungsteil setzt, wird sogleich Schritt 1 als auch Schritt 2 gemacht.3. Falls erfolgreich, gelesener Wert verarbeiten.
bonds.push_back(value);
-
Das war mir nicht ganz klar.
Habe nur C-Programmierung gelernt und bringe mir c++ selbst bei.Wie ist das dann beim Dateien schreiben?
Ist das so in Ordnung? Es funktioniert zumindest...ofstream NRJ ("meanbond.txt", ios::app|std::ios::out); NRJ << mean <<'\t'<< mean_squared <<'\t'<< sigma <<'\t'<< 1./b <<endl;nochmals danke fürs Helfen
-
Was dein Beispiel anbelangt, ja - so dürftest du eine Zeile anhängen können. Ein paar Kleinigkeiten:
ofstream NRJ ("meanbond.txt", ios::app); //std::out kannst du weglassen1./bDer Standard garantiert, dass wenn der Divisor oder der Divident eine Fließkommazahl ist, alle anderen Typen auch zu dem entsprechendem Typ gecastet werden.
-
Die Vorgehensweise fürs Schreiben ist:
1. Schreiben
ofstream NRJ ("meanbond.txt", ios::app|std::ios::out); NRJ << mean <<'\t'<< mean_squared <<'\t'<< sigma <<'\t'<< 1./b <<endl;2. Prüfen, ob das Schreiben erfolgreich war.
if( !NRJ ) // identisch mit: if( NRJ.fail() ) { // Error: Fehler beim Schreiben. // Fehlerbehandlung, das Schreiben z.B. nochmals versuchen. } else { // Alles OK, weiter gehts. }
-
Gugelmoser schrieb:
if( !NRJ ) // identisch mit: if( NRJ.fail() )
{Nein. Mit
if(!NRJ.good()).
Edit: Nein, deins istauchrichtig.
-
Hacker schrieb:
Gugelmoser schrieb:
if( !NRJ ) // identisch mit: if( NRJ.fail() )
{Nein. Mit
if(!NRJ.good()).
Edit: Nein, deins istauchrichtig.
bool operator ! ( ) const;
Returns true if either one of the error flags (failbit or badbit) is set on the stream. Otherwise it returns false. This behavior is equivalent to the member function fail().bool fail ( ) const;
The function returns true if either the failbit or the badbit is set.
-
Gugelmoser schrieb:
..
Meins ist sogar falsch. Denn
ios::good()gibt zurück ob auch noch das eofbit nicht gesetzt wurde...
-
Hacker schrieb:
Gugelmoser schrieb:
..
Meins ist sogar falsch. Denn
ios::good()gibt zurück ob auch noch das eofbit nicht gesetzt wurde...Jop, dann hast du nämlich ein Problem, wenn du nicht zeichenweise ließt:
int main() { /* Dateiinhalt: 123 */ ifstream file("test.txt"); int value; file >> value; if( !file.good() ) { cerr << "Fehler beim Lesen"; // Ähh ne, eigentlich nicht. } }
-
Ich habe da noch eine Frage:
Wie erhalte ich die Länge dieses Vektors?
Mit v1.size()?Wenn ich die ersten 10 Zahlen nicht brauche, kann ich dann z.B
int N0 = 10; int difference = v1.size() - N0;rechnen?
Irgendwie bekomme ich immer ein SIGABRT und weiss nicht wo der Fehler liegtdanke
-
Ich sollte mich klarer ausdrücken
Ich möchte von dem Vektor erst nach gewisser zeit (etwa nach dem 10 wert) den mittelwert ausrechnen, aber nur von jedem 2*tau-ten mal.
so sieht mein code aus:
vector <int> v1; vector <double> v2; Bondzahl::Bondzahl() { ifstream SPIN ("bond_T0.5.txt"); if (SPIN.is_open()) { for (int i = 0, value = 0; SPIN >> value; ++i) { if (i%2 == 0) { v1.push_back(value); } else { v2.push_back(value); } } SPIN.close(); } else { cerr << "Unable to open file"; } } int DIFF = v1.size() - N0; void Bondzahl::Mittelwert(double b) { int tau = 4; int n = DIFF/(2*tau); double sum = 0; double summe = 0; for (int j = N0; j < v1.size(); j+=2*tau) { sum += v1[j]; summe += v1[j]*v1[j]; } //mean value and variance //----------------------- mean = sum/n; //mean bondnumber mean_squared = summe/n; //mean bondnumber squared sigma = sqrt((1./(double)n)*(mean_squared - mean*mean)); //std ofstream NRJ ("meanbond_2mal2.txt", ios::app|std::ios::out); NRJ << mean <<'\t'<< mean_squared <<'\t'<< sigma <<'\t'<< 1./b <<endl; }
-
Ein weiteres Opfer der eigenen Faulheit. Selber schuld, wenn du globale Variablen benutzt. Lass dir vor Benutzung mal den Wert von DIFF anzeigen und dann versuch mal selbstständig nachzuspüren, warum es diesen Wert hat.
-
SeppJ schrieb:
Ein weiteres Opfer der eigenen Faulheit.
Vielleicht hat ihn/sie aber auch einfach ein Wolfs-rudel angegriffen

Er soll sich ein gutes Buch holen. Das hilft am meisten.