2011-08-05 7 views
0

このコードを書いてフロート番号のバイナリファイルを作成しましたが、最後にセグメンテーションフォールトエラーが発生します。ファイルには9000の浮動小数点数が書き込まれますが、読み込み時には4096個しか読み込まれません。私は、実行可能ファイル数回、それは4096、8192と9000の間のスイッチを読み取りますが、私はワンセグが常に故障しているバイト数を実行すると...同じコードで作成されたバイナリファイルから読み込み中にseg faultが発生する

float *realRef = new float [length]; //then filling it out... 


ofstream out("blah.bin", ios::out | ios::binary); 

out.write((char *) &realRef, length*sizeof(float)); //length is 9000 
out.close();  

ifstream in("blah.bin", ios::in | ios::binary); 

float *readTest= new float[length]; 

in.seekg(0, ios::end); 
size_t size=in.tellg(); // printing size shows 4096 BUT it should be 9000 
in.seekg(0, ios::beg); 

in.read((char *) &readTest, size);  
cout << in.gcount() << " bytes read." << endl; 

in.close(); 

答えて

2

あなたのコードにエラーがあります。ポインタのアドレスを取る必要はありません。

あなたのコードが更新さ
//out.write((char *) &realRef, length*sizeof(float)); 
out.write((char *) realRef, length*sizeof(float)); 

//in.read((char *) &readTest, size); 
in.read((char *) readTest, size); 
1

 
out.write((char *) realRef, length*sizeof(float)); //length is 9000 

in.read((char *) readTest, size);

をあなたはポインタのアドレスを渡しました。

0

segfaultは、指摘されているものではなく、ポインタ自体から読み書きするためです。書き込みおよび読み取りステートメントから&を削除します。

また、実際に書き込まれた量を確認するには、writeによって返された値を確認することもお勧めします。

float *realRef = new float [length]; 

新しい戻り、新たに割り当てられたメモリへのポインタ:

0

あなたの最初の行にエラーがあります。配列の括弧もポインタに変換されます。 `長浮動小数点数の動的配列を割り当てるための正しい方法を_is_;だから、実際には、あなたは

float* realRef = float[length] 
+0

は' * realRef =新しいfloat [長さ]浮くだろう

float* realRef = float**(malloc(...)) 

これを行うための正しい方法を行います。あなたのソリューション 'float * realRef = float [length];'もこの場合には動作しますが、コンパイル時に長さを知る必要があります。 – DanS

関連する問題