【问题标题】:Copy vector struct to file using ostream_iterator and copy使用 ostream_iterator 将向量结构复制到文件并复制
【发布时间】:2013-07-31 20:54:44
【问题描述】:

在对矢量进行必要的更改后,我目前正尝试将矢量复制到新的文本文件中。我可以很好地构建项目,但它给了我不明白的奇怪错误。谁能帮我解决这个问题?

我的结构

class AccDetails {
public:
    string username;
    string name;
    string topicid;
    string testid;
};

给我错误的代码

vector<AccDetails>accInfo;
ofstream temp ("temp.txt");
ostream_iterator<AccDetails>temp_itr(temp,"\n");
copy(accInfo.begin(),accInfo.end(),temp_itr); 

有一大堆错误行,但我认为这应该是重要的两行:

【问题讨论】:

    标签: c++ vector struct iterator ostream


    【解决方案1】:

    您需要为AccDetails 重载operator&lt;&lt;。这就是ostream_iterator 内部调用的内容。

    类似这样的:

    std::ostream& operator<<(std::ostream& stream, const AccDetails& obj)
    {   
        // insert objects fields in the stream one by one along with some
        // description and formatting:
    
        stream << "User Name: " << obj.username << '\n'
               << "Real Name: " << obj.name << '\n'
               << obj.topicid << ' ' << obj.testid << '\n';
    
        return stream;
    }
    

    运算符将其插入的流作为第一个参数,并将对其正在流式传输的对象的常量引用作为第二个参数(这也允许传递临时AccDetails)。现在你也可以说:

    AccDetails acc;
    std::cout << acc;
    

    如果操作员需要访问AccDetail 的私有字段,则需要声明为friend

    如果您不熟悉运算符重载,建议您阅读this SO thread

    希望对您有所帮助。

    【讨论】:

    • 谢谢。我现在明白了^^
    • @jrok 这会编译吗?
    • @P0W 不,因为我写的是 istream 而不是 ostream :) 谢谢提醒。
    【解决方案2】:

    如 jrok 所说,重载后可以有这个:

    class AccDetails 
    {
    
        std::string username;
        std::string name;
        std::string topicid;
        std::string testid;
    
        friend std::ostream& operator<<(std::ostream&, const AccDetails&);
        friend std::istream& operator>>(std::istream& is,  AccDetails& );
    };
    
    std::ostream& operator<<(std::ostream& os, const AccDetails& acc)
    {
        os  << "User Name: " << acc.username << std::endl
               << "Name: " << acc.name << std::endl
               << acc.topicid << ' ' << acc.testid << std::endl;
        return os;
    }
    
    std::istream& operator>>(std::istream& is,  AccDetails& acc)
    {   
        is >> acc.username >>acc.name >> acc.topicid >> acc.testid ;
        return is;
    }
    
    
    int main()
    {
    
    std::vector<AccDetails>accInfo;
    
    std::copy(std::istream_iterator<AccDetails>(std::cin),
        std::istream_iterator<AccDetails>(),std::back_inserter(accInfo) ); 
    
    std::ofstream temp("temp.txt",std::ios::out);
    std::ostream_iterator<AccDetails>temp_itr(temp,"\n");
    std::copy(accInfo.begin(),accInfo.end(),temp_itr); 
    
    }
    

    【讨论】:

    • 请注意,在 OP 的代码中,AccDetails 字段是公开的,因此流操作符无需成为好友。
    • @juanchopanza 哦,是的,谢谢,反正上面 jrok 的回答已经被接受了 :)
    猜你喜欢
    • 2017-04-03
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多