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

时间:2014-02-12 19:16:37

标签: c++ string system-calls

我正在使用mystr.c_str()函数来调用需要char *参数的write(),open()等系统调用。虽然因为.c_str()的性质,我认为调用read(rfd,& mystr.c_str(),mystr.lenght())是行不通的。在没有临时使用char * str的情况下实现此目的的最佳/快速方法是什么?

2 个答案:

答案 0 :(得分:2)

你不能直接写入std::string的缓冲区,因为它只会返回指向只读字符串 1 的字符串指针。考虑使用本地数组作为缓冲区。这与您在不调用未定义行为的情况下一样最佳。

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()字符串。

答案 1 :(得分:0)

这是不允许的,但对于const_cast的大多数实现,大多数大多数都会工作(使用string),尽管某些实现会非常令人惊讶副作用。

因为不允许直接写入c_str()返回的字符串,所以允许以各种方式优化字符串的实现。 string的一个特定实现我在内部使用引用计数指针进行复制(仅当字符串的大小很大时)。因此,如果你复制字符串然后非法覆盖它的内容,原始和副本都会改变。

即使您当前正在使用的string实施仍然存在此类滥用行为,它可能会在以后更改,此时程序会以奇怪的方式神奇地开始工作。