我有一个结构:
struct zipType{
int postalCode;
double longitude;
double latitude;
};
我有一个名为zipToCout的函数:
void zipToCout(zipType zip){
cout << "Postal Code = " << zip.postalCode << "\tLongitude = " << zip.longitude << "\t\tLatitude = " << zip.latitude << endl;
}
现在我需要一个函数将二进制文件读入zipType结构。函数原型应该是void binRead(zipType *zip, fstream *input);
。我能够接近这一点的唯一方法是将原型更改为此void binRead(zipType &zip, fstream &input)
。有了这个,这是我目前的功能:
void binRead(zipType &zip, fstream &input){
int temp;
double temp2;
zipType tempZip;
tempZip = zip;
//cout << "Reader at location " << input.tellg() << endl;
input.read((char*)&temp,sizeof(int));
tempZip.postalCode=temp;
input.read((char*)&temp2,sizeof(double));
tempZip.longitude=temp2;
input.read((char*)&temp2,sizeof(double));
tempZip.latitude=temp2;
zipToCout(tempZip);
}
这是我在sample.bin文件上运行时得到的输出:
Postal Code = 64501 Longitude = 2.61457e-261 Latitude = -7.13357e+288
我需要帮助的是重新格式化函数以使用*
代替&
,并修复如何正确地将文件读入三个变量。谢谢你的期待!此外,此时我只需要从文件中读取一个zipType。
答案 0 :(得分:0)
void binRead(zipType *zip, fstream *input)
{
input->read((char*)( &zip->postalCode ), sizeof(int ));
input->read((char*)( &zip->longitude ), sizeof(double));
input->read((char*)( &zip->latitude ), sizeof(double));
zipToCout(*zip);
}
此外,根据体系结构(即32位x86),以下可能工作:
void binRead(zipType *zip, fstream *input)
{
input->read((char*) zip, sizeof(zipType));
zipToCout(*zip);
}
这仅适用于double
仅需要4字节对齐的架构。我相信32位x86适合那个。我在当地写的快速测试表明情况就是这样。
关于便携式,可维护代码的快速说明超出了上述迫切需要:当保存数据的机器与稍后读取数据的机器相同时,上述代码运行良好。但是,它确实会导致可移植性问题。如果你真的想设计一种可以在机器上移植并保存数据的文件格式,那么上述技术并不是真正有用的。
答案 1 :(得分:0)
我认为问题在于打印价值观。 如果您看到该值以字符串形式读取并打印为其他数据类型。我想正确的转换功能应该适合你。并使用见下面的评论。
void binRead(zipType &zip, fstream &input){
char* temp = NULL
char* temp2 = NULL;
zipType tempZip;
tempZip = zip;
//cout << "Reader at location " << input.tellg() << endl;
input.read(temp,sizeof(int));
tempZip.postalCode=(atoi)temp; //use for proper conversion, or other function
input.read(temp2,sizeof(double));
tempZip.longitude=static_cast<double*>temp2; //use for proper conversion, or other function
input.read(temp2,sizeof(double));
tempZip.latitude=static_cast<double*>temp2;
zipToCout(tempZip);
}
上述代码的评论很少,
tempZip = zip; //why this, since you havn't declared any proper assignment
operator. Use memcpy instead.
tempZip.postalCode=(atoi)temp; //use for proper conversion, or other function
tempZip.longitude=static_cast<double*>temp2; //use for proper conversion, or other function
如果这可以解决您的问题,请告诉我。