2015-12-07 40 views
2

sgetn需要char*作为第一个参数并写入字符。它不是写一个尾随'\0'char*sgetn不会终止字符串

此行为似乎与其他时间不一致,我可以找到写入的char*。然而,它贯穿Clang,gcc和Visual Studio,所以我不能相信这是一个所有编译器都有的错误。

是否有一个原因,标准不要求跟踪到char*

[Live Example]

回答

5

因为它可以用来读取任意数据,而不仅仅是文字。

以​​函数,它需要一个char*参数,但可用于读取任意数据,包括二进制数据。从二进制文件读取时,你不希望它添加字符串终止符?

+0

等一下,这是一个'basic_streambuf'。 ['fstream :: rdbuf'](http://en.cppreference.com/w/cpp/io/basic_fstream/rdbuf)返回'basic_filebuf',我完全希望能够读取二进制数据。从'stringstream'(和相应的'basic_streambuf')读取二进制数据有什么意义? –

+0

@JonathanMee ['std :: basic_streambuf'](http://en.cppreference.com/w/cpp/io/basic_streambuf)是所有流缓冲区类的* base *类。没有什么能阻止'std :: string'包含二进制或任意数据。 –

+0

我认为你的理由和我所希望的一样好。但是,仅仅因为'string'可以包含二进制数据并不会阻止'data()'追加''\ 0''。这可能只是我感到沮丧,它花了我很长时间来确定我的char *不是被终止的事实。感谢你的回答。 –