从输出流中删除输入
Remove input from an output stream
我想使用 std::copy
和 std::ostream_iterator
将vector
中的字符串打印出来,作为括号之间的逗号分隔列表。所以我必须处理在最后一个元素之后删除", "
的问题。
我试过这个:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
int main() {
std::vector<std::string> v;
v.push_back("a");
v.push_back("b");
v.push_back("c");
std::stringstream os;
os << '(';
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, ", "));
os.seekp(-2, std::ios_base::cur);
os << ')';
std::cout << os.str() << ".";
return 0;
}
输出:
(a, b, c) .
^
但是我得到的输出在右括号后有一个额外的空格字符,因为seekp
只是移动书写位置,但不会删除写入的字符。
有没有办法删除最后一个字符或编写 EOF?
一开始就
不写额外的", "
怎么样......
if(!v.empty())
{
std::copy(v.begin(), v.end()-1, std::ostream_iterator<std::string>(os, ", "));
os << v.back();
}
使用seekp
时,您不只是删除字符,而是在设置当前光标。 您的下一条语句将覆盖该字符,但缓冲区中仍然有后续字符。 有几种方法可以解决这个问题:
不要输出完整模式:
std::ostringstream os;
os << '(';
std::copy(v.begin(), v.end() - 1, std::ostream_iterator<std::string>(os, ", "));
if (v.size() > 1) // or (!v.empty())
os << *(v.end() - 1) << ')';
这将打印除矢量最后一个字符之外的所有字符(将完全避免额外的","组合)。
或者,您可以手动重置缓冲区:
std::ostringstream os;
os << '(';
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(os, ", "));
std::string t = os.str();
t.resize(t.size() - 2);
os.str() = t;
os << ')';
或者,也许是一个更统一的解决方案(如果你不反对不使用copy):
std::ostringstream os;
os << '(';
if (v.size() > 1) // or (!v.empty())
os << v.front();
std::for_each(v.begin() + 1, v.end(), [&](const std::string& s)
{
os << ", " << s;
});
os << ")";
相关文章:
- C++如何通过用户输入删除列表元素
- 如何在输入新内容 c++ 之前删除文件中的所有内容
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- C ++,如何从控制台中输入的字符串中删除字母?
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 从输入中删除重复项,而不使用任何数据结构
- C++ 链表:它不会删除第一个输入
- 如何删除用户输入字符串末尾的空字符?
- 删除函数环境中C++输入 R 对象
- 为什么输入流从第二行输入中删除一些字符
- WIN32 RAW键盘输入删除自动点
- 从控制台获取的每 30 秒输入后,从 Vector 中逐个删除数字
- 如何删除输入的字母/字符串或任何输入
- 如何将用户输入添加到数组或删除?C
- 从输出流中删除输入
- MFC:阻止线程删除指向其 ControllingFunction 的输入指针
- 尝试从用户C++输入的代码中删除注释
- 从C++中的用户输入中删除符号
- c++ 11 -从流中删除输入
- 从用户输入中删除引用结构/类成员变量