Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从输出流中删除输入_C++_Vector_Iostream_Ostream - Fatal编程技术网

C++ 从输出流中删除输入

C++ 从输出流中删除输入,c++,vector,iostream,ostream,C++,Vector,Iostream,Ostream,我想使用std::copy和std::ostream\u迭代器将向量中的字符串打印出来,作为括号之间的分隔列表。因此,我必须处理删除最后一个元素之后的,“”的问题 我试过: 但是我得到的输出在右括号后面有一个额外的空格字符,因为seekp只移动写入位置,而不删除写入的字符 是否有办法删除最后一个字符或写入EOF?不先在末尾写入额外的“,” if(!v.empty()) { std::copy(v.begin(), v.end()-1, std::ostream_iterator<st

我想使用
std::copy
std::ostream\u迭代器
向量
中的字符串打印出来,作为括号之间的分隔列表。因此,我必须处理删除最后一个元素之后的
,“
”的问题

我试过:

但是我得到的输出在右括号后面有一个额外的空格字符,因为
seekp
只移动写入位置,而不删除写入的字符


是否有办法删除最后一个字符或写入EOF?

不先在末尾写入额外的
“,”

if(!v.empty())
{
   std::copy(v.begin(), v.end()-1, std::ostream_iterator<std::string>(os, ", "));
   os << v.back();
}
if(!v.empty())
{
std::copy(v.begin(),v.end()-1,std::ostream_迭代器(os,“,”);

os当您使用
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 1)//或(!v.empty())

操作系统您是否愿意接受其他解决方案,或者您只会选择处理流?@本杰明·林德利:我很开放,值得注意的是,此解决方案适用于
向量
,但不适用于
,我还想为其实现类似的打印功能。由于性能不是问题,我只会创建一个临时文件从
集合中提取
向量
,并重新使用
向量
打印功能。@AntonioPérez:将
v.end()-1
替换为
std::prev(v.end())
,将
v.back()
替换为
*std::prev(v.end())
,它可以很好地用于集合。但遗憾的是:)@AntonioPérez:
std::prev
是一个非常简单的函数,您可以自己实现,也可以直接内联实现逻辑。只需从
v.end()创建一个迭代器即可
,并将其减量一次。您上一个建议看起来很不错。很遗憾,我的编译器不支持C++11功能。您可以在函子中完成这项工作,也可以编写自己的循环,看起来不会有太大的不同(并且将在C++98/03中编译)。第二个建议仅适用于
stringstream
,而不适用于
ostream
。我在示例中只使用了
stringstream
,但我的实际代码涵盖了使用
ostream
@AntonioPérez的一般情况。您是指重置字符串的那一个吗?是的,这是特定于
ostringstream
。就我个人而言,我会推荐第三种方法。一般来说,我尽量避免在字符串中写入额外字符,然后在以后修复。这只会降低代码的可读性。
if(!v.empty())
{
   std::copy(v.begin(), v.end()-1, std::ostream_iterator<std::string>(os, ", "));
   os << v.back();
}
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 << ')';
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 << ")";