在C ++中通过std :: istream分配字符串对象

时间:2017-02-17 13:13:20

标签: string c++11

我想通过std :: string :: operator>>分配std :: string * ptr。在c ++中。

我下面有一节课。

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”包含以下文字:

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”相同。 但是,我从b.input(“./ dump”)得到的字符串对象(b's * ptr)只是一个在空格处分隔的小字符串,只是

The

如何获取全文? 谢谢

1 个答案:

答案 0 :(得分:1)

stream >> *ptr;读取一个以空格分隔的单词。

要阅读整行,请使用std::getline

std::getline(stream, *ptr);

另请注意,动态分配字符串没有意义(实际上,在当前状态下,如果复制,您的类将泄漏内存并导致双重删除,如@aschepler在评论中所指出的那样)。该成员可以是普通std::string str;