C- VC2012中与FWRITE混淆



我需要将一些二进制数据写入文件中。格式为 uint64_t

  #include <stdio.h>
  #include <assert.h>
  typedef unsigned long long uint64_t;
  int main()
  {
    FILE * file = fopen("data","w");assert(file);
    uint64_t a[]={16000550, 1051320,14456018, 4743184,11840752 ,4225032,
                      13642264,6059108,563784 ,11823354,3989084 ,15759410,
                      13413018 ,1582802,1574952 ,1635384,1102996 ,10511428,
                      10239562 ,9472574,2641952 ,1350256,3432142 ,9920,11573360,
                      12121180,10255874 ,3198684,7628524,16522766,12908660,
                      2681374,9482820 ,6354462,15230702 ,16255676,5813862, 
                      8174782,7642752,7362790,6089340 ,803928,2669686 ,4225032,
                      7603956 ,16551562,15734364 ,14424308,12060282 ,572450,
                      18432 ,10276902,8134910 ,10749010,14166126 ,1636942,
                      5295788 ,12342876,2151156 ,12322948};
     for(int i=0;i<sizeof(a)/sizeof(uint64_t);i++)
     {
    fwrite((char*)&a[i],sizeof(uint64_t),1,file);
     }
         fclose(file);
  }

我发现,只有当数组的大小很大时,输出就无法满足我的期望,所以我在示例中给出60 uint64_t s。

在测试中,我发现它将为8134910输出0000 fe20 7c00 0000。另外,其中还有一些错误。在GCC中,它运行良好,在VS2012中,它的作用不好。

基于您在注释中的反馈,其原因在VS2012中有所不同,因为该文件已在"文本"模式下由Defualt打开。在此模式下,每个n书面时都会扩展到rn,这会损坏您的数据。

解决方案是在二进制模式下明确打开文件:

FILE * file = fopen("data","wb")

从MSDN引用 t b 字符,可能会附加到 mode

t

以文本(翻译)模式打开。在此模式下,CTRL Z解释了 作为输入上的EOF字符。在打开的文件中 通过使用" A "的阅读/写作, fopen 在结束时检查ctrl z 如果可能的话,该文件并将其删除。这是因为使用 fseek ftell 在以Ctrl Z结尾的文件中移动可能会导致 FSEEK 在文件末尾的表现错误。

在文本模式下,返回返回 - linefeed组合被翻译 在输入上分成单线馈示,然后翻译LineFeed字符 要在输出上进行运输返回 - 线馈送组合。当Unicode时 流i/o函数以文本模式(默认),源或 假定目标流是一系列多伯特 人物。因此,Unicode流输入函数转换 宽字符的多重字符(好像是通过呼叫 mbtowc 功能)。出于同样的原因,Unicode流出输出功能 将宽字符转换为多重字符(好像是通过呼叫 WCTOMB 函数)。

b

以二进制(未翻译)模式打开;涉及的翻译 返回马车和线馈线被抑制。

如果 t b 在模式下未给出,默认翻译模式为 由全局变量_fmode

定义

_fmode的MSDN文档说:

_fmode的默认设置为 _O_TEXT for Text-Mode 翻译。 _O_BINARY 是二进制模式的设置。

最新更新