输出一个写在二进制文件c++中的double

Output a double written in a binary file C++

本文关键字:二进制文件 c++ 中的 double 一个 输出      更新时间:2023-10-16

我有一个名为"obj"的类,它有两个数据类型,一个是整型,一个是双精度。我试着读第三个对象,但似乎不能弄清楚。在我将其中一个数据类型更改为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)大于其组成部分的总和。查看更多信息:

为什么结构体的n't sizeof等于每个成员的sizeof之和?

还请注意,如果您将num2重新定义为int,则不需要填充,在这种情况下,您的原始代码可以正常工作