2016-05-25 5 views
-2

meine erste Post so krank bleibe bei den Leitlinien so gut wie ich kann!Wie kann ich lesen/schreibe Bytes/Bits zu einer neuen Datei in C++

Im Grunde versucht, eine Methode zum Bearbeiten einer Datei auf der binären Ebene zu machen. Ich habe eine Möglichkeit, die Bytes zu lesen (leider nicht in großen Formaten), aber ich bin fest, wie ich dann die Bytes in eine neue Datei schreiben kann. Ich dachte mir, ich kann die Bytes in hex konvertieren und dann die Datei auf diese Weise schreiben, aber ihre andere Schritt-ID möchte ich vermeiden. Gibt es eine Methode zum Schreiben von Bytes in eine Datei, die Sie vorschlagen können? Wenn möglich, lassen Sie es auch in einem großen Format wie 5 GB schreiben.

Hier ist der Code im zum Umwandeln jede Datei Bytes mit:

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
using namespace std; 

//Variables 
const unsigned long long size = 64ULL * 1024ULL * 1024ULL; 
unsigned long long file[size]; 

class ByteManager 
{ 
    char const* input; 
public: 
    void set_values(char const*); 
    char* ConvertToBytes() 
    { 
     ifstream streamData(input); 
     streamData.seekg(0, ios::end); 
     size_t len = streamData.tellg(); 
     char* Bytes = new char[len]; 
     streamData.seekg(0, ios::beg); 
     streamData.read(Bytes, len); 
     streamData.close(); 

     return Bytes; 
     //return 0;  
    } 
}; 

void ByteManager::set_values(char const* a) 
{ 
    input = a; 
}; 

Hinweis: Ich kann die Hex-Klasse abgibt, dass in der Tat ist die beste Methode, nach unten zu gehen.

Auch danke im Voraus für jeden Hinweis/Feedback/Code, der vorgelegt wird! ~ nobodyshome

+1

Arbeiten Sie einfach an einem kleineren Puffer und verarbeiten Sie die Datei in Chunks. –

+0

@ πάνταῥεῖ Wie würde ich eine dieser Optionen wählen? Wo kann ich mehr über diese erfahren? – nobodyshome

Antwort

0
  1. Wenn Sie die Kompression im Speicher gehen zu tun, und die Menge des verfügbaren Speichers ist ein Problem für Sie, dann ist dein Problem beginnt früher, als wenn die Ausgabedatei zu erstellen: Sie müssen passen die Eingabedatei im Speicher!
  2. Einfach eine Kopie einer Datei erstellen ist einfach und nicht speicherintensiv: Sie erstellen einfach eine Schleife, um einen Datenblock (zB ein Byte) aus der Eingabedatei zu lesen, und Sie schreiben sofort den gleichen Datenblock in die Ausgabedatei. Das Speichermaterial kann also ziemlich niedrig sein, wenn Sie einen kleinen Block auswählen.
  3. Ein weiteres Problem, das Sie jetzt nicht erwähnen, ist die Geschwindigkeit des Schreibens auf die Festplatte. Das Schreiben in größeren Blöcken ist im Allgemeinen schneller (aber dies ist nicht so offensichtlich (zumindest nicht linear) aufgrund verschiedener Cache-/Pufferaktivitäten des Betriebssystems und des Speichergeräts selbst).
+0

Okay, ich sehe mir das alles an. Irgendwelche Ratschläge, ob Bits über Bytes verwendet werden sollen und wie ich die Bytes in eine Ausgabedatei schreiben kann? – nobodyshome

0

Sie lesen die ganze Datei im Speicher. In Pseudocode:

bytes = read_whole_file(); 

Sie möchten wahrscheinlich nur ein wenig auf einmal lesen.

Aber ich vermute, Ihr Komprimierungsalgorithmus möchte über alle Bytes auf einmal wissen. Sie könnten eine Multi-Pass-Methode in Betracht ziehen, einmal durchlesen, um die Statistiken zu erhalten, die Sie benötigen, und dann erneut durchlesen, um die eigentliche Verarbeitung durchzuführen.

+0

@ peter-strock Okay danke, ich schaue mir das an. Kennen Sie irgendeine Methode, um es in großen Stücken zu tun? es benötigt nicht die ganze Datei im Speicher, nur signifikante Teile davon. – nobodyshome

+0

Sie könnten ein [kreisförmiges Array von Bytes] (http://en.wikipedia.org/wiki/Circular_buffer) behalten. –