problem mit ofsteram



  • Hallo,
    ich habe ein Problem mit ofstream (Compiler Visual C++ 2005 B1).

    Ich muss eine Datei auslesen die meherer GB gross ist. Wie es aber den anschein macht, ist ein seek() über mehere GB's nicht möglich. Verstehe ich nicht, denn das Erstellen dieser grossen Datei funktionierte doch auch.
    Kennt jemand eine Lösung für dieses Problem?

    gruss sam



  • seekp() verwendet pos_type der in den meisten Fällen ein long int sein wird - also 2147483648 Bytes = 2 GB adressieren kann. Wenn dir das nicht ausreicht musst du die API wechseln - was ich dir bei so großen Dateien sowieso anraten würde (aus Geschwindigkeitsgründen).

    Welches OS verwendest du denn? Ich geh bei Visual C++ mal von Windows aus. Schau dir dann mal CreateFile(), SetFilePointer(), ReadFile() und CloseHandle() an. Das sollte zumindest das seek-Problem lösen, wenn dir das geschwindigkeitsmäßig aber immer noch zu langsam ist muss man weiterdenken.

    CreateFile() mal auf jeden Fall mit FILE_FLAG_RANDOM_ACCESS aufrufen!

    MfG SideWinder



  • Die API kann ich nicht wechseln, da die Software später auf Linux laufen soll.
    Aber ich habe mir mal pos_type genauer angeschaut und musste erfahren, dass das ja ein Object ist. Bei einer Zuweisung auf einen int64 lifert diese nur einen Offset.

    Ich habe das Problem jetzt so gelöst:

    fstream::streampos LastFilePos;
      LastFilePos = File.tellp();
    
      __int64 NewPos = 1ull << 63;
      fstream::streampos NewFilePos(LastFilePos.state(), NewPos);
      File.seekg(NewFilePos);
      File.read(,);
    
      File.seekg(LastFilePos);
    

    gruss sam


Anmelden zum Antworten