二进制文件读写分析有关TXT文件以及bin文件处理的测试代码int main(){//fstreamfile("D:\\test.dat",ios_base::in|ios_base::out|ios_base::app);fstream file;file.open("D:\\test1.dat",ios_base::out);{int temp[10] ={0x11,0x13,0x14,0x1F,0x1D,0x11,0x11,0x12,0x11,0x11};int temp1[10];file.write((char *)temp,sizeof(temp));file.close();file.open("D:\\test1.dat",ios_base::in);file.read((char *)temp,sizeof(temp));unsigned int i;cout<<sizeof(temp)<<endl;for(i = 0;i < sizeof(temp)/sizeof(unsigned int);i++){temp1[i] = temp[i];cout<<temp[i]<<endl;}file.close();file.open("D:\\test1.dat",ios_base::out);temp1[6] = 0x16;file.write((char *)temp1,sizeof(temp));file.close();}file.open("D:\\test1.dat",ios_base::out|ios_base::app);unsigned char temp[10] = {'a','b','a','a','a','d','a','C','a','a'}; test *test1 = (test *)malloc(sizeof(test));test1->projectId = 'U';test1->password = 0x12;for(int i = 0;i < 10;i ++){test1->someThings[i] = temp[i];}test1->sm = (unsigned long)0x41;test1->fuck = 'M';file.write((char *)test1,sizeof(test));file.close();test *test2 = (test *)malloc(sizeof(test));file.open("D:\\test1.dat",ios_base::in);file.seekg(0x28);file.read((char *)test2,sizeof(test));for(int i = 0;i < 10;i ++){cout<<test2->someThings[i]<<endl;}file.close();return 0;}有关bin文件处理的测试笔记<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 函数输出的话,文件中仍然是二进制格式,呵呵,说明在输出数据到文件时,的确与打开文件的模式没有关系,只与调用的输出函数有关!!此外,要注意,你不能用>>来读取以二进制文件格式存储的整数!(注:中午我试过了,不行!这再次证明>>只能读入文本格式的数字)今天终于弄明白怎样使用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 个步骤就完成了对文件的读写操作。
文本文件的操作是相同的,比二进制文件还要简单。