是否可以将std :: string用于read()?

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*来存储结果)

谢谢

Jam*_*nze 9

好吧,你需要以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中的要求,连续的,没有未来的实现会放弃连续性.)