0

校园里大多数精明的学生都告诉过,二进制文件 i/o 总是比格式化 i/o 快。经过一番谷歌搜索,我确定完成二进制 i/o 的最有效方法不是直接从文件中流式传输每个值,而是通过读取大块数据,如 4k 或 8k 块,然后从该缓冲区中解析数据。我的问题是,假设我使用 fstream 从文件中抓取一大块数据并将其存储到 8192 字节的 char 数组中。现在假设它有一个大约 30 字节的标头,然后之后的所有数据就像每个 72 字节的结构。这将在最后留下 56 个字节的不完整数据,我无法读入结构。我该如何处理以最大限度地提高效率(是的,使用 c++ 流,请不要在这里抱怨 c++ 流,我 已经听到了几十个关于它的论点。这完全是关于二进制 i/o 的问题,而不是 i/o 特定介质的功效)。我是否只是将最后的 56 个字节未使用,或者我是否尝试将下一个缓冲区的尾端和前 16 个字节一起弗兰肯斯坦,还是还有另一种方法可以解决这个问题?我的问题也是,为什么在解析之前将块读入这样的缓冲区,更快?相反,如果您不相信这是真的,那么请在可能的情况下解释原因。谢谢你的时间。为什么在解析之前将块读入这样的缓冲区,更快?相反,如果您不相信这是真的,那么请在可能的情况下解释原因。谢谢你的时间。为什么在解析之前将块读入这样的缓冲区,更快?相反,如果您不相信这是真的,那么请在可能的情况下解释原因。谢谢你的时间。

4

2 回答 2

1

使用标准iostream库,它会自动执行缓冲。

于 2012-09-13T04:47:10.150 回答
0

首先,块被高估了。在您的情况下,没有理由读取 2^N 块只是为了以其他方式重新分块。

其次,如果您决定重新分块,您将使用缓冲区和内存复制来做到这一点。

于 2012-09-13T04:28:04.067 回答