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

Read from istream with possible '\n' symbols

我需要从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 " (请注意尾随空格仍然存在)。

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

如果您以文本模式打开流或使用基于文本的提取器,则不一定能看到行尾。

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

可以用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 <