从istream读取可能的'\ n'符号

时间:2018-03-10 18:41:41

标签: c++ istream

我需要从istream读取一些字符串,其中有两种类型:

  1. " strings with leading and trailing spaces "应该看起来像"strings with leading and trailing spaces"(只修剪前导和尾随空格,保留其中的内容)
  2. " John Doe \n Mary Smith"。在这里我需要a)只读'\n'和b)删除前导空格,同时保留尾随空格,这样我得到的字符串是"John Doe "(请注意尾随空格仍在那里)。 / LI>

    我对如何阅读该行并了解其中是否有更多'\n'感到困惑。

2 个答案:

答案 0 :(得分:1)

如果您在文本模式下打开流或使用基于文本的提取器,则无法看到行结尾。

要执行此操作,您必须以二进制模式打开流,然后使用read()而不是readline或>>进行读取。运算符。

答案 1 :(得分:1)

您可以使用std::getline读取字符串,如果是多行,则留下尾随空格,如果没有,也删除它们:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    //std::istringstream iss("   strings with leading and    trailing spaces   ");
    std::istringstream iss("  John Doe    \n  Mary Smith");

    std::string lines[2];
    size_t i = 0;
    bool keep_trailing_spaces = false;
    while (std::getline(iss, lines[i++], '\n'))
    {
        if (i > 1)
        {
            keep_trailing_spaces = true;
            break;
        }
    }

    if (i > 1)
    {
        size_t start = lines[0].find_first_not_of(' ');
        size_t count = keep_trailing_spaces ? std::string::npos : lines[0].find_last_not_of(' ') - start + 1;

        std::cout << ">" << lines[0].substr(start, count) << "<" << std::endl;
    }

    return 0;
}

https://ideone.com/tLBiSb

第一个结果:>strings with leading and trailing spaces<

第二个结果:>John Doe <