为什么std::fstream使用char*
Why does std::fstream use char*?
我正在写一个小程序,从二进制文件中以16字节为一组读取字节(请不要问为什么),修改它们,然后将它们写入另一个文件。
fstream::read
函数读入char *
缓冲区,我最初将其传递给一个函数,看起来像这样:
char* modify (char block[16], std::string key)
对block
进行了修改,然后返回。在漫游SO的帖子时,我意识到使用std::vector<char>
可能是一个更好的主意。我的下一个担心是如何将char *
转换为std::vector<char>
。又一次,SO给了我一个答案。
但现在我想知道的是:如果使用std::vector<char>
而不是char*
是一个好主意,为什么fstream
函数使用char*
呢?
另外,首先将char*
从fstream
转换为std::vector<char>
是一个好主意吗?
编辑:我现在意识到,由于fstream::read
是用来直接向对象写入数据,char *
是必要的。我现在必须修改一下我的问题。首先,为什么fstream::read
没有重载函数?其次,在我写过的项目中,哪个是更好的选择?
如果要与vector一起使用,则不要传递指向vector的指针。相反,传递一个指向vector content的指针:
vector<char> v(size);
stream.read(&v[0], size);
fstream()
函数允许您使用char*
s,因此您可以将它们指向任意预分配的缓冲区。可以调整std::vector<char>
的大小以提供适当的缓冲区,但它将位于堆上,这涉及到分配成本。有时,您也可能希望将数据读写到内存中的特定位置(甚至在共享内存中),而不是接受vector
碰巧分配的堆内存。此外,您可能希望使用fstream
而不包含vector
头…能够避免不必要的包含是很好的,因为它减少了编译时间。
由于缓冲区的大小总是16字节,最好将它们分配为char [16]
数据成员,在适当的拥有对象中(如果存在的话),或者在堆栈中(即某些函数的局部变量)。
vector<>
在选择堆分配时更有用—无论是因为在编译时大小未知,还是特别大,或者您希望更灵活地控制内存生命周期。当你特别想要一些其他向量功能时,它也很有用,比如事后改变元素数量的能力,对字节进行排序等——你似乎不太可能想要做任何这些事情,所以一个向量会在阅读你代码的人的脑海中提出问题,你会做什么没有好的目的。尽管如此,选择char[16]
还是vector
(基于您声明的需求)似乎更多的是品味问题,而不是客观利益问题。
- 使用strcpy将char数组的元素复制到另一个数组
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 使用char类型将decimal转换为string,将string转换为decimal
- 使用指针初始化 char 数组或字符串 C++
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- C ++如何在使用"tolower"时将char转换为int
- 使用 char* 存储数据和产生的错误
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 使用动态分配将 char* 复制到另一个字符**
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- <char> 使用 int 值初始化向量
- 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存
- 错误:<char>使用 getline 时basic_istream为非标量类型 cxx11::string
- <char> 使用字符串文本初始化向量
- 警告:'void checkGlError(const char*)'使用但从未定义
- 如何让 char[] 使用 std::map