C++二进制文件读写
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
您现在的位置: 中国IT实验室 >> C∕C++频道 >> C++编程 >> 编程技巧 >> 正文
C++二进制文件读写
今天在做项目时联想到了这两个问题,所以实际编程测试了一下,有一些新的收获:
<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的换行符为
3个字节,而不是我想象中那样只占一个字节!
后来我就换用C++,结果还是一样,代码如下:
ofstream fs("binary",ios::binary);
//ofstream fs("character.txt");
int i = 32765;
fs<
//fs.write((char*)&i,2);
fs.close();
无论以二进制文件模式打开还是以文本模式打开,文件中都是保存着文本!似乎C/C++中的binary模式不起作用!?!
后来查阅资料才知道:要想在C/C++中将数据以二进制形式文件输出,与你打开文件时的模式没有关系,关键是取决于你调用哪个
函数往文件里写东西!!只有使用fwrite和fs.write()函数才能以二进制形式输出到文件中,调用puts、fprintf、<<等函数输出的
都是ASCII文本,尤其需要注意的是类似于上面代码段中那样,在C++中,即使你用fs<
文件中的仍然是文本格式!<< operator在输出之前会自动给你进行转换,把一个整数值转换成一位一位的数字字符!!而且我后来试
过了,即使我以文本模式打开一个文件,假如我用fwrite函数输出的话,文件中仍然是二进制格式,呵呵,说明在输出数据到文件时,的确与打开文件的模式没有关系,只与调用的输出函数有关!!
此外,要注意,你不能用>>来读取以二进制文件格式存储的整数!(注:中午我试过了,不行!这再次证明>>只能读入文本格式的
数字)
(补注:11:47am 我后来又想,所有上面的这些东西可以归结成一句话:你以什么模式打开文件根本不重要,因为你既改变不
了文件本身的内容,也改变不了C/C++中系统函数的工作方式,所以在编程的时候,你只要关心这个文件里的数据内容本身是二进制格
式还是文本格式就好了!如果内容是文本格式的,你就调用文本格式那一套函数,比如puts,gets,fscanf,fprintf,<<,>>等,如果内容是二进制格式的,你就调用二进制格式那一套函数,比如fread,fwrite,ifstream.read(),ofstream.write()等。 只要保持文件内容与处理函数相对应相一致就可以了,别管它用什么模式打开文件!! 假如你用<<向一个二进制文件中输入一个整数,那么其实里面保存
的是文本格式的数据,那么你就照样可以以二进制模式打开它,然后用>>来读取这个整数。相反,如果你的二进制文件里面是一个以二
进制形式保存的整数,那你肯定不能用>>来读取里面的整数了!!
<2>关于字节序的问题,我想用一张图来表示就足够了:
今天终于弄明白怎样使用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)。