是否可以使用 std::string 进行 read()

Is it possible to use an std::string for read()?

本文关键字:read 进行 string std 是否 可以使      更新时间:2023-10-16

是否可以使用 std::string for read() ?

例:

std::string data;
read(fd, data, 42);

通常,我们必须使用 char*,但可以直接使用 std::string 吗?(我宁愿不要创建字符*来存储结果)

谢谢的

好吧,您需要以某种方式创建一个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);
}

如果你想直接捕获到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...

这避免了复制,但坦率地说...副本微不足道与实际读取和字符串中内存的分配。 这也有(可能可忽略不计)结果字符串具有实际缓冲区的缺点42 字节(四舍五入到任何字节),而不仅仅是最小值对于实际阅读的字符是必需的。

(由于人们有时会提出这个问题,关于std:;string内存的连续性:这是一个十个或更多的问题多年前。 设计的std::string原始规格明确表示允许非连续实现,如当时流行的rope类。 在实践中,没有实现者发现这一点有用,人们确实开始假设连续性。 在这一点上,标准委员会决定使标准与现有标准保持一致练习,并要求连续。 所以。。。没有实施从未没有是连续的,未来的实施不会放弃连续性,鉴于 C++11.) 中的要求。

不,你不能也不应该。 通常,std::string 实现在内部存储其他信息,例如分配的内存大小和实际字符串的长度。C++文档明确指出,修改c_str()data()返回的值会导致未定义的行为。

如果读取函数需要字符 *,则不需要。 您可以使用 char 的 std::vector 的第一个元素的地址,只要它首先被调整大小即可。 我不认为旧的(C++11)之前的字符串可以保证具有连续的内存,否则您可以对字符串做类似的事情。

不,但是

std::string data;
cin >> data;

工作得很好。 如果你真的想要read(2)的行为,那么你需要分配和管理你自己的字符缓冲区。

因为 read() 用于原始数据输入,std::string 实际上是一个糟糕的选择,因为 std::string 处理文本。 std::vector 似乎是处理原始数据的正确选择。

使用字符串库中的 std::getline - 请参阅 cplusplus.com - 可以从流中读取并直接写入字符串对象。 示例(再次从 cplusplus.com 中撕下 - 谷歌上第一次点击 getline):

int main () {
  string str;
  cout << "Please enter full name: ";
  getline (cin,str);
  cout << "Thank you, " << str << ".n";
}

因此,从标准输入(cin)和文件(ifstream)读取时将起作用。