2012-04-03 32 views
0

割り当ての一部として、int,charのデータ型からなるバイナリファイルからデータを読み取る必要があります。このバイナリファイルは、それぞれ96バイトのレコードに分割されます。私はcharバッファにこれらの96バイトを読み込み、私が持っている情報に従ってそれらを分割しようとしています。しかし、バッファからintの値を取得しようとすると、何も得られません。これで私を助けてくれますか?C++ファイル操作

#include<iostream> 
#include<fstream> 
#include<cstdio> 

using namespace std; 

int main() 
{ 
    char buffer[100]; 
    char *p; 
    char temp[10]; 
    int val; 
    fstream ifs,ofs; 
    ifs.open("write.bin",ios::binary); 
    if(ifs.read(buffer,96)) 
    { 
     cout << "READ" << endl; 
    }  
    p = buffer; 
    memcpy(temp,buffer,4); 
    cout << temp << endl; 
    val = atoi(temp); 
    cout << val << endl; 
} 

私はmemcpyの代わりにもstrncpyを使用。 出力はvalでは0、tempでは空白です。

+9

問題が発生しているコードを表示すると、おそらく役に立ちます。 –

+2

'ifs.open(...)'の 'ios :: in'フラグを忘れていませんか? 'ifs.seekg(0);'を実行してから 'ifs.read(...)'を呼び出してください。 – vissi2

+0

あなたのレコードの構造は何ですか?あなたが文字列を読み込もうとしているようですが、データはバイナリ表現で表現されています。 – Matthias

答えて

0

atoiは、文字列(char配列)を整数に変換します。したがって、"42"のようなものは整数42を返します。あなたの質問が書かれているように、整数は単純にテキストファイルにバイナリとして保存されているようです。

目的のタイプに加えて間接参照にバッファポインタのシンプルなキャストが実行する必要があります。

/* read 96 bytes into char array buffer */ 
uint32_t your_number = *(uint32_t*)buffer; 
cout << your_number << endl; 

をごmemcpyを使用したい場合は、char型の配列にコピーする必要はありません、あなたはに直接コピーすることができます整数アドレス:平野C(ないC++)で

uint32_t your_number; 
memcpy(&your_number, buffer, 4); 
cout << your_number << endl; 

これは次のようになります。

uint32_t your_number; 
FILE *f = fopen("write.bin", "r"); 
fread(&your_number, sizeof(uint32_t), 1, f); /* uint32's size is 4 bytes */ 
fclose(f); 
printf("%d\n", your_number); 

データ型としてuint32_tを選択しました。これは、32ビット/ 4バイトであることが保証されています。intは、いくつかのプラットフォーム/コンパイラでサイズが異なることがあります。

0

Cスタイルの関数とは異なり、readは数値またはバイトを返しません。代わりにistream&を返します。その結果を確認するには、ifs.read()の後にifs.gcount()に電話してください。

+0

これはコメントではありません –

+0

私はgccを使って自分のコンピュータ上でプログラムhttps://gist.github.com/2293977をチェックして、空ではない出力を得ているかもしれません。データに問題がある可能性があります。 – vissi2