| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3132 人关注过本帖
标题:关于 std::ends
取消只看楼主 加入收藏
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9011
专家分:53957
注 册:2011-1-18
结帖率:91.67%
收藏
已结贴  问题点数:20 回复次数:1 
关于 std::ends
连续好几天看你们在讨论 std::ends,似乎你们都明白它是输出'\0',后面你们的争论我就看不懂了,也没细看。

在上世纪C++98之前,<strstream>中有个std::ostrstream。现在已经被<sstream>中的std::ostringstream给替换了。
std::ostrstream s;
s << "abc";
char* p = s.str(); // 冻结缓冲区(因为返回的是一个指针),并返回 'a','b','c'(注意尾部没有'\0') 这样一个序列的起始地址.
// std::cout << p; 不能这么做,因为 p 不是指向以null结尾的字符串(可以这么做 std::cout.write(s.str(), s.pcount()))
// 正确的做法是解冻后,尾部加个'\0',让它成为以null结尾的字符串
s.freeze(false);
s << ends;
std::cout << s.str(); // 这时是正确的,返回序列 'a','b','c','\0'
s.freeze(false); // 别忘了解冻,否则会内存泄漏
简而言之,std::ostrstream::str() 并不主动在缓冲区添加'\0',所以要想它返回一个null结尾的字符串,用户得自己向缓冲区输出std::ends
程序代码:
#include <iostream>
#include <strstream>
int main()
{
    std::ostrstream s; // 动态缓冲区
    s << “abc" << std::ends;
    std::cout << s.str() << '\n';
    s.freeze(false);
}

C++98时新的 std::ostringstream 就没这些破事,不需要冻结缓冲区,也不需要std::ends
程序代码:
#include <sstream>
#include <iostream>
int main()
{
    std::ostringstream s;
    s << "abc"; // 不需要,也不应该添加 std::ends
    std::cout << s.str() << '\n';
    // 不需要冻结缓冲区,因为 std::ostringstream::str() 返回的是一个std::string类型的缓冲区副本
}

-------
我又看了一下你们的讨论,似乎不是在纠结 std::ends,而是 一个说putchar('\0')是可以的,一个说putchar('\0')是没意义的。
收到的鲜花
  • 叶纤2020-03-18 12:33 送鲜花  20朵   附言:光明使者
搜索更多相关主题的帖子: 缓冲区 std str ends 返回 
2020-03-18 09:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9011
专家分:53957
注 册:2011-1-18
收藏
得分:0 
以下是引用叶纤在2020-3-18 12:24:29的发言:

那std :: basic_ostream。和cout,cerr是什么关系啊,
算了,我有时间的时候认真看看io的知识点,估计就能找到了
cout、clog、cerr 都是 std::basic_ostream<char> 类型的变量。

cout 对应于C语言的stdout带缓存
clog 对应于C语言的stderr带缓存
cerr 对应于C语言的stderr不带缓存
2020-03-18 12:54
快速回复:关于 std::ends
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024086 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved