【问题标题】:Not working string comparison between vector element and a txt file line向量元素和txt文件行之间的字符串比较不起作用
【发布时间】:2012-03-21 07:04:00
【问题描述】:
while (file.good())
{
    for (vector <string>::iterator i = v1.begin(); i != v1.end();)
    {
        getline(file, sTmp);
        if (sTmp != *i)
        {
            v2.push_back(sTmp);
        }
        ++i;
    }
}

我已经用当前目录中的文件名填充了 v1,只想插入与 v1 元素不匹配的 txt 文件中的名称(v1 和 v2 是字符串向量)。上面的代码看起来合乎逻辑,但不起作用。我从 v2 中的 txt 文件中获取所有文件,而不是不同的文件。

这有什么问题?

【问题讨论】:

  • @talnicolas 为什么? ==!= 工作得很好。
  • 您正在为每个元素 v1 执行 getline()。如果您想比较成对的 line from filestring from vector,您会这样做,但也许您想比较每一行与每个向量元素?
  • while (file.good()) is almost always wrong。你是从哪里学来的?
  • 从 cplusplus.com 作为标准功能来检查文件或其 eof 的完整性。
  • @1000Gbps 然后远离那个站点。它的作者不懂 C++。

标签: c++ string vector compare getline


【解决方案1】:

您的代码存在几个问题。你看到的那个是到期的 事实上,你从文件中为每个元素读取了一个新行 v1,并将该行仅与 v1 中的当前元素进行比较;你 可能想将getline 移出内部循环,某事 喜欢:

std::string line;
while ( std::getline( file, line ) ) {
    std::vector<std::string>::const_iterator pos
            = std::find( v1.begin(), v1.end(), line );
    if ( pos != v1.end() ) {
        v2.push_back( line );
    }
}

这也解决了第二个主要问题:您没有测试 在使用其结果之前调用getline 成功。 (std::ios_base::good() 可能是最没用的函数了 标准。我还没有找到一个可以调用它的案例 合适。)

【讨论】:

  • 刚刚测试了您的版本,这仅打印 v1 的元素,我需要打印不等于 v1 的 v2 元素(取自 txt 文件)。这个想法是打印来自这个 txt 文件的文件名,并忽略那些与 v1 元素相等的文件名......非常可悲:\
  • 不应该是if (pos == v1.end()) OP 想要的吗?
  • @jrok 也许吧。我不太清楚他想要什么(但你的建议实际上听起来是对的——至少比我写的要好)。
  • @jrok, if (pos == v1.end()) 给出了我的原始结果 - 通过向量打印整个 txt 文件:\
  • @1000Gbps 这意味着要么v1 为空,要么所有文件都不同。