3

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

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

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

修改完成block,然后返回。在漫游 SO 的帖子时,我意识到使用std::vector<char>. 我的下一个担心是如何将 a 转换char *std::vector<char>. 再一次,SO给了我一个答案

但现在我想知道的是:如果使用std::vector<char>而不是这样一个好主意char*,那么为什么要使用这些fstream函数char*呢?

char*另外,首先将fromfstream转换为好主意std::vector<char>吗?

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

4

2 回答 2

1

要将其与向量一起使用,请不要将指针传递给向量。相反,传递一个指向向量内容的指针:

vector<char> v(size);
stream.read(&v[0], size);
于 2013-03-12T05:41:13.567 回答
1

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

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

vector<>当替代方案是堆分配时更有用 - 无论是因为大小在编译时未知,还是特别大,或者您希望更灵活地控制内存寿命。当您特别想要一些其他矢量功能时,它也很有用,例如能够在之后更改元素数量、对字节进行排序等 - 您似乎不太可能想要这样做,因此矢量会引发问题在阅读您的代码的人的脑海中,您会无缘无故地做什么。尽管如此,char[16]vs的选择vector似乎(根据您声明的要求)更多的是品味问题,而不是客观利益。

于 2013-03-12T05:36:45.343 回答