dateien einlesen > 4 GB



  • hola leute

    wie kann man dateien , die groesser als 4 GB sind, einlesen ?
    fread fseek usw. arbeiten soch nur mit int-groessen.
    oder irre ich mich da ?

    Meep Meep



  • Hi!

    Was sind denn das für Dateien?
    Naja, auslesen kannst du Dateien in C++ mit ifstream und schreiben mit ofstream, die in der Header fstream deklariert sind. Diese kannst du dann direkt in einen std::string einlesen. Aber brauchst du die ganzen >4 GB auf einmal?

    Code-Hacker



  • (Meep Meep) schrieb:

    hola leute
    wie kann man dateien , die groesser als 4 GB sind, einlesen ?
    fread fseek usw. arbeiten soch nur mit int-groessen.
    oder irre ich mich da ?

    mit streams kann man denke ich auch mit viel größeren dateien arbeiten, solange man nicht seeken muß.
    und wenn es echt notwendig wird, mußte eben gucken, welche funktionen (z.B. ReadFile/WriteFile) dein betriebssystem anbietet, die können gewöhnlich viel mehr als 4G.



  • Eine etwas langsamere Methode wäre eine zweite Datei zu nehmen in welche die Teile der großen Datei temporär ablegst die dann kleiner sind als 4GB.



  • halloechen

    das groessenprob hab ich ansich aber auch wenn ich ein verzeichnis einlesen will... mit den funktionen finffirst, findnext usw... bekommt man auch nur dateigroessen bis max. 32 bit richtig angezeigt.
    das mit systemfunktionen z.b. von windows funkt an sich schon, aber damit kann ich das dann aber auch nicht OS unabhaengig proggen.
    muss man in so nem fall dann fuer jedes OS ne eigene version proggen ? oder gibts da noch andere kniffe ??

    Meep Meep



  • Hi!

    boost kann wohl auch Verzeichnisse auslesen und ist plattformunabhängig. Die andere Möglichkeit wäre plattformabhängig und mit Kompilerdirektiven zu arbeiten.

    Code-Hacker



  • Unter Windows > NT kannst du "memory mapped Files" verwenden.

    mfg JJ



  • Ist zwar schon älter der Thread, aber da ich ne weile mit boost drann rumgefummelt habe, wollte ich hier mal ein Beispiel zeigen:

    edit: mir ist aufgefallen dass es auch ohne boost geht:

    #include <iostream>
    #include <fstream>
    
    int main() {
        using namespace std;
        cout << "Bitte gebe Dateinamen ein:" << endl;
        string Dateiname;
        getline(cin, Dateiname);
        cout << "Oeffne " << Dateiname << "..." << endl;
        ifstream Datei(Dateiname.c_str(), ios::binary);
        if (!Datei) {
            cout << "Datei nicht gefunden!" << endl;
            return -1;
        }
        Datei.seekg(0, ios::end);
        unsigned __int64 Dateigroesse = Datei.tellg();
        cout << "Die Datei ist "
        << Dateigroesse / 1024. / 1024.
        << " MB gross." << endl;
        return 0;
    }
    

    Wenn ich damit mein 8GB großes VMWare Laufwerk öffne:

    Bitte gebe Dateinamen ein:
    C:\Dokumente und Einstellungen\Jan Niklas Hasse\Eigene Dateien\Ubuntu-flat.vmdk
    Oeffne C:\Dokumente und Einstellungen\Jan Niklas Hasse\Eigene Dateien\Ubuntu-fla
    t.vmdk...
    Die Datei ist 8192 MB gross.
    
    Press ENTER to continue.
    

    Was mir noch nicht gefällt ist der __int64 Typ. Gibst dazu alternativen?

    mfg.

    PS: Gibt's sowas eigentlich schon in der FAQ?

    edit: das ganze auch ohne boost. Huh??!?


Log in to reply