short int在内存中需要两个字节,而这两个字节就是它的二进制存储形式。
比如short int x=12345;
那么ASCII存储为:00110001 00110010 00110011 00110100 00110101
二进制形式存储为:00110000 00111001,二进制存储用记事本打开看到的是90,因为第一个字节恰好为数字9的ASCII,第二个字符恰好为0的ASCII。
对比:ASCII便于人阅读,但是存储空间较多,且需要时间转换成机器能够识别的二进制
二进制是计算机内部形式,节省空间,不需要转换
对于字符信息,在内存中是以ASCII代码形式存放,无论用ASCII文件输出还是用二进制文件输出,形式是一样的。但是原理我们应该理解。
ofstream outfile("f.dat");默认以文本文件形式存储
ofstream outfile("f.dat",ios::binary);二进制形式存储
二进制文件的打开方式:
ofstream outfile("file1.dat",ios::out | ios::binary);
ifstream infile("file2.dat",ios::in|ios::binary);
二进制文件的读写方式:
istream& read(char *buffer, int len)//buffer可以指向内存中一段连续的空间,读取len长度的信息
ostream& write(const char* buffer,int len)
之所以用指向字符的指针是因为数据流是以字节为单位,而一个字符占用一个字节,所以用指向字符的指针正好对应一个字节一个字节连续的空间。所以借用指向字符的指针。但是我们需要知道的是,这段内存空间是不单单存储字符数据的,别的数据也可以。
outfile.write(p1,50)将p1指向的空间中50字节存入文件对象outfile
infile.read(p2,30)从infile文件对象读出30个字节,存入到p2所指向的空间
将数据以二进制的形式存放在磁盘文件中:
比如:
Student stud[3]={
{},
{},
{}
}
那么将上面的结构体数组写到文件中有两种方式:
第一种为
for(int i=0;i<3;i++)
outfile.write((char *)&stud[i],sizeof(stud[i]));
第二种为
outfile.write((char*)&stud[0],sizeof(stud));
在进行读取的时候按照上面的两种方式类比也是有两种方式的,但是需要注意的是在进行读取的时候如果想用第二种方式一次性地读取整个结构体的内容,一定要保证这个
结构体的大小是4的倍数,因为内存对齐的原因, 否则计算机在读取的时候会发生错误。如果这个结构体的大小不是4的倍数,那么就只能一项一项的读取了,也就是说用第一种方式。
查看二进制文件:
专门的二进制文件查看器;
用二进制文件查看器查看二进制文件的时候,通产都是以16进制显示的。
现代计算机中,内存空间相对比较富裕,所以处理问题会内存对齐,每个单元进行分配的时候都会以4的倍数个字节,并且存储的时候采用高位优先
的做法,读取的时候从低地址到高地址。
磁盘文件中的数据都按照统一结构体的格式进行读写,能够获得匹配。也就是说当初写入的时候用的什么结构体,读出的时候用的是相同的结构体。
常常定义某一领域的标准文件格式,各生产商依此开发各种产品,例如音频,视频等。也就是说写入的时候用这一标准文件格式,读出的时候也用这一标准文件格式。