fwrite überschreibt nicht
-
Ich habe das mal getestet. Bei mir werden korrekt die letzten 1024b (4 * 256) überschrieben. Filemon.exe:
19:30:07 Project1.exe:2076 QUERY INFORMATION C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Attributes: A 19:30:07 Project1.exe:2076 OPEN C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Options: Open Access: 0012019F 19:30:07 Project1.exe:2076 QUERY INFORMATION C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Length: 144128 19:30:07 Project1.exe:2076 READ C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Offset: 143104 Length: 1024 19:30:07 Project1.exe:2076 QUERY INFORMATION C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Length: 144128 19:30:07 Project1.exe:2076 WRITE C:\Programme\CBuilder6\Projects\test\1\test.spr SUCCESS Offset: 143104 Length: 1024
Machst Du da noch andere Operationen? Vllt Datei mal schließen.
-
Ich weiß jetzt wo der Fehler lag. Bei Dateioperationen die ich davor ausführe habe ich mich ein bischen mit den Bits verrechnet. Danke für die Hilfe ^^
-
Hallo,
es ist zwar schon das Meiste gesagt, ich finde es jedoch trotzdem merkwürdig eine Position so: "gehe zum Ende und dann 1024 Stellen zurück" anzugeben statt so: "gehe zur StartPosition". Am Anfangspunkt einer Datei befindet sich der Positionszeiger nach dem Öffnen der Datei mit fopen eh' immer, von daher könntest du dir das erste fseek sparen... Und das zweite fseek würde ich so angeben:
fseek(myfile, 0, SEEK_SET);
einfach weil das besser nachvollziehbar ist, evtl. auch für dich später, nicht nur für Andere die deinen Code lesen.
MfG
-
Es ist absolut korrekt, vom Fileende her zu operieren. Meines Wissens der einzige standardisierte Weg, plttformübergreifend die Dateilänge zu ermitteln(mal von der Sparse files-Problematik abgesehen)
-
Danke für die Erklärung witte. Was heißt jetzt plattformübergreifend? Wenn ich
fseek(AnyFile, 0, SEEK_SET);
benutze, was kann da gegenüberfseek(AnyFile, -1024, SEEK_END);
schieflaufen? Und vor Allem: auf welchen Plattformen?
-
Mein Ausgangspunkt war: Stell' Dir vor, Du musst die Länge von Dateien ermitteln. Code soll z.B. auf Linux und Win lauffähig sein und willst es deshalb so standardkonform wie möglich machen. Wie ermittelt man die Dateilänge mit den Standardfunktionen? Datei zum lesen öffnen, Deskriptor ans Ende der Datei positionieren und Offset zum Fileanfang ermitteln. Ich kenne keinen anderen Weg. Sollte Filesystem-Handling nicht im nächsten C++-Standard mit aufgenommen werden?
-
Hallo
Ja im nächsten C++ Standard gibt es dann das was heute noch als boost::filesystem bekannt ist.
Bis dahin gibt es keine platformunabhängige Möglichkeit, nur portable (selbgemacht oder externer Bibliothek)
bis bald
akari
-
Bisher sieht es aber nicht so aus, als ob filesystem da noch reinkommt (TR2).
Aber man kann ja auch boost verwenden.
-
witte schrieb:
Mein Ausgangspunkt war: Stell' Dir vor, Du musst die Länge von Dateien ermitteln. Code soll z.B. auf Linux und Win lauffähig sein und willst es deshalb so standardkonform wie möglich machen. Wie ermittelt man die Dateilänge mit den Standardfunktionen? Datei zum lesen öffnen, Deskriptor ans Ende der Datei positionieren und Offset zum Fileanfang ermitteln. Ich kenne keinen anderen Weg. Sollte Filesystem-Handling nicht im nächsten C++-Standard mit aufgenommen werden?
Ich weiß zwar nicht, was das mit dem Eröffnungspost zu tun hat... Wo steht denn etwas von Dateilänge ermitteln, oder Windows UND Linux? Da davon nirgendwo etwas steht, bin ich eher immer dafür den Code so nachvollziehbar und kurz wie möglich zu gestalten als mich auf hypothetische Anforderungen einzurichten.
MfG
-
Ich habe auf Deine Post geantwortet und sagen wollen dass das durchaus machbar ist. Wenn Du aus Lesbarkeitsgründen nur vom Dateianfang aus arbeiten willst, dann mach es doch einfach.
-
*lol*
Ich glaub' wir reden aneinander vorbei witte... Ich frag' nochmal anders: Wenn man mit einem Programm für Windows eine Datei (Dateilänge ist bekannt) von Anfang bis Ende ausgelesen hat, die ausgelesenen Daten modifiziert hat und dann mit diesen Daten (Datenlänge unverändert) die Datei überschreiben möchte, ist es dann nicht übersichtlicher den Dateizeiger mit
fseek(MyFile, 0, SEEK_SET)
anstatt mitfseek(MyFile, -1024, SEEK_END)
an den den Dateianfang zu setzen? Und die (für mich wichtigere) Hauptfrage: Was habe ich für einen Vorteil in diesem Szenario, wenn ich den Zeiger mitfseek(MyFile, -1024, SEEK_END)
positioniere? Ich sehe nämlich im Moment nur den Nachteil, dass es in meinen Augen unlogisch ist einen Zeiger 1024 vor dem Ende zu positionieren, wenn man in auch einfach am Anfang positionieren kann...MfG
-
akeTsu schrieb:
Ich setzte den Dateifeiger nichtmals auf das Ende sondern auf die Stelle 1024 Bytes VOR dem Ende, genau da fängt die Farbtabelle jedesmal an. Welche offset address das vom Anfang aus ist weiß ich nicht.
-
OMFG - wer lesen kann ist klar im Vorteil...