2

我是 C++ 新手。我无法将数据输出到文件。我正在使用迭代器来打印地图。print 方法接受 i,一个键值,并打印出它对应的向量。现在,当我使用 cout<< 正常输出时,这工作得非常好,但是当我尝试将相同的输出放入文件时,我的程序崩溃了。我知道它是 outfile<< 行中的 *it 导致它崩溃,因为如果我用一些随机字符串替换它,它会将它输出到文件中。另外,我知道 print 方法中的参数没有引起任何问题,因为我可以将该方法直接转移到程序的 main 函数并得到相同的错误。任何有关如何解决此问题的帮助将不胜感激,谢谢!这是发生错误的打印方法:

    public: void print(int i, vector<string> in, ostream& outfile) // print method for printing a vector and it's key
{

    sort(in.begin(), in.end()); // sort the vector alphabetically first

    vector<string>::iterator it; 

    it= unique(in.begin(), in.end()); // makes sure there are no duplicate strings

    in.resize( distance(in.begin(),it) );

    for( it = in.begin(); it != in.end(); it++ ) // iterate through it

    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
   // outfile<< i << ":" << *it<< endl; // prints to file
}
4

2 回答 2

2

您是否同时使用该cout线路?如果是这样,我想我知道它是什么。

没有大括号的for循环将执行下一条语句作为其循环体。如果您同时使用cout行和outfile行,您将打印所有内容,然后在循环之后,it将位于数组末尾的后面。然后,您尝试取消引用它并将其写入文件,这当然会失败,因为您正在取消引用无效的迭代器。

简短的回答,用大括号将语句包装在你的 for 循环中。

例如,您有以下内容(正确缩进时):

for( it = in.begin(); it != in.end(); it++ ) // iterate through it
    cout << i << ": "<< *it<<endl; 
outfile<< i << ":" << *it<< endl; // prints to file

在最后一行,it = in.end(),其中是刚刚超过向量末尾的in.end()元素。然后,您尝试访问该位置不存在(并且无效)的元素,因此它失败了。相反,您需要将其移动到循环内,该循环应为

for( it = in.begin(); it != in.end(); it++ ) // iterate through it
{
    cout << i << ": "<< *it<<endl; // and print out the key value and each string in the vector
    outfile<< i << ":" << *it<< endl; // prints to file
}
于 2013-01-27T23:09:31.523 回答
2

@slugonamission 已经给了你正确的答案,所以我只想指出你的函数实际上可以被简化并且更不容易出错。我写这个作为答案只是因为需要代码格式化,否则我会在评论中发布它:

void print(int i, vector<string> v, ostream& o)
{
    sort(begin(v), end(v));
    v.erase(unique(begin(v), end(v))); // Do this in one step, no iterator mess
    for (auto const& s : v) // Avoid manual iteration cycles if you can
    {
        o << i << ":" << s << endl;
        ...
    }
}

编辑:

正如@juanchopanza 正确指出的那样,实现相同目标的更快方法是将矢量的内容传输到关联容器中以确保唯一性。这将允许您通过以下方式传递向量const &

void print(int i, vector<string> const& v, ostream& o)
{
    unordered_set<string> c(begin(v), end(v));
    for (auto const& s : c)
    {
        o << i << ":" << s << endl;
    }
}
于 2013-01-27T23:40:56.750 回答