2016-05-25 8 views
-2

私の最初の投稿は、私ができる限り最高のガイドラインに従います!C++の新しいファイルにBytes/Bitsを読み書きするには

基本的に、バイナリレベルでファイルを編集する方法を作ろうとしています。私はバイトを読み込む方法がありますが(不幸にも大きなフォーマットではありませんが)、バイトを新しいファイルに書き込む方法については固執しています。私は、16進数にバイトを変換して、そのようにファイルを書くことができると思ったが、その別のステップIDは回避するのが好きです。あなたが提案できるファイルにバイトを書き込む方法はありますか?また可能であれば、5GBのような大きなフォーマットで書くことができます。ここで

はバイトに任意のファイルを変換するため使用してコードイムです:

#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; 
}; 

注:私はそれが実際にダウンして行くための最善の方法である場合には、六角クラスを投稿することができます。

提出されたアドバイス/フィードバック/コードもありがとうございます! 〜nobodyshomeは

+1

小さいバッファで作業し、ファイルをまとまりで処理してください。 –

+0

@πάνταῥεῖどのように私はこれらのオプションのいずれかを行うだろうか?それらについてもっと知るためにどこに行くことができますか? – nobodyshome

答えて

0
  1. あなたは、メモリ内の圧縮をやろうとしている、と使用可能なメモリの量は、あなたのための問題である場合は、あなたの問題は、出力ファイルを作成するときよりも早く開始します:あなたが合うようにする必要があります入力ファイルがメモリにあります!
  2. ファイルのコピーを作成するだけで簡単です。メモリを必要としません。入力ファイルからデータのまとまり(バイトなど)を読み取るループを作成するだけで、すぐに同じチャンクを出力ファイル。したがって、小さなチャンクを選択すると、メモリフッテージがかなり低くなることがあります。
  3. もう1つの問題は、今言及していないことは、ディスクへの書き込み速度です。より大きなチャンクでの書き込みは、一般的に高速です(しかし、オペレーティングシステムとストレージデバイス自体のさまざまなキャッシング/バッファリング活動のため、これはあまり明白ではありません(少なくとも直線的ではありません)。
+0

さて、これをすべて見てください。 Bits over Bytesを使用するかどうか、そしてバイトを出力ファイルに書き込む方法についてのアドバイスはありますか? – nobodyshome

0

あなたはファイル全体をメモリに読み込んでいます。擬似コードの場合:

bytes = read_whole_file(); 

おそらく一度に少しずつ読みたいと思うかもしれません。

while (file_has_more_bytes) 
{ 
    byte = read_one_byte_from_file(); 
    do_something_with(byte); 
} 

しかし、圧縮アルゴリズムがすべてのバイトについて一度に知りたいと思っています。マルチパスの方法を検討し、必要な統計情報を一度読み込んでから、実際の処理を行うためにもう一度読むことができます。

+0

@ peter-strockよろしくお願いいたします。私はこれを検討しています。あなたは大きな塊でそれを行う方法を知っていますか?メモリ内のファイル全体が重要な部分だけである必要はありません。 – nobodyshome

+0

[円形配列の配列](http://en.wikipedia.org/wiki/Circular_buffer)を保持することができます。 –

関連する問題