Zat*_*t42 8 c++ sockets stdstring
是否可以将std :: string用于read()?
示例:
std::string data;
read(fd, data, 42);
Run Code Online (Sandbox Code Playgroud)
Normaly,我们必须使用char*但是可以直接使用std :: string吗?(我更喜欢不创建char*来存储结果)
谢谢
好吧,你需要以char*
某种方式创建,因为这是函数所需要的.(顺便说一下:你说的是Posix功能
read
,不是你,不是std::istream::read
吗?)问题不在于char*
,它是char*
指向的点(我怀疑你的意思是什么).
这里最简单和通常的解决方案是使用本地数组:
char buffer[43];
int len = read(fd, buffer, 42);
if ( len < 0 ) {
// read error...
} else if ( len == 0 ) {
// eof...
} else {
std::string data(buffer, len);
}
Run Code Online (Sandbox Code Playgroud)
std::string
但是,如果你想直接捕获到一个,这是可能的(虽然不一定是个好主意):
std::string data;
data.resize( 42 );
int len = read( fd, &data[0], data.size() );
// error handling as above...
data.resize( len ); // If no error...
Run Code Online (Sandbox Code Playgroud)
这样可以避免复制,但坦率地说......与实际读取和字符串中内存分配所需的时间相比,副本无关紧要.这也有(可能是可以忽略的)缺点,结果字符串具有42字节的实际缓冲区(向上舍入到任何值),而不仅仅是实际读取的字符所需的最小值.
(并且由于人们有时提出这个问题,关于记忆的连续性std:;string
:这是十年或更久以前的问题.原始规范std::string
被设计为允许非连续的实现,沿着当时流行的方式rope
在实践中,没有实现者认为这是有用的,并且人们确实开始假设连续性.此时,标准委员会决定将标准与现有实践保持一致,并且要求连续性.所以...没有实现从来没有考虑到C++ 11中的要求,连续的,没有未来的实现会放弃连续性.)