In Datei auslesen [beantwortet]
-
Hallo!
Habe mich schon durch manche Foren gewühlt, aber nach Anwendung dortiger Hilfen läuft mein Prog. trotzdem nich. :o(
Vielleicht hat ja jeman dLust sich mal wieder meiner anzunehmen:
Ich möchte ein prog schreiben, dass in einer rekursiven Funktion Daten in eine Datei einliest. Ich wollte die Datei vorher öffnen und dann einen Filepointer übergeben, aber natürlich scheitert es wieder an meiner Unkenntnis. Vielleicht kann mir jemand helfen:#include <vector> #include <fstream> #include <string> using namespace std; void verteilung(int anfang, vector<int> brett, FILE * f); void vectorausgabe(vector<int> vec); double wertausgabe(vector<int> brett, int auswahl); int main() { int i,j; string ausgabename = "test.txt"; vector<int> brett(10); brett[0] = 8; for( i = 1; i < brett.size(); i++) brett[i] = 0; ofstream f; f.open(ausgabename.c_str(), ios::binary|ios::out); verteilung(0, brett, f); }In der Funktion verteilung() wollte ich dann mittels "f << ... " die Daten in die Datei auslesen. Geht das denn so überhaupt?
Auf jeden Fall wird bei mir nix compiliert.Vielen Dank im Voraus!
lG
Tonikum
-
Sicher, das geht. Allerdings ist ofstream nicht das gleiche wie FILE*. Du musst also in deiner
verteilung()-Funktion als letztes Argument einen kompatiblen Typ angeben, beispielsweiseofstream& f.
-
Lieber Tonikum,
könntest du den Quellcode für deine drei Funktionen ebenfalls posten? Als Tipp voraus: beschäftige Dich mal mit i/o-stream-Iteratoren. Diese netten Dinger erleichtern dir das C++ Leben sehr. Du kannst Sie nutzen, indem du <iterator> inkludierst.Hier ein kleines Anwendungsbeispiel. Im gleichen Ordner wie die Datei existiert eine Datei, die drei Zahlen enthält. Man kann sie mithilfe der Iteratoren auslesen:
#include <iostream> #include <fstream> #include <iterator> void ausgabe(std::istream_iterator<int>& begin,std::istream_iterator<int>& end) { while (begin!=end) std::cout << *begin++ << std::endl; } int main(int argc,char *argv[]) { std::ifstream infile("test.txt"); std::istream_iterator<int> input(infile); std::istream_iterator<int> eof; ausgabe(input,eof); system("Pause"); return 0; }
-
Vielen Dank für Eure Hilfe!
Leider klappt das mit "ofstream & f" auch nicht bei mir. Ich stell mic halt mal wieder an.Hier dder komplette Code:
#include <iostream> #include <vector> #include <fstream> #include <string> using namespace std; void verteilung(int anfang, vector<int> brett, ofstream & f); void vectorausgabe(vector<int> vec); double wertausgabe(vector<int> brett, int auswahl); // auswahl: 0 = Fitness, 1 = Moral, 2 = Frische double param[10][3] = {{0.0, 1.0, 0.0}, {0.2, 0.0, -1.0}, {0.2, -1.0, 0.0}, {0.3, -1.0, -1.0}, {0.1, 0.0, 0.0}, {0.0, -0.5, 1.5}, {-0.1, 0.0, 1.5}, {-0.2, 0.0, 3.0},{0.0, -1.0, 2.0}, {-0.1, 0.0, 1.0}}; int main() { int i,j; string ausgabename = "test.txt"; vector<int> brett(10); brett[0] = 8; for( i = 1; i < brett.size(); i++) brett[i] = 0; ofstream f; f.open(ausgabename.c_str(), ios::binary|ios::out); verteilung(0, brett, f); /* Reihenfolge: Fitness, Moral, Frische */ } void verteilung(int anfang, vector<int> vec, ofstream & f) { vector<int> brett = vec; f << vectorausgabe(brett); f << "\t" << wertausgabe(brett, 0) << "\t" << wertausgabe(brett, 1) << "\t" << wertausgabe(brett, 2); while(brett[anfang] != 0 && anfang != brett.size() - 1) { brett[anfang]--; brett[anfang+1]++; verteilung(anfang + 1, brett, f); } } void vectorausgabe(vector<int> vec) { f << endl; for(int i = 0; i < vec.size(); i++) f << vec[i]; } double wertausgabe(vector<int> brett, int auswahl) { double sum = 0; for(int i = 0; i < 10; i++) sum += brett[i]*param[i][auswahl]; return sum; }Das mit den Iteratoren hab ich nich verstanden - muss ich wohl ein wenig in meinem Buch blättern.
Danke sehr!
Tonikum
(der sogar zu doof is, eine Datei auszugeben...)
-
Hab nochmal ein paar Fehler gefunden.
Nun gibt mir das Prog aber keinen Zeilenumbruch an meine Datei weiter, sodass die Daten ganz kunterbunt im File verteilt sind:#include <iostream> #include <vector> #include <fstream> #include <string> using namespace std; void verteilung(int anfang, vector<int> brett, ofstream * f); void vectorausgabe(vector<int> vec, ofstream * f); double wertausgabe(vector<int> brett, int auswahl); // auswahl: 0 = Fitness, 1 = Moral, 2 = Frische double param[10][3] = {{0.0, 1.0, 0.0}, {0.2, 0.0, -1.0}, {0.2, -1.0, 0.0}, {0.3, -1.0, -1.0}, {0.1, 0.0, 0.0}, {0.0, -0.5, 1.5}, {-0.1, 0.0, 1.5}, {-0.2, 0.0, 3.0},{0.0, -1.0, 2.0}, {-0.1, 0.0, 1.0}}; int main() { int i,j; string ausgabename = "test.txt"; vector<int> brett(10); brett[0] = 8; for( i = 1; i < brett.size(); i++) brett[i] = 0; ofstream f; f.open(ausgabename.c_str(), ios::binary|ios::out); verteilung(0, brett, &f); /* Reihenfolge: Fitness, Moral, Frische */ } void verteilung(int anfang, vector<int> vec, ofstream * f) { vector<int> brett = vec; vectorausgabe(brett, f); *f << "\t" << wertausgabe(brett, 0) << "\t" << wertausgabe(brett, 1) << "\t" << wertausgabe(brett, 2); *f << endl; while(brett[anfang] != 0 && anfang != brett.size() - 1) { brett[anfang]--; brett[anfang+1]++; verteilung(anfang + 1, brett, f); } } void vectorausgabe(vector<int> vec, ofstream * f) { *f << '\n'; for(int i = 0; i < vec.size(); i++) *f << vec[i]; } double wertausgabe(vector<int> brett, int auswahl) { double sum = 0; for(int i = 0; i < 10; i++) sum += brett[i]*param[i][auswahl]; return sum; }Und zwar bringt die Zeile 39 bei mi rkeine VEränderung.
Hab schon '\n' probiert -geht leider auch nicht.
Was mach ich denn hier schon wieder falsch?
-
Also ich würde den ofstream mit dem Adress-Operator & mit CallByReference übergeben:
/* ... */ using namespace std; void verteilung(int anfang, vector<int> brett, ofstream& f); void vectorausgabe(vector<int> vec, ofstream& f); /* ... */Du solltest dich mit Iteratoren auseinandersetzen. Sie sind ein fundamentales Werkzeug bei der Elementverwaltung von Containern und Streams.
Mir ist auch schleierhaft, was du genau bezwecken willst.
-
Das mit der Referenz werde ich versuchen, danke.
Auch das mit den Iteratoren werde ich zu beherzigen versuchen - werde aber vermutlich ewig ein Noob bleiben, so wie es aussieht.Was das Programm bezweckt?
Ich kann in einem anderen Sachverhalt aus 10 Parametern acht beliebig (auch mehrfach) wählen, die jeweils drei Atrribute haben und sich aufsummieren. Ich wollte so eine Auflistung der ~24.000 möglichen Ergebnisse haben, um sie nach gewissen Kriterien zu sortieren.Also auf jeden Fall danke für Eure Hilfe.
Dieses Forum ist immer ein toller Anlaufpunkt, wenn ich nicht weiterkomme.