2017-02-17 3 views
0

私はstd :: string * ptrをstd :: string :: operator >>でC++に割り当てたいと思います。C++でstd :: istream経由で文字列オブジェクトを割り当てる

私は以下のクラスを持っています。

The first form (1) returns a string object with a copy of the current contents of the stream. 
The second form (2) sets str as the contents of the stream, discarding any previous contents. 

は、私が "./dump" の内容を確認し、 "./file" と同じです:

class A{ 
public: 
    A(){ 
     ptr = new std::string(); 
    } 
    A(std::string& file){ 
     ptr = new std::string(); 
     std::ifstream ifs(file); 
     std::stringstream ss; 
     ss << ifs.rdbuf(); 
     *ptr=ss.str(); 
     ifs.close(); 
    } 

    ~A(){ 
     delete ptr; 
    } 

    void output(std::ostream& stream) const{ 
     stream << *ptr; 
    } 

    void input(std::istream& stream) const{ 
     stream >> *ptr; 
    } 

private: 
    std::string *ptr; 
}; 

int main(void){ 
    std::string file="./file"; 
    std::string dfile="./dump"; 
    std::ofstream ofs(file); 
    A a(file); 
    a.output(ofs); 

    std::ifstream ifs(dfile); 
    A b(); 
    b.input(ifs); 
    return 0; 
} 

は、以下のテキストが含まれている "./file" とします。 はしかし、私は(「ダンプ./」)b.inputから(Bの*のPTR)を取得文字列オブジェクトは、私は全体のテキストを取得するにはどうすればよいだけ

The 

あるスペースでdelimiteredだけの小さな文字列、ありますか? ありがとう

+1

危険! 'A'は3つのルールに違反します。 – aschepler

答えて

1

stream >> *ptr;は、空白で区切られた単一の単語を読み取ります。

、行全体を読んでstd::getlineを使用するには:

std::getline(stream, *ptr); 

も(実際には、現在の状態であなたのクラスがメモリリークが発生し、二重の原因になります動的に文字列を割り当てるにはポイントがありませんのでご注意します@ascheplerがコメント内で指摘するように、コピーされた場合は削除されます)。メンバはプレーンstd::string str;です。

+0

getline()を繰り返すべきですか? – mallea

+0

複数の行を読みたい場合は、yesを入力します。ファイル全体を文字列に読み込む場合は、次のQ&Aを参照してください。http://stackoverflow.com/q/2602013/3425536 – emlai

関連する問題