将 read() 内容传递给C++字符串类型
Pass read() contents to C++ string type
我正在使用mystr.c_str()函数来调用write(),open()等需要char*参数的系统调用。虽然由于.c_str()是一个函数的性质,我想调用read(rfd,&mystr.c_str(),mystr.lenght())将不起作用。在不临时使用 char* str 的情况下实现此功能的最佳/快速方法是什么?
你不能直接写入std::string
的缓冲区,因为它只返回指向只读字符串1 的 char 指针。 请考虑使用本地数组作为缓冲区。 这与您在不调用未定义行为的情况下获得的最佳效果差不多。
const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
ssize_t chars_read = read(rfd, buffer, BUFFER_SIZE);
if (chars_read > 0) {
// To create a new string:
std::string read_string(buffer, chars_read);
// To populate an existing string:
existing_string.assign(buffer, chars_read);
}
1 至少在 C++11 之前。 在 C++11 中,使用 &some_string[0]
获取指向字符串的可变指针是安全的,但应确保不要写入 &some_string[some_string.size()]
或更远,因为这将调用 UB,因此您需要先resize()
字符串。
这是不允许的,但它主要const_cast
适用于大多数(如果不是全部)string
实现,尽管有些实现会产生非常非常令人惊讶的副作用。
因为不允许直接写入 c_str()
返回的字符串,这允许字符串的实现以各种方式进行优化。我在内部遇到的string
的一个特定实现使用引用计数指针进行副本(仅当字符串的大小很大时)。因此,如果您复制字符串,然后非法覆盖其内容,则原始和副本都会更改。
即使您当前使用的string
实现在这种滥用中幸存下来,它也可能在以后被更改,此时程序神奇地开始以奇怪的方式工作。