当前位置:首页 » 《随便一记》 » 正文

C、C++读取数据文件DAT(二进制文件)

17 人参与  2023年03月23日 18:41  分类 : 《随便一记》  评论

点击全文阅读


系列文章目录

本文内容是收集所有c、c++读写二进制的方法,持续更新

第一章:介绍读写文件的所用到的头文件基本函数,以及代码实现
第二章:更新第二种方法。


文章目录

系列文章目录前言一、读取数据文件DAT(二进制文件)1.1 基本概念1.1.1 DAT文件、二进制文件1.1.2 头文件、基本函数介绍 1.2 代码实例1.2.1 写入二进制文件1.2.2 读二进制文件 在这里插入图片描述 总结


前言

通过网上大佬的笔记总结本篇文章,并编译运行,后续会总结出多种读取二进制文件。


一、读取数据文件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);// filename -- 为文件名(包括文件路径).// mode -- 为打开方式,它们都是字符串。// 返回值 -- fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。

例如下:
FILE * fp ; fp=fopen("myfile1.BAT","rb");

函数的打开方式

注意:r+w+的区别

在这里插入图片描述

总结:
调用 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)// ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。// size -- 这是要读取的每个元素的大小,以字节为单位。// nmemb -- 这是元素的个数,每个元素的大小为 size 字节。// stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。// 返回值 -- 成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

(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)// ptr -- 这是指向要被写入的元素数组的指针。// size -- 这是要被写入的每个元素的大小,以字节为单位。// nmemb -- 这是元素的个数,每个元素的大小为 size 字节。// stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。// 返回值 -- 如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

(6)fseek

int fseek(FILE *stream, long int offset, int whence)// stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。// offset -- 这是相对 whence 的偏移量,以字节为单位。// whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一。// 返回值 -- 如果成功,则该函数返回零,否则返回非零值。

whence的值可取如下
SEEK_SET 文件的开头 (0)
SEEK_CUR 文件指针的当前位置 (1)
SEEK_END 文件的末尾(2)

(7)fclose

int fclose(FILE *fp);// 返回值 -- 文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

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) //这里我存储的二进制文件为myfile1.BAT    {        printf("no open the file");        exit(0);    }     for(i=0;i<5;i++)    {       if(fwrite(&stu[i],sizeof(student),1,fp)!=1)//fwrite执行成功的返回值是fwrite函数的第三个参数           {             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) //rb代表按照二进制的方式进行读    {      printf("cant open the file");      exit(0);    }      //fread函数如果读成功返回的值是fread函数的第三个参数,此时为1                       while(fread(&stu,sizeof(student),1,fp)==1)   //如果读到数据,就显示;否则退出    {        printf("%d%s\n",stu.sno,stu.name);    }      //因为student结构体占16个字节     //所以定位按行输出只能定位到每行的行首,即距文件开端16的倍数字节处     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

总结

持续更新中…


点击全文阅读


本文链接:http://zhangshiyu.com/post/56358.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1