转载!
http://www.exam8.com/computer/djks/dj2/CPP/ziliao/201003/1318733.html
今天在做项目时联想到了这两个问题,所以实际编程测试了一下,有一些新的收获
<1> 我一直以为自己很熟悉如何使用C/C++中的二进制文件,可今天测试的时候突然发现程序生成的二进制文件和文本文件一样。比如
FILE* fp = fopen("binary","wb");
//FILE* fp = fopen("character.txt","w");
fprintf(fp,"count is %d",250);
上述代码一个使用的是text file mode,一个是binary file mode,但结果生成的二进制文件中保存的仍然是ASCII码,直接用记事本就可以打开查看。要说区别,主要是换行符的区别,binary file的换行符为<LF>,而text file的换行符为<CR><LF>,仅此而已,我就想怎么回事啊,我明明是用二进制模式打开的文件呀,怎么里面直接保存的还是 ASCII码?也就是说保存125这个数字还是会占用3个字节,而不是我想象中那样只占一个字节!
后来我就换用C++,结果还是一样,代码如下
ofstream fs("binary",ios::binary);
//ofstream fs("character.txt");
int i = 32765;
fs<<i<<endl;
//fs.write((char*)&i,2);
fs.close();
无论以二进制文件模式打开还是以文本模式打开,文件中都是保存着文本!似乎C/C++中的binary模式不起作用!?!
后来查阅资料才知道:要想在C/C++中将数据以二进制形式文件输出,与你打开文件时的模式没有关系,关键是取决于你调用哪个函数往文件里写东西!!只有使用fwrite和fs.write()函数才能以二进制形式输出到文件中,调用puts、fprintf、<<等函数输出的都是 ASCII文本,尤其需要注意的是类似于上面代码段中那样,在C++中,即使你用fs<<i<<endl语句来输出一个整数,输出到二进制文件中的仍然是文本格式!<< operator在输出之前会自动给你进行转换,把一个整数值转换成一位一位的数字字符!!而且我后来试过了,即使我以文本模式打开一个文件,假如我用 fwrite函数输出的话,文件中仍然是二进制格式,呵呵,说明在输出数据到文件时,的确与打开文件的模式没有关系,只与调用的输出函数有关!!
此外,要注意,你不能用>>来读取以二进制文件格式存储的整数!(注:中午我试过了,不行!这再次证明>>只能读入文本格式的数字)
(补注:11:47am 我后来又想,所有上面的这些东西可以归结成一句话:你以什么模式打开文件根本不重要,因为你既改变不了文件本身的内容,也改变不了C/C++中系统函数的工作方式,所以在编程的时候,你只要关心这个文件里的数据内容本身是二进制格式还是文本格式就好了!如果内容是文本格式的,你就调用文本格式那一套函数,比如puts,gets,fscanf,fprintf,<<,>>等,如果内容是二进制格式的,你就调用二进制格式那一套函数,比如fread,fwrite,ifstream.read(),ofstream.write()等。只要保持文件内容与处理函数相对应相一致就可以了,别管它用什么模式打开文件!!假如你用<<向一个二进制文件中输入一个整数,那么其实里面保存的是文本格式的数据,那么你就照样可以以二进制模式打开它,然后用>>来读取这个整数。相反,如果你的二进制文件里面是一个以二进制形式保存的整数,那你肯定不能用>>来读取里面的整数了!!
<2>关于字节序的问题,我想用一张图来表示就足够了
今天终于弄明白怎样使用C++读写二进制文件了。
要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法。
可以使用fstream类,这个类可以对文件进行读写操作。
1、打开文件。
打开文件可以有两种方式,第一种可以使用fstream类的构造函数。
fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app);
另外一种方法就是使用open函数。
fstream file;
file.open("test.dat",ios_base::in|ios_base::out|ios_base::app);
这样就可以打开一个可读写的文件了。如果文件不存在的话,就会创建一个新文件并且以读写方式打开。
这里需要说明一点,如果文件不存在的话,open函数中第二个参数必须包含ios_base::out|ios_base::app,
否则就不能正确创建文件。
2、写文件。
先进性写文件的操作否则读一个空文件是没有意义的。
既然是写二进制文件可以向文件中写入一个整理值。写二进制字符只能使用write函数。
但是write函数的原形是write(const char * ch, int size)。第一个参数是char *类型,所以需要把将要写入
文件的int类型转换成char *类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。
int temp;
file.write((char *)(&temp),sizeof(temp));
3、读文件。
可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read(const char * ch, int size)。
要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。
int readInt;
file.read((char *)(&readInt),sizeof(readInt));
这样文件中的int值就读入到int型变量readInt中了。
4、文件指针。
在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。
在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。
同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。
先对几个枚举类型进行一下说明
ios_base::beg ——文件开始位置
ios_base::cur ——文件当前位置
ios_base::end ——文件末尾位置
下面以seekg为例说明一下指针移动的方法
file.seekg(3) ——指针移动到第三个字符的位置
file.seekg(ios_base::beg) ——指针移动到文件开头
file.seekg(ios_base::end) ——指针移动到文件末尾
file.seekg(-3,ios_base::cur) ——指针当前位置向前移动三个字符
file.seekg(3,ios_base::cur) ——指针当前位置向后移动三个字符
file.seekg(3,file.tellg()) ——指针当前位置向后移动三个字符
file.seekg(file.tellg()+3) ——指针当前位置向后移动三个字符
5、对文件操作完毕后别忘了关闭文件。
file.close();
以上5个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。
分享到:
相关推荐
C/C++实现简单的二进制文件读取和写入示例 1.包含如何读取和写入数字,以及用缓存按字节读取 2.采用标准输入和输出函数创建、打开、关闭文本文件或二进制文件
把二进制文件中的数据读出,并写入到一个txt文件中去 (read the data a binary file, and write the data into a txt file)
不管什么编码都是二进制的,这样表示为16进制就可以啦。 2.如何读取16进制文件 最近编程用这一问题,网上查了一下,感觉还是自己写吧。 16进制数据一般是:text=0x340xb5…,就是0x开头,之后是两个数字十六进制数。 ...
C++文件读取与写入,而且使用二进制方式
读取二进制文件,解析字符串,然后写入二进制数据。比较基础
2.C++ 3.文件写3个浮点数,英文字符,中文字符 4.文件读3个浮点数,英文字符,中文字符 5.基于MFC的实例 6.获取文件长度 7.修改文件内指针位置 8.如果没有VS2010,用记事本打开TestFileOperateDlg.cpp 看文档最下方的...
一个是读取图片文件的二进制流,按照规定的格式写入一个txt文本文档中,另一个程序是将此文本文档中的内容按照指定格式复制到代码的数组中,最终可生成原图片。特点:第二个程序不需要单独的图片附件,而是将所需...
VC编写的C++读写二进制文件代码,其功能是将一个文件全部写到另一个文件的末尾(如果没有就创建),可以填写的选项有:源文件完整地址,写入次数,目标文件完整地址。格式为:d:/文件名 (注意是左斜杠) 或 d:\\...
2文件二进制写入,支持追加、偏移 3文件二进制读取,支持追加、偏移 4文件普通写入,支持追加、偏移 5文件普通读取,支持追加、偏移 6ini文件在指定键写入字符串值 7ini文件在指定键读取字符串值 8ini文件在指定键...
教会你在c++中文件读取的本质,文件读取写入是如此简单
“ Encrypt.cpp”使用动态结构数组从二进制文件中读取数据,并以表的形式显示该数据。 该程序使用用户输入的加密密钥,通过凯撒(Caesar)的密码风格加密将二进制数据加密到一个新的数组中,该数组将显示并写入新...
如何把图片以二进制方式存入SQL_Server数据库_并能读取出来
最小的仅标头的C ++库,允许您定义数据架构,然后可以用JSON或二进制格式进行读取或写入。 支持嵌套结构,数组,结构继承和可为空的变体。 默认情况下,使用STL容器类型,但是可以在Config.h中进行配置。 STL不是...
主要介绍了使用Windows API 函数中的RegOpenKeyEx()函数和RegSetValueEx()函数来实现对注册表某项写入二进制键值,需要的朋友可以参考下
读取文件进行二进制编码 读取文件,将每个字符匹配哈夫曼编码,写入新文件,即完成编码 读取编码文件,根据哈夫曼编码进行解码,并写入新文件 对比二进制编码和哈夫曼编码后的文件字节大小,并计算压缩率
里面对于Sqlite3数据库2进制数据进行了详细的解析和对于大部分常用Sqlite3的接口函数做了一定的总结。对于2进制数据eg图片的操作有实例源代码提供。
因此,当执行SFX二进制文件时,它会要求用户提供解密密钥,从其自身读取加密的消息,对其进行解密,然后将解密的消息写入输出文件。 由于我们不能使用提取可执行文件将数据附加到自身(我们无法在执行文件时编辑...
读取文件进行二进制编码 读取文件,将每个字符匹配哈夫曼编码,写入新文件,即完成编码 读取编码文件,根据哈夫曼编码进行解码,并写入新文件 对比二进制编码和哈夫曼编码后的文件字节大小,并计算压缩率 通过编写...
t2b一种强大的文本宏语言,用于构建二进制文件。 支持注释,循环,Unicode,变量,条件,宏和递归。 TLDR; 查看示例/。 预构建的二进制文件可用于Win64和M t2b一种强大的文本宏语言,用于构建二进制文件。 支持注释...
读取文件进行二进制编码 读取文件,将每个字符匹配哈夫曼编码,写入新文件,即完成编码 读取编码文件,根据哈夫曼编码进行解码,并写入新文件 对比二进制编码和哈夫曼编码后的文件字节大小,并计算压缩率