c语言的文件操作
1.c文件概述
数据处理包括三部分,即数据数据输入、数据加工、数据输出,由于数据输入输出有一些不方便的地方,如每次输入都要重新输入,输出无法实现永久性保存,所以,我们可以使用文件来解决数据的保存问题,才用文件的方式,把数据永久的保存在外存上。
2.文件型指针
当我们从磁盘读取文件时,需要文件型指针来访问文件,文件型结构定义在头文件“stdio.h”中,形式如下:
typedef struct
{
short level; /*缓冲区“满”或“空”的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short basize; /*缓冲区大小*/
unsigned char *curp; /* 数据缓冲区的读写位置*/
unsigned istemp; /*临时文件,指示器*/
short token; /*用于有效性检查*/
}FILE;
我们通过文件结构体FILE类型定义文件型指针变量,用于指向某一个文件的结构体变量,从而可以访问到需要的文件。
3.文件的打开与关闭
- 打开文件----fopen()函数
调用方式:
FILE *fp;
fp=fopen(文件名,使用文件方式);
- 文件使用方式一般只写只读“r”与只写“w”
- a(追加) 向文本文件尾添加数据
- rb(只读) 以只读的方式打开一个二进制文件
- wb(只写) 以只写的方式打开一个二进制文件
- ab(追加) 向二进制尾添加数据
- r+(读写) 以读写的方式打开一个文本文件
- w+(读写) 以读写的方式建立一个新的文本文件
- 打开文件是否成功
我们可以用以下的方式来检测文件是否成功打开
FILE *fp;
fp=fopen("a1","r");//以只读的方式打开a1文件
if(fp==NULL)
printf("打开文件出错\n");
else
printf("成功打开文件\n");
- 如果fopen()被正确执行,fp将是一个非空指针,否则fp为空指针
- 关闭文件----fclose()函数
fclose(文件指针);
4.文件读写函数
- 字符读写函数----fputc()函数和fgetc()函数
- fputc()函数的作用是将字符ch的值输出到fp所指向的文件中去
fputc(ch,fp);
输出成功:返回值就是输出的字符
输出失败:返回值就是c语言定义的EOF(符号常量,值为-1)
- fgetc()函数的作用是从指定的文件中读取一个字符
ch=fgetc(fp);
在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。
- 字符串读写函数----fgets()函数和fputs()函数
- fgets()函数的作用是在文件指针fp所指文件位置读取n个字符并放入str字符数组在,若读不到则返回NULL
char *fgets ( char *str, int n, FILE *fp );
读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。
FILE *fp;
char str[20];
fp=fopen("a1","rt")
fgets(str,10,fp);
- fputs()函数的作用是将字符串str写入文件指针fp所指文件的位置。若写入成功,则返回非0值,失败则返回EOF
FILE *fp;
char str[20];
fp=fopen("a1","rt");
gets(str);
fputs(str,fp);
- 块读写函数----fread()函数和fwrite()函数
我们常常要求一次读入一组数据(例如一个结构体变量的值),可以使用以上两个函数用来读写一个数据块。
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
- buffer:是一个指针,对fread来说是代表读入数据的存放地址值,对fwrite来说是代表输出数据的存放地址
- size:要读写的字节数
- count:要进行读写的size字节的数据项的个数
- fp:文件型指针
- 格式化文件输入输出----fprintf()函数和fscanf()函数
- 使用格式化字符串对文件指针所指向的文件进行输入输出
- scanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。
fscanf(文件指针,格式字符串,输入变量名列表);
fprintf(文件指针,格式字符串,输出变量名列表);
FILE *fp;
int i, j;
char *str, ch;
ch='a';
j=6;
fscanf(fp, "%d %s", &i, str);
fprintf(fp,"%d %c", j, ch);
5.文件的定位
文件的读写有两种方式,一种是顺序指针,即位置指针按字节顺序从头到尾移动,另一种是随机读写,位置指针按需要移动到任意位置,所以我们需要控制文件位置指针的值。
- 是否到文件末尾----feof()函数
feof(文件指针);
作用:判断文件指针是否指向文件末尾
原理:feof()函数有一个返回值,如果文件指针移动到末尾,则返回值为1,否则为0
- 移到开头----rewind()函数
rewind(文件位置指针变量);
作用:使得文件位置的指针返回到文件开头
- fseek()函数
作用:fseek()函数可以改变文件的位置指针
fseek(文件类型指针,位移量,起始点);
位移量:指以“起始点”为基点,向前移动的字节数,ANSIC标准要求位移量为long型
起始点:用0,1,2代替,0表示“文件开始”,1表示“当前位置”,2表示“文件末尾”
例如,把位置指针移动到离文件开头10个字节处
fseek(fp, 10, 0);
- ftell()函数
作用:用来得到文件中位置指针的当前位置
返回值:类型为long型
ftell(文件类型指针);
如果ftell()函数的返回值为-1,则表示出错,如不存在fp文件
6.出错检测
- ferror()函数
ferror(文件类型指针);
作用:检查调用各种输入输出函数时是否出错
返回值:返回值为0则表示未出错,非0则表示出错
- clearerr()函数
clearerr()函数是将文件错误标识和文件结束符置0
clearerr(文件类型指针);
若调用一个函数出错,则其返回值为非0值,通过调用clearerr()函数即可将该值置0
来源:CSDN
作者:aaaaaries
链接:https://blog.csdn.net/weixin_45461859/article/details/103674028