IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

C语言打开文件的模式

邓安良的网络日志 2013-01-17 13:23:56 累计浏览 2,930 次
本机暂存

   昨天写一个读取bmp文件的小程序,出现了一个bug,但是不清楚到底是什么原因。

   程序是要读取一个bmp文件然后保存成Bmp文件,我发现读取的时候有小错误,保存的时候也有。保存Bmp的时候居然文件大小比原来的文件大小多了3个字节,这三个字节的差异让图片的内容有了巨大的变化。

   后来自己检查才发现自己打开文件时候用的是:fopen(filename,”r+”)

   而改成 fopen(filename,”wb”)后程序终于完全正常。补了一下c语言文件操作的课,才恍然大悟。默认的,c语言里面是以文本模式打开文件的,在文本模式下,读取的时候换行符会被转换成回车+换行,而保存的时候会将回车+换行保存成换行。我发现我读取8bit的颜色表的时候这样读取,而8bit位图的颜色表中正好有’0a’这个字符,16进制的’0a’即是10,而这样的’0a’会出现三次,三次都会被解释成回车加上换行,所以读取的时候会溢出,而保存的时候会多出三个字节。

   故,所有的操作非文本类文件的程序最好都使用二进制模式打开和保存,否则会出现上述的问题。

   参考资料:http://blog.sina.com.cn/s/blog_8c7bf19701010yat.html

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. Fix Bug的五个阶段 (累计阅读 42,974)
  2. 调试工具之GDB (累计阅读 14,830)
  3. gdb的基本工作原理是什么? (累计阅读 11,683)
  4. PHP程序的执行流程 (累计阅读 10,033)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,447)
  6. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,181)
  7. nginx自定义模块编写-实时统计模块 (累计阅读 8,731)
  8. 深入理解Nginx之调试优化技巧 (累计阅读 8,227)
  9. C语言中史上最愚蠢的Bug (累计阅读 8,090)
  10. websocket 连接 C Server的尝试 (累计阅读 7,924)