C/C++:文本文件和二进制文件的读写

文本文件和二进制文件在计算机中的存储都是以0,1存储的,所不同的就是声明方式;
在C语言中,对于文本文件和二进制文件的读写,应该如何进行呢?
如何把数据保存为.txt文件?
如何读取.txt文件中的数据?
本主要包括以下几部分:
1、C++基础:数据流,缓冲区,文件类型
2、C语言:缓冲区文件处理:
3、文件读写流程:
4、文本文件操作:
5、格式化存取函数
6、二进制文件操作

操作方法

  • 01

    1、C++基础:数据流,缓冲区,文件类型 ①数据流Stream: 程序与数据间的交互是以流的形式进行的。 在C语言文件存取时, 都会先进行“打开文件”操作,目的是打开数据流; 而“关闭文件”操作就是关闭数据流。 ②缓冲区Buffer: 程序执行时,提供的额外内存以暂时存放数据。 缓冲区作用:为了提高存取效率,因为内存的存取速度比磁盘快。 ③文件类型: 分为文本文件和二进制文件两种。 文本文件:字符编码的方式进行保存; 二进制文件:内存中的数据原封不动至文件中,适用于非字符为主的数据;如果以记事本打开,只会看到一堆乱码。 二进制文件优点:存取速度快,占用空间小,随时存取数据。

  • 02

    2、C语言:缓冲区文件处理: C语言文件处理功能根据系统是否设置“缓冲区”分为两种: 一种是设置缓冲区; 另一种是不设置缓冲区。 由于不设置缓冲区的文件处理方式,必须使用较低级I/O函数来直接对磁盘读取,这种方式慢,并且由于不是C的标准函数,跨平台操作时容易出问题。 本经验只介绍带缓冲区的文件处理方式: 当使用在头文件stdio.h中的标准I/O函数时,系统会自动设置缓冲区,并通过数据流来读写文件。

  • 03

    3、文件读写流程: 文件数据读取时,先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后再从缓冲区中读取所需数据; 当数据写入文件时,先将数据写入缓冲区,只有在缓冲区已满或“关闭文件”后,才会将数据写入磁盘;

  • 04

    4、文本文件操作: C中主要通过标准I/O函数来对文本文件进行处理。 文本文件操作包括:fopen(),fclose(),fputc(),fgets(),fputs(),fprintf(),fscanf()… 打开文件函数fopen(): 函数原型:_CRTIMP FILE* __cdecl fopen(const char*,const char*); 函数参数:第一个参数为文件名,第二个参数为打开模式。 返回值:打开成功,fopen返回一个结构指针地址;否则返回NULL。 示例: FILE *fp; fp=fopen(“c:\\temp\\test.txt”,”r”);//由于反斜杠\在C语言中是控制字符,所以为了区分再加一个反斜杠以表示路径。 【注】:使用fopen()函数打开的文件会先将文件复制到缓冲区;在读取和写入操作中,都是针对缓冲区进行存取而不是磁盘,只有当fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。

  • 05

    4.1关闭文件 函数原型:_CRTIMP int __cdecl fclose(FILE *); 返回值:关闭成功返回值0,否则返回非零值。 【注】:在执行完文件的操作后,要进行“关闭文件“操作。 示例:打开文件和关闭文件

  • 06

    4.2字符存取函数fputc()/fgetc() 函数原型:_CRTIMP int __cdecl fputc(int, FILE *); _CRTIMP int __cdecl fgetc(FILE *); fgetc()函数:字符读取函数,从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出。 如果字符读取成功,则返回所读取的字符,否则返回EOF(end of file)。 EOF是表示数据结尾的常量,真值是-1。 判断文件是否读取完毕,可利用feof()函数进行检查。未读取结束返回0,已读取结束返回非零值。 feof()函数原型:_CRTIMP int __cdecl feof(FILE *); fputc()函数:将字符逐一写入文件中

  • 07

    4.3字符串存取函数fputs()/fgets() 函数原型: _CRTIMP int __cdecl fputs(const char*,FILE *); _CRTIMP char* __cdecl fgets(char *,int, FILE *); fgets()函数:从指定文件读入一个字符串,如fgets(str,n,fp); 函数参数:n为要求得到的字符串个数,但只从fp指向的文件输入n-1个字符,然后最后加一个‘\0’字符,因此共得到n个字符的字符串,把他们放在字符数组str中。如果在读完n-1个字符之前,遇到换行符或EOF,读取结束。 fgets()函数:向指定文件输出一个字符串,如fputs(“Hey”,fp);把字符串Hey输出到fp指定文件。 函数参数:第一个参数可以是字符串常量、字符数组或字符型指针。 返回值:输出成功,返回0;否则返回EOF;

  • 08

    5、格式化存取函数 函数原型: _CRTIMP int __cdecl fprintf(FILE*,const char *,…); ....... _CRTIMP int __cdecl fscanf(FILE*,const char *,…);

  • 09

    6、二进制文件操作 ①指针重返函数 函数原型:_CRTIMP void __cdecl rewind(FILE *); 函数功能:使位置指针重返文件的开头,用于文件的定位。 ②fread() /fwrite() 函数原型: _CRTIMP size_t __cdecl fread(void*,size_t,size_t,FILE *); _CRTIMP size_t __cdecl fwrite(const void*,size_t,size_t,FILE*); 调用形式:fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 参数:buffer:读入或输出数据的地址; size:读写输入时,每组数据的大小; cout:读写数据的次数; fp:文件指针; 函数功能:一次读取一组数据,可以读取count次; 示例: #include <stdio.h> #define SIZE 3 typedef enum {MM,GG} Gender; typedef struct { char name[10]; int age; Gender gender; }Person; void write2file(Person emp[SIZE]) { FILE *fp; if((fp=fopen(“emp.txt”,”wb”))==NULL) { printf(“cannot open file! \n”); return; } for(int i=0;i<SIZE;i++) if(fwrite(&emp[i],sizeof(Person),1,fp) != 1) printf(“file write error! \n”); fclose(fp); } void read_from_file(FILE *fp) { Person emp_out[SIZE]; if((fp=fopen(“emp.txt”,”rb”))==NULL) { printf(“cannot open file! \n”); return; } printf(“\n%d employee’s information read: \n”,SIZE); for(int i=0;i<SIZE;i++) { if(fread(&emp_out[i],sizeof(Person),1,fp)!=1) if(feof(fp)) { fclose(fp); return; } printf(“%-5s %4d %5d \n”,emp_out[i].name, emp_out[i].age,emp_out[i].gender); } fclose(fp); } int main() { FILE *fp=NULL; Person employee[SIZE]; printf(“Enter %d employee’s information: \n”,SIZE); for(int i=0;i<SIZE;i++) scanf(“%s %d %d”, employee[i].name, &employee[i].age, &employee[i].gender); write2file(employee); read_from_file(fp); return 0; }

  • 10

    7、随机存取函数fseek() 函数原型: _CRTIMP int __cdecl fseek(FILE*,long,int); 流式文件可以顺序读写,也可以随机读写。 关键在于控制文件的位置指针, 如果位置指针是按字节位置顺序移动的,就是顺序读写; 如果位置指针按需要移到到任意位置,就可实现随机读写。 所谓随机读写,是指读完上一个字符字节后,并不一定要读写其后续的字符字节,而可以读写文件中任意位置上需要的字符字节。 函数调用形式:fseek(fp,offset,start); 参数: start:起始点,用0,1,2代替,0表示文件开始,名字为SEEK_SET,1表示当前位置,名字为SEEK_CUR,2表示文件末尾,名字为SEEK_END。 fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置会发生混乱。 示例; fseek(fp,i*sizeof(Person),0);

