关于文本模式和二进制模式对文件进行操作的区别
来源:互联网 发布:广告机软件 编辑:程序博客网 时间:2024/04/30 04:02
看到这个标题可能很多人会说:“不就是文本模式下系统会对其中的换行符进行转义吗!”以前我也是这么想的,但是最近又有些迷糊了……
之前在做数据结构的课程设计,我选的题目是huffman编码对文本文件进行压缩。
手痒的我把自己的程序在图片上试了试,压缩出来的文件出奇的小……其压缩率甚至超过了专业的压缩软件……不用想……肯定是数据读写过程中漏掉了很多东西,
或许是在读取过程中提前遇到了EOF导致数据根本就没读完;
或者写入时文件中某些数据的值和EOF相同,导致文件系统错误判断了文件的大小,自作主张把后面那一截都切掉了?
后者的可能性应该是很小的(当然,我是菜鸟,我什么都不知道……),毕竟文件系统可不是一个字符串(以0为终止),来个 -1 就把这个文件的后面一截都给掐了……
而且这种情况以我目前的水平也完全没法进行测试,于是我开始着手对读取过程进行测试。
以下为我的测试代码的框架,其中cloud1.jpg是一张1366*768的图片。
#include <stdio.h>#include <stdlib.h>#include <conio.h>int main( void ){ FILE*pf = fopen( "I:/多媒体/图片/cloud1.jpg" , "r" ); int n = 0; int i = 0; while( ( n = fgetc( pf ) ) != EOF ) { i++; } printf( "i=%d,n=%d" , i , n ); getch(); return 0;}
通过修改保存 fgetc 的返回值的容器 n 的数据类型( char 或 int ),以及文件的打开模式( r 或 rb ),我得到了以下三组数据(char+r没测试):
第一组:【char + rb 】:貌似jpg图片的开头第一个字节就是0xff,所以用char来装这个返回值的话马上就被当成了EOF,结束了循环……
第二组:【int + rb】这组数据是正确的,计数器i准确地记录的整个文件的字节数,可以看到它与系统给出的信息482KB是相同的。
第三组:【int + r】:这一组是问题所在——显然文件的读取提前结束了!
我不禁在想,EOF到底是个什么东西!!??难道仅仅只是 -1 吗?确实,用char来装这个返回值时,0xff 就是-1,但是为什么用了足够大的 int 类型之后,两种模式会出现不同呢?这里面到底是什么原因?恳请大神帮忙分析之!!!
感激不尽!!!
- 关于文本模式和二进制模式对文件进行操作的区别
- 文件打开的文本模式和二进制模式
- 文件打开的文本模式和二进制模式
- 文件打开的文本模式和二进制模式
- 文件打开的文本模式和二进制模式
- 关于ftp中文本模式和二进制模式上传文件的区别
- 关于ftp中文本模式和二进制模式上传文件的区别
- C fread的文本模式与二进制模式的区别
- 打开文本二进制与文本模式的区别
- Silverlight OOB模式的设置和对文件进行读取和写入的操作
- C语言读取文件中文本模式和二进制模式的区别
- 文件输出时,string和字符数组的区别.以及二进制模式和文本模式
- c语言中文本模式和二进制模式的区别
- 关于文件的文本读写和二进制读写
- C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别
- 二进制模式与Text模式的区别
- c++ 文件操作二进制模式的读写问题
- 使用观察者模式 对activemq进行操作产生的问题
- 从前的中国没有情人节,却有许多情书。(转载)
- LATTICE FPGA IO 约束设置 初探
- 北漂租房之
- ModelSim破解及使用
- ExtJs Ajax的同步问题
- 关于文本模式和二进制模式对文件进行操作的区别
- Web.xml配置详解
- POJ 3601 Escape from Enemy Territory (二分+BFS+预处理)
- 嵌入式系统(2) 存储设备总结
- SQL Server 连接问题-命名管道
- 周鸿祎是个产品天才——从360进军搜索市场想到
- visual studio 2010 输出对象内存结果命令行参数
- MYSQL的GRANT命令详解
- CLisp 11:使用 type-of 确定对象的类型