fstream sofort nutzen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

fstream sofort nutzen

Beitrag von Xin » Sa Sep 15, 2012 12:27 pm

Ich habe heute auch mal eine Frage....

Folgendes Programm:

Code: Alles auswählen

#include <iostream>
#include <fstream>

using namespace std;

void writeLog(string logInfo)
{
  fstream f("autoviertel.log", fstream::app | fstream::out);
  f<< logInfo;
}

int main()
{
  writeLog( std::string( "bla" ));
}
Das funktioniert.

Nun ist die Variable f eigentlich vollkommen überflüssig.

Code: Alles auswählen

void writeLog(string logInfo)
{
  fstream("autoviertel.log", fstream::app | fstream::out) << logInfo;
}
Das hier lässt sich nicht kompilieren?!

Er findet keinen passenden operator <<.
Warum nicht?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von Xin » Sa Sep 15, 2012 12:30 pm

... und schon habe ich eine Vermutung...

Qnf grzcbeäer Bowrxg vfg pbafg.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: fstream sofort nutzen

Beitrag von nufan » Do Okt 11, 2012 11:25 pm

Xin hat geschrieben:Qnf grzcbeäer Bowrxg vfg pbafg.
Richtig, ostream hat keinen operator<< für std::string ^^ Folgendes:

Code: Alles auswählen

fstream("autoviertel.log", fstream::app | fstream::out) << logInfo.c_str();
funktioniert ohne Probleme.
Siehe: http://www.cplusplus.com/reference/iost ... tor%3C%3C/

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von Xin » Fr Okt 12, 2012 12:32 am

dani93 hat geschrieben:
Xin hat geschrieben:Qnf grzcbeäer Bowrxg vfg pbafg.
Richtig, ostream hat keinen operator<< für std::string ^^ Folgendes:

Code: Alles auswählen

fstream("autoviertel.log", fstream::app | fstream::out) << logInfo.c_str();
funktioniert ohne Probleme.
Siehe: http://www.cplusplus.com/reference/iost ... tor%3C%3C/
"Qnf grzcbeäer Bowrxg vfg pbafg." heißt "Das temporäre Objekt ist const."

Wieso funktioniert dann:

Code: Alles auswählen

void writeLog(string logInfo)
{
  fstream f("autoviertel.log", fstream::app | fstream::out);
  f<< logInfo;
}
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: fstream sofort nutzen

Beitrag von nufan » Fr Okt 12, 2012 12:49 am

Hm... ok, war doch ne blöde Idee. Ich schätze mal der Compiler findet einfach die globalen Operatoren nicht, weil diese eine Referenz auf den Stream benötigen, was mit dem konstanten Objekt nicht möglich ist. Mit this scheint das zu gehen, deswegen funktionieren einige Operatoren die direkt in der Klasse implementiert sind trotzdem.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von fat-lobyte » Fr Okt 12, 2012 9:22 am

Dani hats rausgefunden!

Der operator << erwartet eine nicht-const Referenz. Temporäre Objekte sind aber stets nur const ref, und eine nicht-const-ref kann nicht an eine const-ref binden: http://stackoverflow.com/questions/1565 ... ary-object

Das macht insofern Sinn, dass es nichts bringt temporäre Objekte zu verändern, weil sie ja sowieso gleich wieder verschwinden, zumindest war das eine der Argumentationen die ich irgendwo gesehen habe. Auf jeden Fall gibts nen guten Grund dazu.

Probier das mal auf Visual Studio aus, die haben ziemliche Bugs was das Binden an Referenzen betrifft. Vielleicht funktioniert das dort!

Außerdem: versuch einfach mal das Temporäre Objekt in std::move() zu packen. Ich glaube das sollte gehn.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von fat-lobyte » Fr Okt 12, 2012 9:30 am

Aha! Man muss das gar nicht in std::move packen, man muss nur C++11 einschalten damit genau das funktioniert was du willst.

Was dann passiert: Das temporäre Objekt ist dann keine const-lvalue-ref (const &) mehr, sondern eine rvalue-ref (&&). Diese bindet nach den Faltungsregeln[1] als lvalue ref als parameter des Operators.

Ein weiterer Fall, wie C++11 die Sprache "gratis" verbessert hat :-)

[1] http://thbecker.net/articles/rvalue_ref ... on_08.html
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von Xin » Fr Okt 12, 2012 11:19 am

dani93 hat geschrieben:Hm... ok, war doch ne blöde Idee. Ich schätze mal der Compiler findet einfach die globalen Operatoren nicht, weil diese eine Referenz auf den Stream benötigen, was mit dem konstanten Objekt nicht möglich ist. Mit this scheint das zu gehen, deswegen funktionieren einige Operatoren die direkt in der Klasse implementiert sind trotzdem.
this ist hier nicht mehr const, da das Objekt lokal ist und damit nicht ganz so temporär, wie das temporäre Objekt.
fat-lobyte hat geschrieben:Dani hats rausgefunden!
Hmm? Ich dachte, ich hätte es rausgefunden!?
fat-lobyte hat geschrieben:Der operator << erwartet eine nicht-const Referenz.
linksseitig... was ja auch halbwegs logisch ist, schließlich wird das linksseitige Objekt verändert - auch wenn es nicht darum geht, das Objekt zu verändern, sondern das Objekt die Datei verändern zu lassen: Qnf grzcbeäer Bowrxg vfg pbafg.
fat-lobyte hat geschrieben:Außerdem: versuch einfach mal das Temporäre Objekt in std::move() zu packen. Ich glaube das sollte gehn.
Ich soll fstream in std::move packen!? Weshalb!?
fat-lobyte hat geschrieben:Was dann passiert: Das temporäre Objekt ist dann keine const-lvalue-ref (const &) mehr, sondern eine rvalue-ref (&&). Diese bindet nach den Faltungsregeln[1] als lvalue ref als parameter des Operators.
Die muss ich mir auch endlich mal anständig zu Gemüte führen, ich hasse es, wenn Du damit als Biochemiker(?) oder was Du studierst rumwedelst und ich als Informatiker das Gefühl habe, auf Glatteis zu stehen... das bin ich so nicht gewohnt. ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von fat-lobyte » Fr Okt 12, 2012 12:02 pm

