如何删除前导空格但在C ++`ifstream`中保留中间空格?

时间:2014-07-01 14:52:40

标签: c++ character-encoding io iostream fstream

例如,我有一个包含以下内容的文件:

     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 ++方面都不是优雅的。还有更优雅的手段吗?

2 个答案:

答案 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。