文件大小不等于内存大小?

时间:2013-05-08 12:32:53

标签: c++

我正在尝试将包含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);

3 个答案:

答案 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