为什么std :: fstream使用char *?

时间:2013-03-12 05:26:44

标签: c++ vector binaryfiles

我正在编写一个小程序,它以16字节为一组从二进制文件中读取文件中的字节(请不要问为什么),修改它们,然后将它们写入另一个文件。

fstream::read函数读入char *缓冲区,我最初将其传递给一个如下所示的函数:

char* modify (char block[16], std::string key)

修改是在block上完成的,然后返回。在漫游SO的帖子时,我意识到使用std::vector<char>可能是个更好的主意。我接下来担心的是如何将char *转换为std::vector<char>。再次SO gave me an answer

但是现在我想知道的是:如果使用std::vector<char>代替char*这样一个好主意,为什么fstream函数根本使用char*

此外,首先将char*fstream转换为std::vector<char>是个好主意吗?

编辑:我现在意识到,由于fstream::read用于直接将数据写入对象,因此char *是必需的。我现在必须修改我的问题。首先,为什么fstream::read没有重载函数?其次,在我写过的程序中,哪个是更好的选择?

2 个答案:

答案 0 :(得分:1)

fstream()函数允许您使用char*,因此您可以将它们指向任意预分配的缓冲区。可以调整std::vector<char>的大小以提供适当的缓冲区,但它将在堆上,并且涉及分配成本。有时您也可能想要将数据读取或写入内存中的特定位置 - 即使在共享内存中 - 而不是接受vector碰巧分配的任何堆内存。此外,您可能希望在没有包含fstream标题的情况下使用vector ...能够避免不必要的包含很好,因为它会减少编译时间。

由于缓冲区的大小始终为16个字节,因此最好将它们分配为char [16]个数据成员在适当的拥有对象(如果存在)或堆栈(即某个函数的局部变量)上。

当替代方法是堆分配时,

vector<>更有用 - 无论是因为编译时大小未知,还是特别大,或者您希望更灵活地控制内存生命周期。当你特别想要一些其他的向量功能时,它也很有用,比如能够改变后面的元素数量,对字节进行排序等等 - 你似乎不太可能想做任何这样的事情,所以一个向量提出问题在阅读你的代码的人的心中,关于你将做什么没有好的目的。尽管如此,char[16]vector的选择(根据您的规定要求)更多地是品味而非客观利益。

答案 1 :(得分:1)

要将它与矢量一起使用,请不要将指针传递给矢量。相反,将指针传递给矢量内容:

vector<char> v(size);
stream.read(&v[0], size);