ofstream, komische Zusatzausgabe
-
Servus Leute,
ich habe mir eben kurz eine Funktion gebastelt, die ne linked list in eine file ausgibt. Allerdings kommt am Ende der Ausgabe immernoch eine Adresse hinzu, weiß nicht woher diese Zusatzausgabe kommt.
std::ofstream& ebook::printQueque ( std::ofstream& file ) { if ( head == nullptr ) return file; userCell* current = head; while ( current != nullptr ) { file << current->userId << ", "; current = current->next; } file << "\ntesttest"; return file; }aufgerufen tue ich sie so :
logFile << printQueue(); logFile.close();Die Datei schaut dann so aus :
1,2,3,4,5,
testtest_komischeAdresse_
-
...
-
logFile << printQueue();Du hast da einen funktionsaufruf + operator<<.
Zuerst wird der funktionsaufruf (printQueue()) ausgeführt und danch wird noch der std::ofstream, der vom funktionsaufruf zurückkommt in den logfile geschrieben.
Ich weiß nicht ob es einen operator<< giobt, der einen stream ausgibt, aber bei dir scheints ja zu kompilieren.
Eigentlich müsst das doch so aussehen:printQueue(logFile); logFile.close();(das close kannste auch durch den destruktor bekommen, der ausgeführt wird, sobald die scope des file-objekts verlassen wird.
-
Oh Gott, wie dumm ;P Stimmt natürlich
Vielen Dank !Das mit dem close() open() stimmt auch, logFile ist tatsächlich eine globale Variable, die ich per extern in den verschiedenen Übersetzungseinheiten verwenden.
Kann sie wohl also in main() einmal öffnen und dann am Ende auch wieder schliessen.
-
Muss hier nochmal eine Frage stellen, bzgl. der Operatoren-Überladung.
Folgendes :
Ich will für die verschiedenen Klassen, die alle Unterklassen von Klasse book sind, den operator<< überladen.
Das geht nicht in den Klassen selber, da die Reihenfolge der Argumente sonst vertauscht ist.
Also habe ich in der main.cpp folgendes :std::ostream& operator<< ( std::ostream& lhs, book& rhs ) { rhs.print ( lhs ); return lhs; }und in den Klassen :
virtual void print ( std::ostream& stream) { stream << "Ebook, BookID = " << bookId << ", number of downloads left = " << maxDownload - downloadsSoFar << ", downloaded by users "; }Benutze ich jetzt aber in einer Klassenmethode, zB von ebook, einer abgeleiteten Klasse von book, folgendes :
logFile << *this;compiled es nicht, weil kein entsprechender operator<< gefunden werden kann.
Das sind doch scope-probleme, oder mach ich was grundlegend falsch ?
-
Ofstream schrieb:
Also habe ich in der main.cpp folgendes :
...Hast du den funktionskopf in eine headerdatei gepackt und da wo du die funktion anwenden willst includet?
-
Q schrieb:
Ofstream schrieb:
Also habe ich in der main.cpp folgendes :
...Hast du den funktionskopf in eine headerdatei gepackt und da wo du die funktion anwenden willst includet?
Ah ja, natürlich. Der Funktionskopf um dem compiler zu sagen, er soll überall nach der definition suchen.
IntelliSense unterstreicht es zwar noch rot, compilen und funktionieren tut es trotzdem.
Vielen Dank
-
Ofstream schrieb:
logFile << printQueue(); logFile.close();Die Datei schaut dann so aus :
1,2,3,4,5,
testtest_komischeAdresse_Der Aufruf von printQueue() macht die Ausgabe bis
..testtest. Du hast wahrscheinlich in der Definition der Methode den optionalen Parameterlogfileangegeben, sonst würde der Aufruf ohne Parameter gar nicht übersetzen.
Anschließend wird eineostream&zurückgegeben. Es gibt zwar keinen Ausgabeoperator fürostreamaber eine implizite Konvertierung nach void* - geerbt vonbasic_ios<char>aliasios. Und ein Ausgabeoperator für void* existiert.
Daher die Adresse des ostream-Objekts.Gruß
Werner