使用可能的 '\n' 符号从 istream 中读取
Read from istream with possible '\n' symbols
我需要从istream
中读取一些字符串,其中有两种类型:
" strings with leading and trailing spaces "
应该看起来像 "strings with leading and trailing spaces"
(只修剪前导和尾随空格,保留其中的内容)
" 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;
}
第一个结果:>strings with leading and trailing spaces<
第二个结果:>John Doe <
我需要从istream
中读取一些字符串,其中有两种类型:
" strings with leading and trailing spaces "
应该看起来像"strings with leading and trailing spaces"
(只修剪前导和尾随空格,保留其中的内容)" 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;
}
第一个结果:>strings with leading and trailing spaces<
第二个结果:>John Doe <