是否可以使用 std::string 进行 read()
Is it possible to use an std::string for read()?
是否可以使用 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)读取时将起作用。
- 通过递归进行因子分解
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用libgit2、c++进行pull
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何使用模板函数的函数签名进行SFINAE
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 将模板化的类型与C++中的某些类/类型进行比较
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 对字符串进行位操作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 我们需要对一个只有read方法的类进行线程安全设计吗
- 是否可以使用 std::string 进行 read()
- 使用select()、read()、write()进行I/O多路复用
- 有没有办法验证 read() 方法是否对文件进行了完美的读取
- 对指针向量进行排序一次,然后崩溃并"unable to read memory"