二进制文件存储数据 二进制数据怎么存储
一、c语言中采用二进制文件存储数据的问题
1、二进制文本使用fopen函数的二进制模式“rb”就可以打开。对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件。 C语言里有一系列文件操作函数。区分文本和二进制文件,需要在打开文件时设置不同的控制符mode的变量即可。
2、fopen的函数原型:FILE* fopen(const char* path,const char* mode);
fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:
r以只读方式打开文件,该文件必须存在。
r+以可读写方式打开文件,该文件必须存在。
rb+读写打开一个二进制文件,允许读数据。
rw+读写打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
wb只写打开或新建一个二进制文件;只允许写数据。
wb+读写打开或建立一个二进制文件,允许读和写。
wt+读写打开或着建立一个文本文件;允许读写。
at+读写打开一个文本文件,允许读或在文本末追加数据。
ab+读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
3、例程:
#include<stdlib.h>
#include<stdio.h>
intmain()
{
FILE*fpPhoto,*fpText,*fpTarget;
intiRead;
charszBuf[100];
printf("请输入第一个文件名(jpg):\n");
gets(szBuf);
fpPhoto=fopen(szBuf,"rb");
printf("请输入第二个文件名(txt):\n");
gets(szBuf);
fpText=fopen(szBuf,"rb");
printf("请输入目的文件名(jpg):\n");
gets(szBuf);
fpTarget=fopen(szBuf,"wb");
if(!fpPhoto||!fpText||!fpTarget)
{
printf("打开文件失败!\n");
system("pause");
return-1;
}
while((iRead=fread(szBuf,1,sizeof(szBuf),fpPhoto))>0)
fwrite(szBuf,1,iRead,fpTarget);
while((iRead=fread(szBuf,1,sizeof(szBuf),fpText))>0)
fwrite(szBuf,1,iRead,fpTarget);
fclose(fpPhoto);
fclose(fpText);
fclose(fpTarget);
return0;
}
二、计算机的二进制数据是如何存储的
1、二进制
二进制作为计算技术中广泛采用的一种数制,两个数字便可表示所有数字,二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
2、三进制
三进制以3为底数的进位制,三进制数有0、1、2三个数码,逢三进一。在计算机发展的早期,采用了一种偏置了的三进制(对称三进制),有-1<一般用T表示>、0、1三个数码,这种三进制逢+/-2进一。
3、四进制
四进制以4为基数的进位制,以 0、1、2和 3四个数字表示任何实数。四进制与所有固定基数的计数系统有着很多共同的属性,比如以标准的形式表示任何实数的能力,以及表示有理数与无理数的特性。
4、四进制
四进制以4为底数的进位制,以 0、1、2和 3四个数字表示任何实数。四进制与所有固定底数的记数系统有着很多共同的属性,比如以标准的形式表示任何实数的能力,以及表示有理数与无理数的特性。
5、八进制
Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
参考资料来源:百度百科——进制
三、二进制数据怎么存储
两种方式可以参考:
1、最简单的就是二维数组,比如存储全是整形的一个m*n的矩阵。然后可以定义int a[m][n]。
输入或者输出可以用两层循环来完成,外层控制行m比如for(i=0;i<m;++i),内层控制列n比如for(j=0;j<n;++j);
2、第二种方式就是压缩矩阵进行存储,如果学了数据结构应该比较好理解。
结构体进行封装,比如:
第一步:先定义一个有效数据的位置
typedef struct node
{
int hang;int lie;int data;//用来存储一个有效数据位的行列和值
}node;
typedef struct matrix
{
node*m;//一个数组,用来存储所有的node数据
int sum;//记录一共有多少个有效数据位
}matrix;
四、c/c++中如何采用二进制文件存储数据
应该这样保存:
int main()
{
string str1;
string str2;
cin>> str1;
cin>> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr<<"Error!"<<endl;
return 0;
}
outfile.write(str1.c_str(),str1.size()+1);
/*你原来写成(char*)&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。
改成这样以后,写入文件里的就是实际的字符串了。
写入的长度应该是字符串的长度(包括结束符'\0')*/
outfile.write(str2.c_str(),str2.size()+1);
outfile.close();
return 1;
}
读取的时候这样读取:
int main()
{
string str1;
str1.reserve(100);/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/
ifstream infile("temp.dat",ios::binary);
if(! infile)
{
cerr<<"Error!"<<endl;
return 0;
}
infile.read((char*)str1.c_str(),100);/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/
cout<<str1<<endl;//输出第一个字符串
cout<<(char*)(str1.c_str()+ strlen(str1.c_str())+1)<< endl;//输出第二个字符串
return 1;
}
推荐阅读