2013-11-01 70 views
3

問題:C++編寫的對象二進制文件

Error: The "&" operator can only be applied to a variable or other l-value.

我已經試過:

  • dynamic_cast<char*>(e)
  • reinterpret_cast<char*>(e)
  • static_cast<char*>(e)
  • (char*) e

我想要做的事:

  • 寫入陣列e.data(私人)爲二進制文件。

注:

  • e.getSize()返回在數組
  • E []返回Employee對象元素的個數。

代碼:

fstream fout; 
fout.open(filename.c_str(), ios::out|ios::binary); 
if(fout.good()) 
{ 
    for(int i=0;i<e.getSize();i++) 
    { 
     fout.write((char*)&e[i], sizeof(e[i])); 
    } 
} 
fout.close(); 

Employee.h

class Employee { 
    friend std::ostream& operator<<(std::ostream&, const Employee &); 
    private: 
     int id; 
     char name[50]; 
     char address[100]; 
     char phone[20]; 
     char department[100]; 
     int salary; 
    public: 
     Employee(); 
     ~Employee(); 
     Employee(int,char[],char[],char[],char[],int); 
     bool operator==(Employee&); 
}; 

我迷路了,在做什麼,從我記得fout.write((char*)&e[i], sizeof(e[i]));是如何寫入二進制文件。

編輯: é聲明,像這樣: MYLIB::Bucket<Employee> e;

template <class T> 
class Bucket { 
    private: 
     T* bkt; 
     int size; 
     int capacity; 
     static const int stepsize = 10; 

    public: 
     Bucket(); 
     ~Bucket(); 

     void push_back(const T&); 
     T operator[](int); 
     int getSize(); 
     int getCapacity(); 
}; 

編輯2: fout.write(reinterpret_cast<char*>(e[i]), sizeof(e[i]));給我行122:錯誤:使用的reinterpret_cast從轉換?以char *不允許。 (122線只是引述線)

編輯3:

tempemp = e[i]; 
fout.write((char*)(&tempemp), sizeof(e[i])); 

編譯,但給人一種分段錯誤,我會調查原因。 編譯時,分段錯誤看起來不相關。

+3

e聲明如何? – Kevin

+3

「e」的聲明是什麼? –

+1

有點相關:我建議不要根據這種結構的平臺特定打包來編寫二進制文件。 – WhozCraig

回答

2

我認爲

T operator[](int); 

返回了必須的地址可以採取

const Employee& emp = e[i]; 
fout.write((char*)&emp, sizeof(emp)); 

可能工作之前被綁定的東西臨時對象,假設this answer是正確的,採取的參考延伸臨時對象的生命

另一種可能是返回對該對象的引用,該引用將刪除創建臨時對象

const T& operator[](int); 
+0

錯誤:初始化Employee&需要一個左值。 –

+0

我會提出第二個想法。 –

+0

它的工作原理!非常感謝! –

3
MYLIB::Bucket<Employee> e; 

這似乎是一個容器。 e[i]按價值爲您提供Employee。你需要使用&e[i]得到這個對象的地址,但你can'd做到這一點,因爲它是一個r值,所以你需要將它複製到一個非R值:

Employee copye = e[i]; 
fout.write((char*)&copye, sizeof(e[i])); 

應該工作。

在附註上,這一切看起來都很糟糕,我不會羨慕誰需要維護或閱讀它。幾點:

  • 你不應該使用內存對象的二進制格式作爲序列化格式。使用正確的序列化格式,如protobuf或xml或json
  • 爲什麼拉你自己的奇怪的容器,當你可以使用std::vectorstd::list?重新發明輪子總是很糟糕
  • 從容器中按值返回元素會創建降低性能的副本。