是否有可能使用读取的std :: string()?
例如:
std::string data;
read(fd, data, 42);
Normaly,我们必须使用的char *,但它可以直接使用的std :: string? (我宁愿不创建一个char *店面结果)
谢谢
是否有可能使用读取的std :: string()?
例如:
std::string data;
read(fd, data, 42);
Normaly,我们必须使用的char *,但它可以直接使用的std :: string? (我宁愿不创建一个char *店面结果)
谢谢
那么,你就需要创建一个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的要求。)
如果读取功能需要一个char *,则没有。 因为它首先被调整大小,你可以只要使用CHAR的一个std ::向量的第一个元素的地址。 我不认为老(前C ++ 11)弦保证的广告有连续的内存,否则你可以做字符串类似的东西。
不,你不能,你不应该。 通常,的std :: string实现内部存储其他信息,例如所分配的存储器的尺寸和实际的字符串的长度。 C ++文档明确指出,通过修改返回值c_str()
或data()
的结果中未定义的行为。
不是,但
std::string data;
cin >> data;
工作得很好。 如果你真的想要的行为read(2)
那么你就需要分配和管理自己的字符缓冲区。
因为阅读()是用于输入的原始数据,的std :: string其实是一个不错的选择,因为的std :: string处理文本。 的std ::矢量似乎是一个正确的选择来处理原始数据。
从字符串库使用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的)阅读时会工作。