例如,我有一个包含以下内容的文件:
Hello John Smith
Hello Jack Brown
OK I love you
请注意,每个句子都有一些前导空格。我想使用std::fstream
逐行读取它们,并希望删除前导空格,但保留句子中单词之间的空格。
我想要的输出应该如下:
Hello John Smith
Hello Jack Brown
OK I love you
我还发现this post为我的问题提供了许多琐碎的方法。但是,我认为它们在现代C ++方面都不是优雅的。还有更优雅的手段吗?
答案 0 :(得分:4)
std::ifstream file("input.txt");
std::string line;
while(std::getline(file,line))
{
auto isspace = [](unsigned char ch) { return std::isspace(ch); };
//find the first non-space character
auto it = std::find_if_not(line.begin(), line.end(), isspace);
line.erase(line.begin(), it); //erase all till the first non-space
std::cout << line << "\n";
}
请注意,我们可以将std::isspace
作为第三个参数传递给std::find_if_not
,但是有overloads of std::isspace
会导致编译错误 - 要修复此问题,您可以使用强制转换,但是:
auto it = std::find_if_not(line.begin(),
line.end(),
static_cast<int(*)(int)>(std::isspace));
看起来很难看。但由于强制转换中的函数类型,编译器能够找出您打算在代码中使用的which overload。
答案 1 :(得分:4)
作为纳瓦兹答案的补充:值得指出的是
Boost有一个String_Algo库,(还有很多其他的
像trim
这样的函数,它们将简化代码
很多。如果您正在进行任何文本处理,那么您
不能或不想使用Boost,你应该实现一些东西
类似于你的工具包(例如一个函数)
MyUtils :: trim,基于Nawaz的算法。
最后,如果你有一天需要处理UTF-8输入,那么你 应该看看ICU。