強制轉換出現的變態問題!

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926
using namespace std;
int main()
{
int index = 1 ;
float x1,y1;
//float *strx=new float[1024];
float *ffy=new float[1024];
////從棧中分配內存,當長度比較大時儘量用動態地從堆中分配內存可以節約大量的堆棧空間
int i=0;
for(int i=0;i<index;i++)
{
 //for(int ii=0;ii<32;ii++)    
 //{
  //x1=(float)(j*2*PI+ii*PI/16);
 // y1=(float)(2*sin(x1)+3*sin(2*x1)+4*sin(3*x1)+5*sin(4*x1));
  //strx[i]=0;
  ffy[i]=(float)(12.0025);
  
// ffy[i]=(float)(12.1212+0.1024);
 // i++;
 //}
}

ofstream my_file;
my_file.open("test.txt");
my_file.write((char*)ffy,index*sizeof(float));
my_file.close();

//cout <<  gcvt(1.234) << endl;
cout << index*sizeof(float) << endl;

system("pause");

}    

C語言中的float與double類型,符合IEEE的浮點數規範,跟上面的老兄一樣,我也忘記了具體規範的內容了。不過如果你要將float的只保存在文件裏的話,最好是保存在二進制文件中,而且這些內容不要期待可以打印出來。

如果以二進制方式保存,應該注意存入文件之前進行字節順序轉換,因爲x86CPU與其他CPU的字節順序不同。爲了讓這個文件在其他CPU的機器上能夠正確讀取,這個是必須的,同樣的,從文件中讀出時也要進行字節順序轉換。這個不是必需的,但是是一個好習慣。在網上傳送的數據特別要注意。

?

如果是32位的float的話,
其最高位是符號位,
接下來的8位是二進制表示的指數,
剩下的23位是尾數部分,
如f1=3.125,
他的二進制表示爲:11.001,即爲1.1001X2
所以他的指數爲1,在內存中存放的指數部分應該爲1+127,二進制形式爲:10000000(共8位),
尾數部分爲1.1001,ieee754標準規定省略整數部分1,所以在內存中尾數部分爲:10010000000000000000000(共23位)
它在內存中的表示是:0 10000000 10010000000000000000000
所以你直接把&float 轉爲char*肯定是些亂七八糟的字符

FILE*?fp;
fp?=?fopen("filename",?"wb");

float?mydata;

mydata?=?1234567;

float?tmpdata;??//temp?data

tmpdata?=?htonl(mydata);

fwrite(&tmpdata,?sizeof(float),?1,?fp);
fclose(fp);

讀出:

FILE*?fp;
fp?=?fopen("filename",?"rb");

float?mydata;

float?tmpdata;??//temp?data

fread(&tmpdata,?sizeof(float),?1,?fp);

mydata?=?ntohl(tmpdata);
printf("%f/n",?mydata);

fclose(fp);
如果就是要把float轉換成爲char的話,用下面的語句就可以了
char str[10];
float f=1.23456;
sprintf( str, "%f", f );

經過嘔心瀝血的測試,終於發現12.0025 12.0026正好轉換爲0d0a等等一段字符,正好包含回車換行符,所以文件大小不是n*4字節!

鬱悶ing...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章