2016-10-03 62 views
0

我有一个名为“obj”的类,它有两个数据类型一个int和一个double。我试图只读第三个对象,但似乎无法弄清楚。在我将其中一种数据类型改为两倍之前,它正在工作。我觉得它与类型匹配有关。总结起来,我不能得到它只输出第三个对象后,文件已经wrriten。有什么建议么?输出一个二进制文件写入C++

#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(); 





    } 
+0

建议:1)让我们确切地知道什么是不工作。它是编译错误,运行时错误还是意外结果? 2)问一个比“任何建议?”更好的问题? – user463035818

+0

它不输出第三个对象只给我我认为是一个内存空间 – juanmindset

+0

什么是'数据'的定义? – Peter

回答

0

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

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

应该解决这个问题。

请注意,sizeof(Data)大于由于填充造成的分量总和。更多信息请参阅本:

Why isn't sizeof for a struct equal to the sum of sizeof of each member?

另外请注意,如果你重新定义num2int那么就不需要填充和你原来的代码工作的话。