2011-12-08 11 views
0

fstream classを使用して読み込み時にデータを保存する方法は?例では、私の質問を明確にします:未処理ファイルを読むC++

char * memBlock = NULL; 
    fileSize = file.tellg(); 
    memBlock = **new** char[fileSize]; 
    file.seekg(0, ios::beg); 
    file.read(memBlock, fileSize); 
    file.close(); 

    if(memBlock) 
    return memBlock; 

コンテキストは、私はピクセルを表す値が00またはFF(黒のどちらかである

  • ように進に記録された原画像を読んでいますということですまたは白、1または0)
  • であり、列と行に配置されています。

メモリ内のファイルを読むとき、memblock arrayの値はffと00として格納されているか、またはASCIIなどで自動的に1と0に変換されますか?

+0

ここでは多くのことが意味をなさない。生画像はバイナリデータです。バイナリデータは16進数で表示できますが、16進数には変換されません。これは、テキストデータでのみ可能です。あなたのイメージはテキストファイルに変換されましたか? –

+0

編集のためのthnx、私が言いたいことは、メモリに11111111として保存されているffで表示された場合には、厄介な言語についてsrryがあります。これをprintf(一部の指定子、 param) – user1084113

答えて

0

データが進

00FF00FF 

として保存され、あなたのコードのように、あなたはそれがfile.readを使用して読んだとき、 はそれは

memcmp(memblock, "00FF00FF", 8) == 0 

が評価することを意味し、それとして格納されています本当に。あなたは、変換を自分で行う必要があり

EDIT

。一つの方法は、まずあなたがfstreamのデフォルトではありませんバイナリモードでファイルを開く必要があり、生データファイルを読み込むための

int ConvertToColor(const char *colorBuffer, size_t size) 
{ 
    int color = -1; 
    if(size >= 2) 
    { 
     char colorCode[3] = { colorBuffer[0], colorBuffer[1], 0 }; 
     long longColor = strtol(colorCode, NULL, 16); 
     if(longColor != LONG_MAX && longColor != LONG_MIN)    
      color = (int)longColor; 

    } 
    return color; 
} 

std::vector<int> ConvertToColors(const char *memBlock, size_t size) 
{ 
    std::vector<int> colors; 
    for(size_t i = 0; i < size; i += 2) 
    { 
     int color = ConvertToColor(memBlock + i, size - i); 
     if(color < 0) 
      throw std::exception("Unable to convert color."); 
     colors.push_back(color ? 1 : 0); 
    } 
    return colors; 
} 
+0

ok私のプログラムが1と0の配列を取ることを期待している場合、00とffのデータを1と0に(00またはffの代わりに)解析する必要があります。私は生データを読み込んだり、自分で作成する必要があります。 – user1084113

+1

@ user1084113:それはちょっと奇妙な翻訳なので、何か自分でやる必要があります。あなたのプログラムが1と0の配列を期待しているとしたら、 '1'と '0'文字、1または0を保持する文字、または生のバイナリの配列を意味しますか? –

+0

1と0の文字 – user1084113

0

だろう。 file.open(filename, std::ios::binary|std::ios::in)を使用してください。

このようにして、メモリバッファに読み込まれるコンテンツは、ファイルコンテンツとまったく同じになります。

ファイルに00ff00ffがある場合は、00ff00ffがメモリに格納されます。変換はありません。

あなたは00ff00ffと仮定して、0年代と1年代にそれを変換したい場合は、各バイトの意味は0x00, 0xff, 0x00, 0xffでは、次の変換を行うことができます(00ff00ffは、実際には8つのASCII文字であれば、esskar年代ご覧ください答)

for (size_t i=0; i<fileSize; i++) 
{ 
    if (memBlock[i]!=0) memBlock[i]=1; 
    // or 
    // memBlock[i] &= 1; 
} 

これは、バイナリ01バイトの雑誌にバッファを変換します。

関連する問題