【问题标题】:Read from istream with possible '\n' symbols [closed]从 istream 中读取可能的 '\n' 符号 [关闭]
【发布时间】:2018-03-10 18:41:41
【问题描述】:

我需要从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' 感到困惑。

【问题讨论】:

  • 您所说的“[该行]中的 [多于]一个'\n'”是什么意思?我们是在谈论实际的换行符,还是字符“反斜杠”后跟字符“n”?因为前者没有多大意义。
  • 对于拥有 300 名代表的人提出这样的问题,我感到有些惊讶。你的代码在哪里?

标签: c++ istream


【解决方案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

第一个结果:&gt;strings with leading and trailing spaces&lt;

第二个结果:&gt;John Doe &lt;

【讨论】:

  • 我认为 OP 不是在谈论行尾,我认为它们的意思是文字文本“反斜杠后跟'n'`,因为他们正在寻找其中的一个或多个“在行”。
【解决方案2】:

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

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

【讨论】:

  • 我认为 OP 不是在谈论行尾,我认为它们的意思是文字文本“反斜杠后跟'n'`,因为他们正在寻找其中的一个或多个“在行”。
猜你喜欢
  • 2011-02-23
  • 2014-12-28
  • 1970-01-01
  • 2022-11-28
  • 2015-02-03
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多