字符串流的大小

49

有没有直接计算stringstream内部字符串大小的方法?

这里,str() 返回一个副本,然后获取字符串的大小。

std::stringstream oss("String");
oss.str().size();

字长对于流没有意义,应该是流中的字节数吧? - Mayur
2个回答

63

有如下内容:

std::stringstream oss("Foo");
oss.seekg(0, ios::end);
int size = oss.tellg();

现在,size将包含字符串的大小(以字节为单位)。

编辑:

这也是一个好主意,可以放在上面的片段后面,因为它会把内部指针放回到字符串的开头。

oss.seekg(0, ios::beg);

有趣。我想知道这是否总是会显示与写指针等效的相同结果。 - Steve Townsend
2
如果您使用写指针,您是否仍需要寻找结尾?它不会一直在结尾吗? - Ferruccio
1
Gcc 4.4似乎不喜欢这个,它会设置流的failbit。 - Ramon Zarazua B.
9
一些简单的可用性会很不错。并不是说解决方案不容易,但它仍然相当丑陋。有点难以相信没有一个size()便利函数。 :) - laloumen
3
更加严肃的话题,重要的是要注意指针的放置和获取。也就是说,一个示例使用seekg()和tellg(),而另一个示例使用seekp()和tellp()。两者都可以工作,但不要混淆它们。 - laloumen
18
还有一件事:无论哪个指针被打乱了,都应该将其放回原来的位置,不一定是开头。一个无副作用(no-side-effect)的实现应该在改变指针之前先获取指针位置:int loc0 = oss.tellg();,然后在之后将其重置:oss.seekg(loc0, ios::beg); - laloumen

34
std::stringstream oss("String");
oss.seekp(0, ios::end);
stringstream::pos_type offset = oss.tellp();

这是针对写指针的说明,但在 Visual C++ v10 上读指针的结果也是相同的。


在宽字符流中,字节数将是偏移量乘以wchat_t的大小吗? - Mayur
1
@Mayur 不,tellp() 返回的是字节数,而不是字符数。如果你想要字符数,你需要做相反的操作(offset / sizeof(wchar_t))。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接