Warum ofstream("log.txt", ios::app|ios::trunc); immer fehl?
Der folgende code wurde kompiliert mit VC++ Nov 2012 CTP-Version auf Windows 7 x64.
#include <fstream>
using namespace std;
int main()
{
ofstream fout("log.txt", ios::app|ios::trunc);
if (!fout)
{
cout << "An error occurred!" << endl; //Always go here! Why?
}
}
Die cppreference.com website nicht sagen, dass ios::app
kann nicht kombiniert werden mit ios::trunc
.
Was sind die genaue Semantik von ios::app
und ios::trunc
?
- en.cppreference.com/w/cpp/io/ios_base/openmode
- Die Dokumentation sagt nicht, dass
ios::app
kann nicht kombiniert werden mitios::trunc
. - Was versuchen Sie zu tun? std::ios::trunc grundsätzlich verwirft alles, während std::ios::app hängt.
- nur für die Anmeldung. Löschen Sie alte Inhalte und fügt neue Texte.
- Es nicht sagen, es kann nicht kombiniert werden, aber es sagt, dass es die Umsetzung definiert.
- Okay, ich verstehe.
- Lang, auch wenn es durch die Implementierung festgelegt, ich denke auch, es ist falsch umgesetzt. Da
ios::app|ios::trunc
ist sinnvoll, in bestimmten Fällen. - VC++ Nov 2012 CTP-Version auf Windows 7 x64.
- Ich bin damit einverstanden, ich vorstellen, dass viele es nutzen kann, aber ich muss sagen, ich sehe die Logik dahinter, so dass es nicht. Es erzwingt die Implementierung, Entscheidungen zu treffen in einer unklaren situation, IMO, natürlich.
ios::app|ios::trunc
sind offen-Modi, die bestimmen, in welchem Zustand sich der stream wird geöffnet, und Sie scheinen etwas widersprüchlich. - Was die "haltlose" über ein wörtliches Zitat aus der Norm?
- Ich bin neugierig, was du damit meinst "die Dokumentation". C++ hat keine zentrale Dokumentation.
- Die "Dokumentation" ich sagte nur, ist Sie unter: en.cppreference.com/w/cpp/io/ios_base/openmode
- Sie sagen nicht, dass. Ich editieren Sie diesen link in Ihre Frage. Bitte nennen Sie Ihre Quellen in Zukunft.
- etwa ein wörtliches Zitat aus der Norm? "-- Das ist nicht das, was ich genannt; ich bezog mich auf die einzige Antwort, die gepostet wurden, als ich meinen Kommentar.
- C++ hat eine offizielle Dokumentation: ISO-14882. Es gibt keinen Punkt bei der Verlinkung zu anderen Seiten, wenn Fragen rein über C++; die Sprache ist definiert durch den standard. (Natürlich, viele Fragen betreffen Einzelheiten von einem oder mehreren Compilern, und nicht nur rein auf die Sprache.)
- Andere als auf den standard als "Dokumentation", ich Stimme natürlich 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
filebuf
Konstruktor, zu dem diese flags übergeben werden† hat Verhaltensweisen, basierend auf den flags definiert, die in Tabelle 132 in C++11:Wie Sie sehen können, Ihre Flagge Kombination ist nicht finden in dieser Tabelle.
Diejenigen sind, die Semantik.
†
[C++11: 27.9.1.7/2]
&[C++11: 27.9.1.11/2]
zeigen uns, dass der Modus übergeben wird aus dem stream-Objekt in den Puffer-Objekt.Wie Sie sehen können, ist es nicht sinnvoll, beide zusammen.