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中,一行的结尾是有标记的\r\n .为了隐藏程序中的这些差异(使程序可以跨平台运行),Python在这里做了一些自动转换:在Windows下以文本模式读取文件中的文本时,Python将\ r \n转换为\n .相反,在Windows下以文本模式向文件写入文本时,Python将\ n转换为\ r \ n(Macintosh系统也是如此,但转换在\ r和\ n之间)。
使用二进制文件(如声音剪辑)时可能会出现问题,因为文件可能包含可以被解释为上述换行符的字符,Python可以使用文本模式自动转换它们。但这会破坏二进制数据。所以,为了避免这样的事情,我们应该使用二进制模式,这样就不会发生转换。
需要注意的是,这种差异在UNIX上并不是很重要,UNIX是一个以newline作为标准行尾符号的平台,因为不会发生转换。
注意:通过在mode参数中使用U参数,可以在打开文件时使用一般的换行符支持模式。在此模式下,无论运行的平台是什么,所有换行符/字符串(\r\n,\r或\n)都被转换为\n。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。