系列文章目录
本文内容是收集所有c、c++读写二进制的方法,持续更新
第一章:介绍读写文件的所用到的头文件 、基本函数 ,以及代码实现 。 第二章:更新第二种方法。
前言
通过网上大佬的笔记总结本篇文章,并编译运行,后续会总结出多种读取二进制文件。
一、读取数据文件DAT(二进制文件)
介绍读写文件的所用到的头文件 、基本函数 ,以及代码实现 。
1.1 基本概念
定义参考: 1.https://www.runoob.com/ 2.百度百科 3.http://c.biancheng.net/
1.1.1 DAT文件、二进制文件
DAT文件
.dat 并不是一种标准文件。许多文件都使用这个扩展名,但文件含义不同。而许多数据分析软件也用这个扩展名保存数据 。- 所以这要看具体的软件情况来定。
- DAT文件,可以按照扩展名来看就是DATA的意思,即数据文件。
- 这类文件并没有进行绝对化的定义,例如VCD光盘中的dat文件就可以用一般的视频播放器打开,而QQ的dat文件中则存储了用户信息,是不能使用常规方式打开的,只有QQ程序可以访问。还有一些其他程序都有自己对dat文件的定义,要通过产生它的程序来打开与之相关联的dat文件。
二进制文件
- 二进制文件(英語:Binary file)一般指包含ASCII及扩展ASCII字符中编写的数据或程序指令(Program
instructions)的文件。 - 广义的二进制文件即为文件,由文件在外部存储设备的存放方式为二进制而得名。 狭义的二进制文件即指除文本文件以外的文件。
1.1.2 头文件、基本函数介绍
(1)头文件
#include <stdio.h>
(2)FILE
FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。
(3)fopen
FILE *fopen(char *filename, char *mode);
例如下: FILE * fp = fp=fopen("myfile1.BAT","rb") ;
函数的打开方式
总结: 调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。 读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如: 将读写方式放在读写权限的末尾:“rb”、“wt”、“ab”、“r+b”、“w+t”、“a+t” 将读写方式放在读写权限的中间:“rb+”、“wt+”、“ab+”
整体来说,文件打开方式由 r、w、a、t、b、+ 六个字符拼成,各字符的含义是: r(read):读 w(write):写 a(append):追加 t(text):文本文件 b(binary):二进制文件 +:读和写
(4)fread C 库函数size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
(5)fwrite C 库函数size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
(6)fseek
int fseek(FILE *stream, long int offset, int whence)
whence的值可取如下: SEEK_SET 文件的开头 (0) SEEK_CUR 文件指针的当前位置 (1) SEEK_END 文件的末尾(2)
(7)fclose
int fclose(FILE *fp);
1.2 代码实例
1.2.1 写入二进制文件
源代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
int sno;
char name[10];
}student;
int main ()
{
FILE * fp;
int i;
student stu[5];
stu[0].sno=201701;strcpy(stu[0].name,"li");
stu[1].sno=201702;strcpy(stu[1].name,"wang");
stu[2].sno=201703;strcpy(stu[2].name,"zhang");
stu[3].sno=201704;strcpy(stu[3].name,"zhao");
stu[4].sno=201705;strcpy(stu[4].name,"huang");
if((fp = fopen ("myfile1.BAT","wb"))==NULL)
{
printf("no open the file");
exit(0);
}
for(i=0;i<5;i++)
{
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
{
printf("file writeerror\n");
}
}
fclose (fp);
return 0;
}
1.2.2 读二进制文件
源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct{
int sno;
char name[10];
}student;
int main () {
FILE * fp;
student stu;
long a;
if((fp=fopen("myfile1.BAT","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
while(fread(&stu,sizeof(student),1,fp)==1)
{
printf("%d%s\n",stu.sno,stu.name);
}
printf("输入您要定位的字节数(只能为0,32,48,64\n");
scanf("%ld",&a);
fseek(fp,a,0);
if(fread(&stu,sizeof(student),1,fp)==1)
{
printf("%d%s\n",stu.sno,stu.name);
}
return 0;
}
拓展
结构体所占字节数:
https://blog.csdn.net/u012243115/article/details/44563331
总结
持续更新中…
|