2016-10-13 3 views
0

Ich versuche eine Funktion zu schreiben, die Bytes rückwärts aus einer Datei liest. Ich weiß genau, wie es funktionieren sollte, aber seit ich mit C++ angefangen habe, weiß ich nicht, wie ich das machen soll.So lesen Sie eine bestimmte Anzahl von Bytes rückwärts vom Ende einer Datei C++

Lets sagen, dass ich eine 2 GB große Datei habe und ich die letzten 800 MB in den Systemspeicher (rückwärts) zuordnen will. Ich möchte, dass es effizient ist; Ich lade nicht die ganze Datei, da ich 1,2 GB davon nicht brauche.

Mit meinem begrenzten Wissen konnte ich dies bisher schreiben, aber ich stecke gerade fest. Sicherlich muss es viel eleganter sein, wie man das macht.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 

using namespace std; 

int main() { 
    // open the file 
    ifstream file; 
    file.open(filename, ios_base::binary); 

    //check for successful opening 
    if(!file.is_open()){ 
     cout << "Error." << endl; 
     exit(EXIT_FAILURE); 
    } 

    //get the lenght of a file 
    file.seekg (0, file.end); 
    long length = file.tellg(); 
    file.seekg (0, file.beg); 

    //read given amount of bytes from back and allocate them to memory 
    for (long i=0; i<=bytes_to_read-1; i++) { 
     file.seekg(-i, ios::end); 
     file.get(c); 

     //allocation process 

    } 
    return 0; 
} 
+2

Warum nicht einfach 'file.seekg (-bytes_to_read, ios :: end)' zuerst, lesen Sie die 'bytes_to_read' Bytes, und rufen Sie es einen Tag? Wenn Sie die Reihenfolge der Bytes umkehren möchten, kehren Sie sie um, nachdem Sie sie gelesen haben. –

+1

Was @SamVarshavchik sagte. Die Suche nach jedem gelesenen Byte ist eine extreme Ineffizienz. Es ist etwas, das Windows Update tun könnte. –

+0

Ich dachte, dass es einen Weg gibt, wie man das macht, ohne diesen zusätzlichen Schritt zu machen (im Speicher umzukehren). Ich konnte alle Bytes in das Referenz-Char-Array laden, aber da es nur eine umgekehrte Funktion für Strings gibt, denken Sie, dass ich meine eigenen implementieren sollte? Gibt es einen Weg herum? – robert

Antwort

0

Verwenden fseek zu bekommen, wo Sie wollen, und von dort die Datei lesen. fp ist ein Dateizeiger hier.

fseek(fp, -10, SEEK_END); // seek to the 10th byte before the end of file 

aus http://beej.us/guide/bgc/output/html/multipage/fseek.html, oderseekg wenn Iostream in C++.

+0

'fseek()' ist eine C-Funktion. Die Frage ist, nach einer C++ - Lösung zu fragen, die 'std :: ifstream' statt' FILE * 'verwendet. –

0

Zuerst gibt es einen Fehler - Sie müssen -i-1 in der Schleife suchen.

Zweitens ist es besser, so viele Systemaufrufe zu vermeiden. Anstatt byteweise zu lesen, lesen Sie den vollen Puffer oder eine angemessene Größe und kehren Sie dann den Puffer im Speicher um.

Verwandte Themen