Textdatei schreiben - Probleme mit ausgelagerter Funktion
-
Hallo Forumsgemeinde,
ich heiße Tobias und wollte euch an dieser Stelle um Hilfe bitten. Da es um das o.g. Thema geht, mache ich hier einfach mal weiter. Hoffe das ist ok.
Für´s Sudium muss ich ein Pflichtprogramm schreiben, stehe nun aber vor einem Problem, welches ich nicht gelöst bekomme.
Wir sollen 10 Zahlen einlesen, sortieren (Insertion Sort) und in einer Datei ausgeben. Neben der eingegebenenen Reihenfolge am Anfang der Textdatei und der sortierten Reihenfolge am Ende (funktioniert auch schon bis hierhin) soll mittendrin nun sinngemäß folgendes stehen:
Die Zahl X wurde an der Xten Stelle eingetragen.Habe zuerst versucht einfach mit outfile <<... in der Funktion weiter zu machen, wie zuvor auch - Fehler
Also versucht die zu erstellende Text-Datei in der Funktion ein weiteres Mal zu öffnen und den genannten Text auszugeben, dann wird aber mein zuerst eingegebener Text gelöscht. Wie kann ich dieses Problem umgehen?Schonmal vielen Dank für eure Hilfe
Tobias
Anbei mal der Quellcode
#include <iostream.h> #include <fstream> using namespace std; int main(void) { int Zahlen[10],x,z; void insertionsort(int x[],int anzahl_zahlen); std::ofstream outfile; outfile.open("Protokoll.txt"); /*öffnen der Protokoll-Datei,damit Daten automatisch eingetragen werden können*/ outfile << "Ausgangsdaten : " << std::flush; cout<<"Bitte geben Sie 10 Zahlen ein : "<<endl; for(x=0;x<10;x++) { cout<<"Zahl "<<x+1<<": "<<flush; cin>>Zahlen[x]; outfile << Zahlen[x]<< " "<<std::flush; } outfile << " "<<std::endl; outfile << " "<<std::endl; insertionsort(Zahlen,10); /*Aufruf der Insertionsort-Funktion nachdem 10 Zahlen eingegeben wurden. Übergeben wird das Feld mit 10 Zahlenwerten*/ cout<<endl<<"Hier nun die Zahlen, sortiert von klein nach gross"<<endl; outfile << "Sortierte Daten : " << std::endl; for(x=0;x<10;x++) { cout<<"Zahl "<<x+1<<": "<<Zahlen[x]<<endl; /*Ausgabe der sortierten Zahlen, nachdem sie die Funktion durchlaufen haben*/ outfile << Zahlen[x] << " " << std::flush; } outfile << " "<<std::endl; outfile << " "<<std::endl; outfile.close(); return 0; cin>>z; /*Hilfe, damit das DOS-Fenster nicht gleich wieder schliesst*/ } /*Hier beginnt die ausgelagerte Insertionsort-Funktion*/ void insertionsort(int x[],int anzahl_zahlen) /*In dieser Funktion wird nun sortiert*/ { int Vergleichszahl,i; for(int j=1;j<anzahl_zahlen;j++) { Vergleichszahl=x[j]; /*j=1, weil die 2. eingegebene Zahl also X[1] mit der ersten X[0]verglichen wird*/ i=j-1; while(x[i]>Vergleichszahl && i>=0) /*ab hier vergleich immer weiter nach unten, d.h. 6. Eingabe wird mit 5.,4.,3.,2. etc verglichen. Ist x[i]>Vergleichszahl nicht mehr erfüllt, geht die for Schleife mit folgendem Befehl weiter x[i+1]=Vergleichszahl; */ { x[i+1]=x[i]; i--; } x[i+1]=Vergleichszahl; } }
-
Zunächst fällt mir auf, dass da was net stimmt

Zeile 1: #include <iostream>
Zeile 8: Funktionsdeklarationen gehören nicht in den Main-Rumpf, sondern außerhalb davor.
Zeile 39: nach dem Return nicht sinngemäß, wenn dann davor.Zu den Fragen.
Eine Datei zu öffnen, während sie schon offen ist, dürfte schon net gehen, vermute ich mal. Ist auch nicht nötig. Du hast ja schon dein "Filehandle", dass du ja an andere Funktionen weitergeben kannst.
Falls du doch unbedingt die Datei noch einmal öffnen willst, so musst du sie vorher erst wieder schließen. Beim Öffnen kann man als zweiten Parameter der Funktion open diverse Eigenschaften angeben. So zum Beispiel ios::app zum Anhaengen von Daten.Hier mal nen Codeschnipsel zum Uebergeben des ofstream-Objektes
#include <fstream> using namespace std; void foo(ofstream &out) { out << "in der Funktion foo" << endl; } int main() { ofstream out; out.open("test.txt", ios::out); out << "vor der Funktion foo" << endl; foo(out); out << "nach der Funktion foo" << endl; out.close(); return 0; }// Edit: Zeile 1
-
Hallo Basicman01,
habe das Problem, dank deiner Hilfe, (vorerst) gelöst bekommen
Zeile 8 und 45) void insertionsort(int x[],int anzahl_zahlen,ofstream &Textdatei);
Zeile 21) insertionsort(Zahlen,10,Textdatei);Musste den offtream noch in die Funktion einbinden.
Vielen Dak und Grüße
Tobias