繁体   English   中英

输出用二进制文件C ++编写的双精度型

[英]Output a double written in a binary file C++

我有一个名为“ obj”的类,它具有两种数据类型:一个int和一个double。 我试图读入第三个对象,但似乎无法弄清楚。 在将其中一种数据类型更改为double之前,它一直在工作。 我觉得这与类型转换有关。 总而言之,在文件被写入后,我无法使其仅输出第三个对象。 有什么建议么?

#include<iostream>
#include<fstream>

using namespace std;

class Data {

public:
    int num1;
    double num2;

    Data() {}
    ~Data() {}
    void setData();
    void getData();
};

void Data::getData()
{
    cout << "Enter first number: ";
    cin >> num1;

    cout << "Eneter second number: ";
    cin >> num2;

}









#include "class.h"


    const int SIZE = 5;
    int main()
    {

        Data obj[SIZE];

        for (int i = 0; i < SIZE; i++)
        {
            cout << "Enter numbers of object " << i+1 << endl;

            obj[i].getData();

        }


        ofstream outFile;
        outFile.open("C:\\Users\\juan\\Desktop\\26.bin", ios::out | ios::binary);

        for (int i = 0; i < SIZE; i++)
        {

            outFile.write(reinterpret_cast<char *> (&obj[i].num1), sizeof(obj[i].num1));
            outFile.write(reinterpret_cast<char *> (&obj[i].num2), sizeof(obj[i].num2));

        }

        cout << "Writing to file...." << endl;

        outFile.close();

        ifstream inFile;
        inFile.open("C:\\Users\\juan\\Desktop\\26.bin", ios::in | ios::binary);

        for (int i = 0; i < SIZE; i++)
        {
            inFile.read(reinterpret_cast<char *> (&obj[i].num1), sizeof(obj[i].num1));
            inFile.read(reinterpret_cast<char *> (&obj[i].num2), sizeof(obj[i].num2));



        }

        for (int i = 0; i < SIZE; i++)
        {
            cout << obj[i].num1 << endl;
            cout << obj[i].num2 << endl;
            cout << endl << endl;
        }

        inFile.close();

        Data third;
        fstream seekfile;


        seekfile.open("C:\\Users\\juan\\Desktop\\26.bin", ios::in | ios::binary);

        seekfile.seekg(2 * sizeof(Data), ios::beg);

        seekfile.read(reinterpret_cast<char *> (&third.num1), sizeof(third.num1));
        seekfile.read(reinterpret_cast<char *> (&third.num2), sizeof(third.num2));

        cout << endl << endl;
        cout << third.num1 << endl;
        cout << third.num2 << endl;

        seekfile.close();





    }

问题是sizeof(Data) 不是 sizeof(int) + sizeof(double)的总和,因此seekfile.seekg(2 * sizeof(Data), ios::beg)是不正确的。 这个

seekfile.seekg(2 * (sizeof(third.num1) + sizeof(third.num2))

应该解决问题。

请注意,由于填充, sizeof(Data)大于其组成部分的总和。 看到更多信息:

为什么结构的sizeof不等于每个成员的sizeof之和?

还要注意,如果将num2重新定义为int则无需填充,在这种情况下,原始代码可以使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM