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

C++ 文件大小不等于内存大小?,c++,C++,我正在尝试向磁盘写入一个包含1126万uint16_t值的数组。总内存大小应为~22 MB。但是,我的文件大小是52MB。我正在使用fprintf将阵列写入磁盘。我想也许这些价值观正在被提升。我试着直言不讳,但似乎没什么区别。我的文件大小一直没有改变 我做错了什么?代码如下 #define __STDC_FORMAT_MACROS ... uint32_t dbsize = 11262336; uint16_t* db_ = new uint16_t[dbsize_]; ... char fna

我正在尝试向磁盘写入一个包含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);
\define\u STDC\u FORMAT\u宏
...
uint32_t dbsize=11262336;
uint16_t*db_=新uint16_t[dbsize_];
...
char fname[256]=“foo”;
文件*f=fopen(fname,“wb”);
如果(f==NULL)
{
返回;
}
fprintf(f,“%i\t”,dbsize_2;);
对于(uint32\u t i=0;i
您正在向文件中写入ASCII码,而不是二进制码

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

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

fprintf
始终将数字和其他类型格式化为文本,无论您是否以二进制模式打开文件。二进制模式只是防止运行时执行诸如将
\n
转换为
\r\n
fprintf
将数字转换为一系列ASCII字符并写入文件等操作。根据其值,当表示为字符串时,32位int的长度为1到10个字符。您需要使用
fwrite
将原始二进制值写入文件。

造成混淆的原因可能是
文件*f=fopen(fname,“wb”)中的“b”


最重要的是,它不会将任何print或scan语句更改为使用二进制值而不是ASCII值。就像其他人所说的那样,用
fwrite
代替。

你打开文件了吗?它在文本编辑器中的可读性应该是惊人的(除非SCNu16宏背后有一些非标准的东西)。这正是我想要指出的。在文本编辑器中打开它。这样你就知道你的文件内容不正确,但你甚至没有看到里面有什么。哇。@chepner
(10*1+90*2+900*3+9000*4+55536*5)/65536=4.830474853515625
是5,不是2.5。@chepner:是吗?有10000个小于5个字符的数字,而有64535个数字的5个字符范围在0..65535之间。确切数字低于5,但比4更接近5!谢谢你,科林。对不起,忍者编辑到我的帖子。我意识到我在粘贴时混淆了两个变量(db_u和dbsize)。顺便问一下,有什么好的在线资源可以讨论这些问题吗?@Daniel我想你可以查看文档以了解更多信息。