C ++二进制文件到结构函数

时间:2013-11-14 02:54:27

标签: c++

我有一个结构:

    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。

2 个答案:

答案 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

如果这可以解决您的问题,请告诉我。