我正在编写一个小程序,它以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
没有重载函数?其次,在我写过的程序中,哪个是更好的选择?
答案 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);