2016-10-03 3 views
0

У меня есть класс с именем «obj», который имеет два типа данных: один int и один double. Я пытаюсь просто читать в третьем объекте, но, похоже, не понял его. Он работал до того, как я изменил один из типов данных на двойной. Я чувствую, что это связано с типом. Подводя итог, я не могу заставить его выводить только третий объект после того, как файл был схвачен. Какие-либо предложения?Вывести двоичный файл в двоичном файле 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?

Также обратите внимание, что если вы переопределить num2 к int тогда нет необходимости прокладки и в этом случае исходный код работает.

Смежные вопросы