0

我正在尝试将包含 1126 万个 uint16_t 值的数组写入磁盘。总内存大小应为 ~22 MB。但是,我的文件大小为 52MB。我正在使用 fprintf 将数组写入磁盘。我想也许这些价值观正在被提升。我试图明确,但似乎没有任何区别。我的文件大小一直不变。

我究竟做错了什么?代码如下。

#define __STDC_FORMAT_MACROS
...
uint32_t dbsize = 11262336;
uint16_t* db_ = new uint16_t[dbsize_];
...
char fname[256] = "foo";

FILE* f = fopen(fname, "wb");
if(f == NULL) 
{
    return;
}

fprintf(f, "%i\t", dbsize_);
for(uint32_t i = 0; i < dbsize_; i++)
{
    fprintf(f, "%" SCNu16 "", db_[i]);
}
fclose(f);
4

3 回答 3

8

您正在将 ASCII 写入文件,而不是二进制文件。

尝试像这样编写数组,而不是fprintf在循环中使用。

fwrite(db_, sizeof(db_[0]), dbsize, f);

fprintf无论您是否以二进制模式打开文件,始终将数字和其他类型格式化为文本。二进制模式只是阻止运行时执行转换\n\r\n.

于 2013-05-08T12:37:27.033 回答
2

fprintf会将您的数字转换为一系列 ASCII 字符并将它们写入文件。根据其值,32 位 int 表示为字符串时的长度为 1 到 10 个字符。您需要使用fwrite将原始二进制值写入文件。

于 2013-05-08T12:40:13.153 回答
2

混淆的根源很可能是“b”中的“b”FILE* f = fopen(fname, "wb"); 没有做你认为它做的事情。

最重要的是,它不会将任何打印或扫描语句更改为使用二进制值而不是 ASCII 值。就像其他人说的 -fwrite改用。

于 2013-05-08T12:43:06.213 回答