c语言中按字节读取文件类型,C语言(文件操作)

文件

指存储在外存介质(如磁盘、光盘、U盘等)上的数据集合。每一个文件有唯一的文件名,操作系统按名字存取文件。

文件名:通常由路径、主文件名、扩展名三部分组成 例如:F : \C_2011\labs\lab_15.doc

文件分类

可以从不同的角度对文件进行分类

1、根据文件的内容,可分为程序文件和数据文件。而程序文件又可分为源文件、目标文件和可执行文件;

2、根据文件的组织形式,可分为顺序存取文件和随机存取文件

3、根据文件的存储形式,可分为文本文件(即ASCII码)和二进制

4、从用户的角度看,文件还可分为普通文件和设备文件

文本文件:每一个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)

二进制文件:把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但一个字节并不对应1个字符,不能直接输出字符形式。

读文件与写文件

读文件:是指将磁盘文件中的数据传送到计算机内存的操作,又称输入,例如,将磁盘文件调入内存进行编辑

写文件:是指从计算机内存向磁盘文件中传送数据的操作,又称输出,例如,将编辑好的文件保存到磁盘中

C语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的,因此称为流式文件。

C语言中的数据文件是由一连串的字符(或字节)组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。

ANSI C的缓冲文件系统

缓冲文件系统:是指系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。

从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。

从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。

8fb230d3380dde20c99ed870b36ac543.png

文件类型指针

在缓冲文件系统中,每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。 这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。声明FILE结构体类型的信息包含在头文件“stdio.h”中。

说明:

不必熟悉FILE的成员;

通常设置一个指向FILE类型变量的指针变量,然后通过它来操作相关文件。

指针变量说明: FILE *fp

fp是一个指针变量,它指向某个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。

用法:

文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。 文件关闭后,它的文件结构体被释放。

72197274aa60dc7220987c5942efe190.png

文件的打开与关闭

(1)文件的打开与关闭的含义

对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。

所谓“打开”:是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。

在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写。

所谓“关闭”:是指撤销文件信息区和文件缓冲区。

C语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。

文件打开函数——fopen()

函数原型:FILE *fopen("文件名","操作方式");

功能:返回一个指向指定文件的FILE类型指针

FILE *fp;

fp = fopen("a.txt", "r");

复制代码

说明:

“文件名”是指要打开(或创建)的文件名,可以使用字符数组(或字符指针);

b3f3ea16ac51ffeac47bbe7f57669a11.png

文件关闭函数——fclose()

函数原型:int fclose(FILE *文件指针);

功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0,fclose(fp);

如果不关闭文件,可能会丢失数据。

原因是:向文件中写数据时,是先将数据输出到缓冲区,等缓冲区满后才输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。使用fclose()关闭文件,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。

顺序读写数据文件

对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的,也就是说,位于前面的数据先读写,位于后面的数据后读写;

顺序读写需要用库函数实现,它们由stdio.h文件声明:

单字符读写函数: fgetc()和fputc()

字符串读写函数:fgets()和fputs()

数据块读写函数:fread()和fwrite()

格式化读写函数:fscanf()和fprintf()

复制代码

编写文件操作程序的步骤

可分为以下几步:

1、定义文件类型指针;

2、打开文件,并判断是否成功打开,若打开文件失败,程序退出运行状态;

3、对文件进行读写等操作;

4、关闭文件。

读写一个字符的函数——fputc()与fgetc()

写字符函数——fputc()

函数原型:int fputc(char ch,FILE *fp);

函数功能:把一字符ch写入fp指向的文件中

返回值:正常,返回ch; 出错,为EOF( - 1)

读字符函数——fgetc()

函数原型:int fgetc(FILE *fp);

函数功能:从fp指向的文件中读取一字符, 通常存放到一个变量中

返回值:正常,返回读取的字符; 出错,为EOF( - 1)

读写字符串的函数——fputs()与fgets()

写字符串函数——fputs()

函数原型:int fputs(char *buf, FILE *fp);

其中:buf可以是字符串常量、字符数组名或字符指针函数功能:将buf指向的字符串写到fp指定的文件。但不输出字符串结束符‘\0’

返回值:写成功,返回所写的最后一个字符,否则返回EOF值

读字符串函数——fgets()

函数原型:char *fgets(char *buf, int n, FILE *fp);

函数功能:从fp指定的文件读取长度为n - 1的字符串存入起始地址为buf的内存空间,自动加结束标志‘\0’,共占n个字符,返回值为地址buf。若在未读足n - 1个字符前遇到换行符‘\n’或文件结束就停止读取。

返回值:正常,返回地址buf;若读到文件末尾或出错,则返回NULL值

void main(){

char* path = "D:\\mytxt.txt";

//打开

FILE *fp = fopen(path,"r");

if (fp == NULL){

printf("文件打开失败...");

return;

}

//读取

char buff[50];//缓冲

while (fgets(buff,50,fp))

{

printf("%s", buff);

}

//关闭

fclose(fp);

}

复制代码

1d7c7b35195496c360a4268866a94ed8.png

void main(){

char* path = "D:\\mytxt.txt";

//打开

FILE *fp = fopen(path,"w");

if (fp == NULL){

printf("文件打开失败...");

return;

}

char *text = "我是谁并不重要,重要的是你需要我";

fputs(text, fp);

//关闭

fclose(fp);

getchar();

}

复制代码

911bbfc1b3036ed9f338f34d58b191fd.png

计算机的文件存储在物理上都是二进制

文本文件和二进制之分,其实是一个逻辑之分

C读写文本文件与二进制文件的差别仅仅体现在回车换行符

写文本时,每遇到一个'\n',会将其转换成'\r\n'(回车换行)

读文本时,每遇到一个'\r\n',会将其转换成'\n'

复制文件

void main(){

char *read_path = "D:\\timg.jpg";

char *write_path = "D:\\timg_new.jpg";

//读的文件 b字符表示操作二进制文件binary

FILE *read_fp = fopen(read_path, "rb");

//写的文件

FILE *write_fp = fopen(write_path, "wb");

//复制

int buff[50]; //缓冲区域

int len = 0; //每次读到的数据长度

while ((len = fread(buff, sizeof(int), 50, read_fp)) != 0){

//将读到的内容写入新的文件

fwrite(buff, sizeof(int), len, write_fp);

}

//关闭流

fclose(read_fp);

fclose(write_fp);

getchar();

}

复制代码

7703fdf12ad474cfec98e2ca05148047.png

获取文件大小

void main(){

char *read_path = "D:\\timg.jpg";

FILE *fp = fopen(read_path, "r");

//重新定位文件指针

//SEEK_END文件末尾,0偏移量

fseek(fp, 0, SEEK_END);

//返回当前的文件指针,相对于文件开头的位移量

long filesize = ftell(fp);

printf("%d\n", filesize);

getchar();

}

复制代码

4dadffa2ae752e4c6d38e3587dcbfc76.png

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值