将 read() 内容传递给C++字符串类型

Pass read() contents to C++ string type

本文关键字:C++ 字符串 类型 read      更新时间:2023-10-16

我正在使用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实现在这种滥用中幸存下来,它也可能在以后被更改,此时程序神奇地开始以奇怪的方式工作。