Leseoperation schlägt fehl



  • Wenn du die Größe der Datei auf diese Weise feststellen möchtest, um danach unformatiert zu lesen, solltest du fstream::binary mit angeben.

    C++ kann mit sehr großen Dateien nicht mehr umgehen, hier ist das OS gefragt.

    Quatsch. Man darf halt nur nicht erwarten dass sich streamoff immer problemlos in size_t umwandeln lässt. Aber das ist hier sicher nicht das Problem.



  • std::fstream::binary
    

    zu setzen hat das Problem gelöst.
    Vorher wurden die Zeilenumbrüche in der Datei immer übersprungen, was zum Setzen des Fehlerbits geführt hat.

    Danke für die Hilfe!



  • herddfvc schrieb:

    Vorher wurden die Zeilenumbrüche in der Datei immer übersprungen, was zum Setzen des Fehlerbits geführt hat.

    Verstehe ich nicht. Wieso führt das zum Fehler 😕



  • cooky451 schrieb:

    C++ kann mit sehr großen Dateien nicht mehr umgehen, hier ist das OS gefragt.

    Quatsch. Man darf halt nur nicht erwarten dass sich streamoff immer problemlos in size_t umwandeln lässt. Aber das ist hier sicher nicht das Problem.

    Die Dateigröße bei einer 12 GB großen Datei zu bestimmen kann man mit C++ jedenfalls vergessen.


  • Mod

    jkljkljkl schrieb:

    Die Dateigröße bei einer 12 GB großen Datei zu bestimmen kann man mit C++ jedenfalls vergessen.

    Wieso?



  • Verstehe ich nicht. Wieso führt das zum Fehler

    Angenommen ich habe eine Datei die folgendermaßen aufgebaut ist:

    123
    !!!
    

    Diese Datei ist in diesem Fall 7 Bytes groß.
    Dadurch, dass der Zeilenumbruch beim Lesen übersprungen wird, merkt der Stream nach dem 6ten Zeichen, dass er am Ende der Datei angelangt ist, obwohl er angewiesen wurde 7 Zeichen zu lesen. Von daher Fehler --> Fehlerbit wird gesetzt.



  • jkljkljkl schrieb:

    Die Dateigröße bei einer 12 GB großen Datei zu bestimmen kann man mit C++ jedenfalls vergessen.

    12 GB ist etwas wenig. Bei 16777216 TB allerdings, da sollte man dann vielleicht doch mal 128-bit Integer einführen. 🙄



  • cooky451 schrieb:

    jkljkljkl schrieb:

    Die Dateigröße bei einer 12 GB großen Datei zu bestimmen kann man mit C++ jedenfalls vergessen.

    12 GB ist etwas wenig. Bei 16777216 TB allerdings, da sollte man dann vielleicht doch mal 128-bit Integer einführen. 🙄

    Wie? Ich kann meine 200 16777216TB-Textfiles nicht mit C++ einlesen?!


  • Mod

    Nathan schrieb:

    Wie? Ich kann meine 200 16777216TB-Textfiles nicht mit C++ einlesen?!

    Eigentlich schon. Eine Implementierung die auf einem System mit solchen Dateien läuft, sollte auch einen entsprechend großen std::streamsize anbieten.



  • Auf einem 32 Bit System, lässt sich die Dateigröße eienr Datei > 4 GB nicht bestimmen.


  • Mod

    kkkkk schrieb:

    Auf einem 32 Bit System, lässt sich die Dateigröße eienr Datei > 4 GB nicht bestimmen.

    Dann machst du es falsch.



  • Dann machst du es falsch.

    Wie kann man es denn machen?


  • Mod

    dumme_frage123 schrieb:

    Dann machst du es falsch.

    Wie kann man es denn machen?

    Die Frage ist erst einmal: Was möchtest du genau wissen?

    Den Wert von tellg() am Dateiende (der übrigens nicht unbedingt etwas mit der Dateigröße zu tun hat)? Dann mach ein tellg und Speicher das Ergebnis in einem std::streampos.
    (Es gab ganz früher mal (d.h. in Zeiten in denen es durchaus noch normal war, dass ein Dateisystem bloß Dateien bis 2GB haben kann (bei MSVC sogar bis 2008 👎 )) Implementierungen, bei denen der streampos bloß 32 Bit hatte. Da musste man dann eventuell einen Compilerschalter umlegen, damit große Dateien unterstützt werden. Mehr dazu in der Dokumentation der Implementierung. Heutzutage sollte das die Standardeinstellung sein.)

    Die "richtige" Dateigröße? Dazu braucht man sowieso Betriebssystemfunktionen. stat() ist in der Verbreitung und Benutzung ziemlich portabel. stats sollte wie tellg schon einen passend großen Typen zurück liefern. Auch hier gab es in grauer Vorzeit Implementierungen, bei denen man dies eventuell erst noch aktivieren musste, da es damals noch realistisch war, ein Dateisystem mit einer 2GB Grenze vorzufinden.


Anmelden zum Antworten