是否有可能使用读取的std :: string()?(Is it possible to use a

2019-09-16 12:06发布

是否有可能使用读取的std :: string()?

例如:

std::string data;

read(fd, data, 42);

Normaly,我们必须使用的char *,但它可以直接使用的std :: string? (我宁愿不创建一个char *店面结果)

谢谢

Answer 1:

那么,你就需要创建一个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被设计expressedly允许非连续实现,沿着当时流行的线rope类。在实践中,没有实现者发现这是有用的,人们也开始假设连续性。在这一点上,标准委员会决定将对准与现有的实施标准,并要求连续性。因此, ......没有实现从来没有连续的,没有前途的实施将放弃连续性,考虑到C ++ 11的要求。)



Answer 2:

如果读取功能需要一个char *,则没有。 因为它首先被调整大小,你可以只要使用CHAR的一个std ::向量的第一个元素的地址。 我不认为老(前C ++ 11)弦保证的广告有连续的内存,否则你可以做字符串类似的东西。



Answer 3:

不,你不能,你不应该。 通常,的std :: string实现内部存储其他信息,例如所分配的存储器的尺寸和实际的字符串的长度。 C ++文档明确指出,通过修改返回值c_str()data()的结果中未定义的行为。



Answer 4:

不是,但

std::string data;
cin >> data;

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



Answer 5:

因为阅读()是用于输入的原始数据,的std :: string其实是一个不错的选择,因为的std :: string处理文本。 的std ::矢量似乎是一个正确的选择来处理原始数据。



Answer 6:

从字符串库使用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的)阅读时会工作。



文章来源: Is it possible to use an std::string for read()?