Xin hat geschrieben:Hmm? Ich dachte, ich hätte es rausgefunden!?
Richtig, so genau hab ich jetzt auch nicht nachgelesen.
Xin hat geschrieben:auch wenn es nicht darum geht, das Objekt zu verändern, sondern das Objekt die Datei verändern zu lassen: Qnf grzcbeäer Bowrxg vfg pbafg.
Die verschlüsselung hab ich immer noch nicht gecheckt, aber es macht schon Sinn: das Objekt verändert nicht nur die Datei, sondern hat auch einen internen Zustand (z.B. File pointer, ...) der beim Schreiben zwangsläufig verändert wird. Das objekt kann und soll nicht const-beschreibbar sein, das würde sonst die const-correctness untergraben.

Xin hat geschrieben:Ich soll fstream in std::move packen!? Weshalb!?
Die Grundidee war, dass du aus einem temporären Objekt statt einem lvalue-const-ref ein rvalue-ref machst. Das geschieht in C++11 anscheinend sowieso, also ist std::move unnötig, siehe zweites posting.
Xin hat geschrieben:Die muss ich mir auch endlich mal anständig zu Gemüte führen, ich hasse es, wenn Du damit als Biochemiker(?) oder was Du studierst rumwedelst und ich als Informatiker das Gefühl habe, auf Glatteis zu stehen... das bin ich so nicht gewohnt. ;-)
Molekuarbioge (Bach.)/Biotechnologie (Mast.), wenn du's genau wissen willst ;-)
Dadurch, dass ich etwas komplett anderes Studiere, betrachte ich Programmieren als Hobby, als Entspannung. Mir solche Dinge zu gemüte zu führen ist für mich das Äquivalent eines Kreuzworträtsels. Das Kreuzworträtsel war 2009 schon ziemlich spannend, und seit dem Beschäftige ich mich mit C+11. Wenn ich mich recht entsinne war deine einstellung damals dazu "es gibt noch keine Compiler, es ist noch nichtmal fixiert und ich beschäftige mich später damit". Ich habe damals schon angefangen und seitdem ein Bisschen was gelernt. Ist es da verwunderlich, dass ich ausnahmsweise einen kleinen Vorsprung habe?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fstream sofort nutzen

Beitrag von Xin » Fr Okt 12, 2012 12:38 pm

fat-lobyte hat geschrieben:
Xin hat geschrieben:auch wenn es nicht darum geht, das Objekt zu verändern, sondern das Objekt die Datei verändern zu lassen: Qnf grzcbeäer Bowrxg vfg pbafg.
Die verschlüsselung hab ich immer noch nicht gecheckt, aber es macht schon Sinn: das Objekt verändert nicht nur die Datei, sondern hat auch einen internen Zustand (z.B. File pointer, ...) der beim Schreiben zwangsläufig verändert wird. Das objekt kann und soll nicht const-beschreibbar sein, das würde sonst die const-correctness untergraben.
Schon klar... also ab meinem zweiten Posting... ;-)

Die Verschlüsslung ist die übliche Verschlüssung, wenn es eigentlich keine Verschlüsslung ist, sondern eher ein "Spoileralarm": rot13. Früher zu Mailboxzeiten, gab's Leute, die rot13 ohne Decoder gelesen haben, irgendwann hatte man es einfach im Blick.
fat-lobyte hat geschrieben:
Xin hat geschrieben:Die muss ich mir auch endlich mal anständig zu Gemüte führen, ich hasse es, wenn Du damit als Biochemiker(?) oder was Du studierst rumwedelst und ich als Informatiker das Gefühl habe, auf Glatteis zu stehen... das bin ich so nicht gewohnt. ;-)
Molekuarbioge (Bach.)/Biotechnologie (Mast.), wenn du's genau wissen willst ;-)
Molekuarbiogie wäre nix für mich. Zuviele komplizierte Fremdworte, ich könnte nichtmals meine Berufsbezeichnung richtig schreiben. :lol:
fat-lobyte hat geschrieben:Dadurch, dass ich etwas komplett anderes Studiere, betrachte ich Programmieren als Hobby, als Entspannung. Mir solche Dinge zu gemüte zu führen ist für mich das Äquivalent eines Kreuzworträtsels. Das Kreuzworträtsel war 2009 schon ziemlich spannend, und seit dem Beschäftige ich mich mit C+11. Wenn ich mich recht entsinne war deine einstellung damals dazu "es gibt noch keine Compiler, es ist noch nichtmal fixiert und ich beschäftige mich später damit". Ich habe damals schon angefangen und seitdem ein Bisschen was gelernt. Ist es da verwunderlich, dass ich ausnahmsweise einen kleinen Vorsprung habe?
Nicht verwunderlich - aber bedauerlich ;-D

Du darfst als Student mit all den schönen Spielzeugen spielen, während ich irgendwo zwischen Fortran -> C -> C++ hänge und bis vor kurzem noch Visual Studio 6 kompatibel programmieren durfte...
Und bei privaten Projekten scheitere ich schon an "nullptr", weil Visual C++ "nullptr" nunmal nicht mag. Dafür mag Visual C++ override, aber GCC nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten