Erstelle Datei von einer Größe von - Standard Weg
-
Hallo,
std::ofstream out{"existiert-nicht.txt", std::ios::binary}; out.seekp(file_size - 1); out.write("", 1);
Ist das immer korrekt? Wer garantiert mir das? Ich kann dazu keine genauen Angaben auf den Referenzseiten finden.
Es gibt systemspezifische Funktionen um dies zu erreichen, doch gibt es keine fertige Lösung aus dem Standard, deswegen wollte ich mal nen Pro hernehmen, was der denn dazu meint.
-
Hab ich noch nie gebraucht: Hätte es jetzt einfach mal so gemacht:
#include <fstream> #include <string> using namespace std; int main() { string str; str.resize( 1024 ); ofstream file{"test.txt"}; file << str; }
-
Und wenn das File 2GB haben soll?
Aber mein Code scheint auf beiden Systemen zu funktionieren (Windows, Linux).
-
stateofmind schrieb:
Und wenn das File 2GB haben soll?
Was dann? Einfach die Zahl ändern?
Außerdem ist die Größe eh immer systemabhängig.
-
Anders siehts aber nicht so aus als würde man 2GB flüchtigen Speicher anlegen.
-
Das ist undefiniert.
<a href= schrieb:
[filebuf.virtual]">If
sp
has not been obtained by a previous successful call to one of the positioning functions (seekoff
orseekpos
) on the same file the effects are undefined.Man kann nicht einfach irgendwohin seeken.
Die einzige Variante, die AFAICS funktionieren kann:
- Du öffnest die Datei i binary modus, und
- rufst explizit
seekoff
auf.
Das wird nämlich an
std::fseek
delegiert.If the stream is open in binary mode, the new position is exactly offset bytes measured from the beginning of the file if origin is
SEEK_SET
, from the current file position if origin isSEEK_CUR
, and from the end of the file if origin is SEEK_END. Binary streams are not required to supportSEEK_END
, in particular if additional null bytes are output.
-
Falls C++17 verwendet werden darf, gibt es noch die Möglichkeit von
std::filesystem::resize_file
-
Laut cppreference.com wird
pubseekoff()
aufgerufen, wenn man die zweite Überladung nimmt.Und
seekoff()
ruft dann laut deinen Unterlagenfseek()
auf.Und dann hab ich das gefunden:
<a href= schrieb:
cppreference.fseek">POSIX allows seeking beyond the existing end of file. If an output is performed after this seek, any read from the gap will return zero bytes. Where supported by the filesystem, this creates a sparse file.
Ein Sparse-File. Muss ich wohl C++17 hernehmen.
Aber heute Mittach hats auch auf meiner Windows-Box funktioniert, also nicht so wild, wenn undefiniert. Ich denke mal alle Systeme, die ich jeweils in Erwägung ziehen werde, kommen mit Sparse-Files klar.
-
Warum nicht stumpf reinschreiben über ne schleife in paketen? also zB immer 16KB nullen reinballern bis sie voll da ist?