我正在尝试将包含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);
答案 0 :(得分:8)
您正在为您的文件编写ASCII,而不是二进制文件。
尝试像这样编写数组,而不是在循环中使用fprintf
。
fwrite(db_, sizeof(db_[0]), dbsize, f);
fprintf
始终将数字和其他类型格式化为文本,无论您是否以二进制模式打开文件。二进制模式只会使运行时无法将\n
转换为\r\n
。
答案 1 :(得分:2)
fprintf
会将您的号码转换为一系列ASCII字符并将其写入文件。根据其值,32位int在表示为字符串时将长度为1到10个字符。您需要使用fwrite
将原始二进制值写入文件。
答案 2 :(得分:2)
混淆的根源可能是FILE* f = fopen(fname, "wb");
does not do what you think it does中的“b”。
最重要的是,它不会更改任何打印或扫描语句以使用二进制值而不是ASCII值。像其他人所说的那样 - 改为使用fwrite
。