C语言 使用文件读取函数--fread/fopen出现的问题现象以及对应原因
使用场景:尝试读取png格式的文件
问题所在:fread未能读取到所需要长度的字符串,fopen设置读取模式错误
解决方式:调整fopen读取文件的模式
引发问题的原因:windows 系统中,fread 遇到 ”\r\n“的情况,将会替换为 '\n', 对比发现所需读取的部分存在”\r\n“的情况。
出现问题时,使用默认的读取方式——文本文件
更正为二进制文件读取方式,则纠正问题
#if 0 //
m_pngFp = fopen(fileName.c_str() , "r");
#else
m_pngFp = fopen(fileName.c_str(), "rb");
#endif
读取目标:
{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
前后现象:
文本方式
二进制方式
两种方式读取对比,发现使用文本方式读取将‘\r\n’(0x0d,0x0a)仅读出‘\n’(0x0a);
fopen函数相关描述:
二进制和文本模式的区别
1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别
参考连接: