我有一个字符串( ifstream ),下一行:
foo
foo+..
foo
并且,我想知道如何获得有符号 + 的行并删除剩余的行:
foo+..
将流转换为字符串,我使用:
string stream((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
答案 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获取字符串时,您将获得过滤后的字符串。