如何使用条件擦除一行?

时间:2012-01-04 09:04:49

标签: c++ stl

我有一个字符串( ifstream ),下一行:

foo
foo+..
foo

并且,我想知道如何获得有符号 + 的行并删除剩余的行:

foo+..

将流转换为字符串,我使用:

string stream((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

4 个答案:

答案 0 :(得分:4)

这个替代解决方案怎么样:

#include <fstream>
#include <iostream>
#include <string> 
#include <vector>
#include <algorithm>

using namespace std;

bool HasNoPlus(const string &value)  
{ 
    return value.find('+') == string::npos; 
}

int main(int argc, char* argv[])   
{
    ifstream ifs("d:\\temp\\test.txt");

    vector<string> out;

    remove_copy_if(istream_iterator<string>(ifs), 
                   istream_iterator<string>(), 
                   back_inserter(out), 
                   HasNoPlus);

    return 0;
}

答案 1 :(得分:4)

如果您不需要中间字符串,可以使用标准算法从ifstream直接复制到新的ofstream

#include <algorithm>
#include <fstream>
#include <iterator>
#include <string>

struct has_no_plus {
    bool operator()(const std::string& str)
    {
        if (str.find('+') != std::string::npos)
            return false;
        else
            return true;
    }
};

int main()
{
    std::ifstream ifs("file.txt");
    std::ofstream ofs("copy.txt");

    std::remove_copy_if(std::istream_iterator<std::string>(ifs),
                        std::istream_iterator<std::string>(),
                        std::ostream_iterator<std::string>(ofs, "\n"),
                        has_no_plus());

    // or alternatively, in C++11:

    std::copy_if(std::istream_iterator<std::string>(ifs),
                 std::istream_iterator<std::string>(),
                 std::ostream_iterator<std::string>(ofs, "\n"),
                 [](const std::string& str)
                 {
                     return str.find('+') != str.npos;
                 });
}

答案 2 :(得分:2)

int pos_plus = str.find('+');
int pos_beg = str.find_last_of('\n',pos_plus);
int pos_end = str.find_first_of('\n',pos_plus);
if(pos_beg == pos_plus) pos_beg = 0;
if(pos_end == pos_plus) pos_end = str.size();
str.erase(pos_beg,pos_end-pos_beg);

答案 3 :(得分:0)

要过滤来自ifstream的输入(如评论中所述),请使用新的ostringstream 从ifstream(getline)读取每一行并检查它是否通过了过滤条件 如果它通过,将它附加到ostringstream 从ostringstream获取字符串时,您将获得过滤后的字符串。