2011-04-22 49 views
0

該文件以二進制模式打開,第一個變體出現異常,第二個不是。 如何使用ifstream直接讀取我的目標對象?請幫幫我。 這裏是我的代碼:如何用ifstream讀入對象成員?

class mhead { 

public: 

    long length; 
    void readlong(std::ifstream *fp); 
} 

void mhead::readlong(std::ifstream *fp)  
{ 
    //this one is not work 
    fp->read((char*)this->length,sizeof(this->length));  

    //this is working 
    long other; 
    fp->read((char*)other,sizeof(other)); 
} 
} 
+2

看來你是寫入到內存的任意位置。這只是運氣,你的第二個變體正在工作。嘗試fp-read(&this-> length,sizeof(length))。 – beduin 2011-04-22 10:55:18

+0

@Alexander:這種方法似乎不是一個好主意。你必然會遇到編譯器實現相關的差異。如果您想以便攜和安全的方式進行序列化,請考慮使用[Boost.Serialization](http://boost.org/doc/libs/1_46_1/libs/serialization/doc/index.html)。 – 2011-04-22 11:04:45

+0

@ Space_C0wb0y我的意思不是粗魯,而是將他介紹給'Boost'就像是帶走他的彈弓(這樣他就不會傷害自己),而是給他一個大炮。 – cnicutar 2011-04-22 11:08:12

回答

1

試試這個:

fp->read(&this->length,sizeof(this->length)); 

(char *)this->length意味着:

  • 得到一些號碼,你只是做了
  • 寫入到存儲位置
  • 希望最好的
0

如果讀取成功readlong返回true。

class mhead 
{ 
    public: 
    long length; 

    bool readlong(std::istream &is)  
    { 
     is.read(reinterpret_cast<char *>(&this->length), sizeof(long)); 
     return (is.gcount() == sizeof(long)) 
    }; 
} 

或(我認爲這一個):

istream & operator >> (istream &is, mhead &_arg) 
{ 
    long temp = 0; 
    is.read(reinterpret_cast<char *>(&temp), sizeof(long)); 
    if (is.gcount() == sizeof(long)) 
    _arg.length = temp; 
    return is; 
}