ftruncate auf die Datei mit fopen geöffnet
Plattform ist Ubuntu Linux auf ARM.
Ich will schreiben, die einen string in eine Datei, aber ich möchte jedes mal zum abschneiden der Datei und schreiben Sie dann die Zeichenfolge, d.h. keine Anhängen.
Habe ich diesen code:
f=fopen("/home/user1/refresh.txt","w");
fputs( "{"some string",f);
fflush(f);
ftruncate(fileno(f),(off_t)0);
flcose(f);
Wenn ich starten Sie es und überprüfen Sie dann die Datei, wird es mit einer Länge von null und, wenn Sie geöffnet wird, gibt es nichts in ihm.
Wenn ich entfernen Sie die fflush
rufen, es wird NICHT 0 sein (11), und wenn ich es öffne wird es "some string" drin.
Ist das das normale Verhalten?
Ich habe kein problem beim Aufruf fflush
, aber ich möchte das in einer Schleife und Aufruf fflush
erhöhen kann die Ausführungszeit erheblich.
- Wenn Sie nicht der Puffer geleert ist, kann es passieren, dass es nur geleert auf
fclose
, nach dem abschneiden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte man wirklich nicht mischen, Datei-handle-und Datei-Deskriptor Anrufe so.
Was fast sicher passiert, ohne fflush ist, dass die
some string
wartet in Datei-handle, Puffer für die Lieferung an den Datei-Deskriptor. Dann kürzen Sie den Datei-Deskriptor und fclose die Datei-handle, das Spülen der string, damit es in der Datei.Mit das fflush,
some string
wird an den Datei-Deskriptor und dann Sie es abschneiden. Ohne weitere Spülung, bleibt die Datei abgeschnitten."w"
- Modus. Sie sollten den Satz Ihrer Frage, wie ein Unternehmen muss eher als eine technische option. So, die Zahl der möglichen Lösungen stark erweitert. In anderen Worten, einen Schritt zurück und sagen Sie uns, was, die Sie erreichen wollen, die eher alsWenn Sie wollen, wörtlich "abschneiden der Datei und dann write", dann ist es ausreichend:
Öffnen der Datei im Modus
w
wird es abschneiden (im Gegensatz zum Modusa
die für das anfügen am Ende).Fordern
fclose
wird, Spülen Sie die Ausgabe-Puffer, so dass keine Daten verloren gehen.POSIX erfordert, dass Sie bestimmte Aktionen (die dafür sorgen, dass keine hässlichen Nebenwirkungen der Pufferung machen Ihrem Programm drunter und drüber gehen) beim Umschalten zwischen der Verwendung einer stream-DATEI und eine Datei-Deskriptor für den Zugriff auf die gleiche Datei öffnen. Dies ist beschrieben in XSH 2.5.1 Wechselwirkung von Datei-Deskriptoren und Standard-I/O-Streams.
In deinem Fall glaube ich, dass es ausreichen sollte einfach anrufen
fflush
vorftruncate
, wie du tust. Unterlassen Sie diesen Schritt, und zwar nach den Regeln der 2.5.1, führt zu undefiniertem Verhalten.