您现在的位置是:首页 > 测评

二进制文件存储数据 二进制数据怎么存储

867HJcbeopms 2024-04-13

一、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;

}

文章版权声明:除非注明,否则均为兜雅网原创文章,转载或复制请以超链接形式并注明出处。