fwrite写不进去,fwrite无法写入

  fwrite写不进去,fwrite无法写入

  参考:

  Fwrite写错了文件大小_明志的专栏-CSDN博客

  c库函数fopen()菜鸟教程

  症状:fwrite中的图像有奇怪的错位。176x144的小图没问题,但是下面416x240这样的图就有问题了。如果把像素值打印出来,复制到Excel中,然后导入到MATLAB中的imshow(uint8(img))中显示图像,会发现图像是正常的。

  图片来自fwrite:

  打印出图像,导入MATLAB显示:

  原来是W和wb的区别。w w默认是用文本方式写的,到了换行符0A 0D会根据不同系统修改。由于这个原因,Windows只是添加了一个符号,这导致了更多的数据和右侧的图像。书写的图像应该用wb以二进制形式书写。

  这是当时fwrite的代码:

  文件* out//fopen_s(out, C:/Users/vid/Documents/Working/VVCSoftware _ VTM-VTM-10.0/jmd HB/imok . YUV , w );//这样写不对,整天坑.fopen _ s (out, c:/users/vid/documents/working/vvcsoftware _ VTM-VTM-10.0/jmd HB/imok . YUV , WB );if(out==nullptr){ cout Error open imok . YUV endl;返回;} else { fwrite(tmpY,sizeof(char),Width * Height,out);//fwrite(tmpU,sizeof(char),Width * Height 2,out);//fwrite(tmpV,sizeof(char),Width * Height 2,out);fclose(out);} ASCII缩写含义0ALF换行键0DCR归位键ASCII编码对照表_911查询

  Windows回车和换行符" r n" crlf

  Unix系统回车)" n" CR

  Unix: Linux和macOS

  很久以前,macOS的换行符是LF。

  下面教程里说的也很清楚:

  第11章:文件和流Python基础教程

  “b”模式改变了文件的处理方式。一般来说,Python假设它处理的是文本文件(包括字符)。通常这样做是没有问题的。但是,如果你正在处理一些其他类型的文件(二进制文件),如声音剪辑或图像,那么 b 应该添加到模式。参数“rb”可用于读取二进制文件。

  为什么使用二进制模式?

  如果使用二进制模式读(写)文件,和使用文本模式不会有太大区别。仍能读取一定数量的字节(基本与字符相同),并能执行与文本文件相关的操作。重点是,当使用二进制模式时,Python会原样给出文件的内容,但不一定是文本模式。

  Python文本文件的操作有些令人惊讶,不过不用担心。唯一可以使用的技术是标准化换行符。一般来说,在Python中,换行符(n)意味着结束一行并开始新的一行,这也是UNIX系统中的规范。但在Windows中,一行的结尾是有标记的rn .为了隐藏程序中的这些差异(使程序可以跨平台运行),Python在这里做了一些自动转换:在Windows下以文本模式读取文件中的文本时,Python将 r n转换为n .相反,在Windows下以文本模式向文件写入文本时,Python将 n转换为 r n(Macintosh系统也是如此,但转换在 r和 n之间)。

  使用二进制文件(如声音剪辑)时可能会出现问题,因为文件可能包含可以被解释为上述换行符的字符,Python可以使用文本模式自动转换它们。但这会破坏二进制数据。所以,为了避免这样的事情,我们应该使用二进制模式,这样就不会发生转换。

  需要注意的是,这种差异在UNIX上并不是很重要,UNIX是一个以newline作为标准行尾符号的平台,因为不会发生转换。

  注意:通过在mode参数中使用U参数,可以在打开文件时使用一般的换行符支持模式。在此模式下,无论运行的平台是什么,所有换行符/字符串(rn,r或n)都被转换为n。

fwrite写不进去,fwrite无法写入