Как стереть строку, используя условие? - PullRequest
2 голосов
/ 04 января 2012

У меня есть строка ( ifstream ) со следующими строками:

foo
foo+..
foo

И я хотел бы знать, как получить строку, где есть символ + и удалите оставшиеся строки:

foo+..

, чтобы преобразовать поток в строку, я использую:

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

Ответы [ 4 ]

4 голосов
/ 04 января 2012

Если вам не нужна промежуточная строка, вы можете скопировать из 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;
                 });
}
4 голосов
/ 04 января 2012

Как насчет этого альтернативного решения:

#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;
}
2 голосов
/ 04 января 2012
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);
0 голосов
/ 04 января 2012

Чтобы отфильтровать входные данные из ifstream (как упомянуто в вашем комментарии), используйте новый ostringstream.
Прочитайте каждую строку из ifstream (getline) и проверьте, соответствует ли она условию фильтра.
Если он пройдет, добавьте его в поток ostring.
Когда вы возьмете строку из потока ostring, у вас будет отфильтрованная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...