为什么std::fstream使用char*

Why does std::fstream use char*?

本文关键字:char 使用 fstream std 为什么      更新时间:2023-10-16

我正在写一个小程序,从二进制文件中以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(基于您声明的需求)似乎更多的是品味问题,而不是客观利益问题。