(0)

相关推荐

  • MATLAB读写二进制文件和设置读写方式

    本文举例介绍MATLAB如何写入和读取二进制文件,同时介绍读写二进制文件的方式. 操作方法 01 第一,启动MATLAB,新建脚本(Ctrl+N),输入如下代码:close all; clear al ...

  • 怎样使用TXT文本文件进行数据存取

    由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在"txt 文件的读取"上.除了标注 ...

  • 计算机编程C语言文件的打开与关闭

    文件在进行读写操作之前要先打开,使用完毕要关闭.所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作.关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作. ...

  • c++:fstream文件操作

    绪: C++中,文件操作是通过stream的子类fstream(file stream)来实现的: 所以,采用这种方式操作文件,就必须加入头文件fstream.h. C++中,stream类,所有的I ...

  • windows平台上运行的unix模拟环境cygwin cygwin的安装配置与使用介绍

    windows平台上运行的unix模拟环境cygwin cygwin的安装配置与使用介绍

  • 后缀名.dat是什么文件格式,dat文件用什么打开?

    DAT(Digital Audio Tape)技术又可以称为数码音频磁带技术,也叫4mm磁带机技术,最初是由惠普公司(HP)与索尼公司(SONY)共同开发出来的。这种技术以螺旋扫描记录(Helical ...

  • dat文件如何打开

    DAT并不是一种标准文件。许多软件都使用这个扩展名,但文件含义不同。而许多数据分析软件也用这个扩展名保存数据。所以这要看具体的软件情况 来定。DAT文件,可以按照扩展名来看就是DATA的意思,即数据文 ...

  • dat文件打开方式

    DAT并不是一种标准文件。许多软件都使用这个扩展名,但文件含义不同。比如VCD文件为.DAT,而许多数据分析软件也用这个扩展名保存数据。所以这要看具体的软件情况来定。 dat文件可以是vcd文件,那么 ...

  • 如何运行python文件(python文件可以直接运行吗)

    当我们python程序执行完毕后,所有存储在内存中的数据全部会丢失,如果需要将程序运行结果持久的保存下来,就需要通过文件来进行保存数据.文件按照存储的种类可以分为:文本文件和二进制文件.文件是以字符编 ...