文件

文件

1.文件:存储在外部介质上数据的集合

2.文件是有序的数据序列,要访问文件中的数据,必须按照它们的排列顺序,依次访问

3.系统对文件的处理过程:

(输入):计算机外存--->缓冲区--->计算机内存

写(输出):算机内存--->缓冲区---->计算机外存

4.文件的分类:

①根据在磁盘的存储格式,分为:

文本文件(TXT/ASCⅡ文件):

     文本文中保存的数据用ASCⅡ作为存储方式,先将全部数据转换为ASCⅡ码形式,每个ASCⅡ码占一个字节

     文本文件使用编辑软件可以直接阅读

二进制文件:

      将数据在内存中以二进制格式存储,直接存入文件中

      二进制文件使用编辑器软件不能直接阅读

②从用户观点,分为:

普通文件(磁盘文件):

       以磁盘为对象,无其他特殊性能

特殊文件(标准设备文件/标准I/0文件):

       以终端为对象标准设备文件;

       逻辑文件(设备文件):与主机进行设备交换的输入输出设备(即实际的物理设备)

            例如:键盘作为标准输入文件:文件名stdin,

                  显示器作为标准输出文件:文件名stdout,

                  打印机作为输入文件:文件名PRN

③从c语言对文件的处理方式看,分为:

缓冲文件: 

    对每个正在使用的文件,系统自动在内存中为其开辟一个文件缓冲区(即高级文件操作)

非缓冲文件:

    系统不自动开辟文件缓冲区,由应用程序自己设置(即低级文件操作)

一、文件的处理:

1.文件类型结构:

FILE类型,包括在头文件stdio.h

文件结构:

typedef struct 
{
   short level;//文件缓冲区剩余的字节数
   unsigned flags;//文件状态标志
   char fd;//文件描述符
   unsigned char hold;//缓冲区满丢失的字符
   short bsize; //文件缓冲区大小
   unsigned char *buffer;//文件缓冲区地址
   unsigned char *curp;//指针指向当前文件的读写位置
   unsigned  istemp;//临时文件,指示器
   short token;//用于有效性检查
}FILE;

2.文件指针变量:  预包含stdio.h 头文件,形式  FILE *文件型指针变量名

例如:FILE *fp;

fp是一个指针变量指向文件结构,要同时使用多个文件,必须有多个不同的文件指针。

3.c语言中提供了三个标准文件的指针: 标准输入文件(键盘):stdin,

                                  标准输出文件(显示器):stdout,

                                  标准错误输出文件(显示器):stderr

二、文件的操作流程

  • 第一步:打开(新建)文件(fopen)
  • 第二步:对文件进行操作(读或写)
  • 第三步:关闭文件(fclose)

1.打开文件

fopen函数

函数原型:

  • FILE *fopen(charc *filename,char *mode);

//使用mode模式打开指定的filename文件

//文件打开成功,返回值为FILE类型的指针

//文件打开失败,返回NULL

调用形式:

fp=fopen (文件名,文件使用方式);

文件名:需要打开的文件名称(字符串)

例如:

fp=fopen(“e:\\code\\test.txt”,”rt”);//以只读方式打开路径为e:/code/est.txt的文件

fp=fopen(“e:/code/test.txt”,”wt”);//以只写方式打开路径e:/code/test.txt文件      

fp=fopen("text.txt","r");//只读的方式打开一个和可执行文件在相同路径下的文本文件test.txt

文件使用方式;

"r":读,为读方式(输入)打开文件,该文件必须存在,若文件不存在,则返回NULL

"w":写(输出)方式打开文本文件,若文件不存在,则建立一个新文件,若文件已存在,则将原来的文件清空

"a":追加,在文本文件的末尾增加数据,若文件存在,则保持原来文件的内容,将新的数据增加到原来的后面;若文件不存在,则返回NULL;

"t":文本文件

"b":二进制文件

"+":读和写

文件的其他打开方式:

"r+":对文本文件进行读/写文件不存在返回NULL,若文件存在内容不会被清空

"w+":可以文本文件进行读/写操作,若文件已存在,则将文件原来的内容清空

"a+":文本文件进行读/追加操作,文件内容不会清空

"rb+":对二进制文件进行读/写操作

"wb+":对二进制文件进行读/写操作

"ab+":对二进制文件进行读/追加操作

常见文件打开操作:

if((fp=fopen("d:\\file.txt","r"))==NULL)
{
   printf("cannot open file.\n");
   exit(0);
}

//以只读方式打开D盘根目录下“file.txt”文件,

//文件打开成功,将为该文件的结构的地址返回存入fp

//如果打开文件失败,fopen函数返回一个空指针exit( ); 函数:0表示程序正常退出,1表示错误退出


2.关闭文件:

fclose函数

原型:int fclose (FILE *fp);

调用格式: fclose(fp);

fp:已经打开的文件指针

函数功能:关闭fp指定的文件,切断缓冲区与该文件的联系,并释放文件指针

          若文件关闭成功,返回值0,关闭失败,返回非0值


三、文件的顺序读写:

对文件的操作必须按照文件中字符的先后顺序进行,从头到尾主数据读入或写出。

字符串输入输出函数     fgetc  fputc

字符串输入输出函数     fgets  fputs

格式化输入输出函数     fscanf  fprintf

数据块输入输出函数     fread   fwrite

1.单字符读写函数:

  • 读:int fgetc(FILE *fp);
  • 写:int fputc(char ch,FILE *fp

调用形式:

 输入函数:ch=fgetc(fp);

//从指定文件中读取一个字符,读取的字符付给变量ch

//对于ASCⅡ文件,若读取字符时文件已经结束或出错,返回EOF(-1)

  输出函数:fputc(ch,fp);

//将一个字符输出到指定文件中,即将字符变量ch中的字符输出到fp所指向的文件

//输出操作成功,则函数返回输出的字符,否则返回EOF


2.字符串读写函数

  • 读:char *fgets(char *str,int n,FILE *fp);
  • 写:int fputs(char *str,FILE *fp);  
调用形式

输入函数:fgets(s,n,fp);//其中参数:char s[ ]; int n; FIFLE *fp;

//从fp所指向的文件中读取长度不超过n-1个字符串(串尾为\0),并将该字符串放到字符数组s中,

//函数的返回值为字符数组s的首地址;文件出错或结束,返回NULL;

//若:已读入n-1个字符,串尾为\0  则:s中存入n-1个字符,串尾为\0

      读入字符遇\0   则:s中存入实际读入的字符,串尾\0

      读入字符遇见尾文件   则:s中存入实际读入的字符,EOF不存入数组,串尾\0

      当文件已经结束时,继续文件    则:函数返回值为空,表示文件结束

例:fgets(s,4,fp)        

文本文件内容:abcd\n    数组s:abc\0

            d\nabc           d\n\0    

                     fEOF             f\0  

输出函数:fputs(s,fp);//其中参数:char s[ ];FIFLE *fp;

//将字符数组s中的字符串写入文件指针fp所指文件中

//输入成功返回0,失败返回EOF


3.格式化输入输出

输入:int fscanf(FILE fp,”格式化字符串”,[输入项地址表]);

输出:int fprintf(FILE fp,”格式化字符串”,[输入项地址表]);

调用形式:

 输入函数:fscanf(fp,格式控制符,变量地址表);//其中参数: FIFLE *fp;

//从fp所指向的ASCⅡ文件中读取字符,按格式控制符的含义存入对应的变量中,返回值为输入的数据个数

  输出函数:fprintf(fp,格式控制符,表达式列表);//其中参数:FIFLE *fp;

//将表达式列表中的数据按照格式控制符的说明,存入fp所指向的ASCⅡ文件,返回值为存入的数据个数


3.数据块输入输出

输入:int fread(void *buffer,int size,int count,FILE *fp);

输出:int fwrite(void *buffer,int size,int count,FILE *fp);

调用形式:

 输入函数:fread(buffer,size,count,fp);

//从二进制文件fp读取count个数据块存入buffer中,每个数据块的大小为size个字节

//操作成功,函数返回值为实际读入的数据块数量,文件结束或错误,返回值0

 输入函数:fwrite(buffer,size,count,fp);

//将buffer中count个数据块写入二进制文件fp中,每个数据块的大小为size个字节

//操作成功,函数返回值为实际写入的数据块数量,文件结束或错误,返回值0

四、文件的随机读写:

1.位置指针返回到头文件

函数原型:void rewind (FILE *fp);

功能:将文件内部指针移到文件开始位置

2.位置移动指针

函数原型:int fseek(FILE *fp,long off,int whence);

功能:将fp所指文件指针从 whence地址移向offset地址

whence  0--文件开头  1--文件当前位置  2--文件的末尾

3.取位置指针

函数原型:int ftell(FILE *fp); 功能:得到fp所指向文件的当前位置,当出错时返回-1L;

五、文件检测:

1.检测文件结束函数:

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

功能:判断fp所指文件指针是否位于末尾。是返回1,否返回0

2.检测文件出错函数:

检查数据输入输出是否出错函数

函数原型: int ferror(FILE *fp);
功能:检查在文件操作时,有没有出错。未出错返回0,出错返回1.

②清除出错标记及文件结束标记

函数原型: int clearerr(FILE *fp);
功能: 清除出错标记及文件结束标记,使他们值为0


六、函数实例:

#include<stdio.h>
#include<stdlib.h>
main()
{ FILE *fp;
   int i;
  char s[20],t[20]; 
  gets(s); //从键盘输入一个字符串 
  fp=fopen("e:\\stu.txt","w");//以写的方式,打开E盘stu.txt文件
  for(i=0;s[i]!='\0';i++) 
  fputc(s[i],fp);//遍历字符串中各个字符通过fputc();写入文件中
  fclose(fp);//关闭文件,完成在txt文本文件中的写操作
  fp=fopen("e:\\stu.txt","r");//读的方式打开文件
  fgets(t,6,fp); //注意字符串读取末尾带'\0'   从文件中读取5个字符加\0存入t数组
  printf("The first t is :%s\n",t);
  printf("The current position is:%d\n",ftell(fp));//显示读取字符串后的当前指针位置
  fseek(fp,5,1);//从当前位置向后移动5个字节(4个字符和\0)
  printf("The current position is:%d\n",ftell(fp));
  fgets(t,3,fp);
  printf("The second t is :%s\n",t);
  rewind(fp);//重置位置指针到开头位置
  printf("The current position is:%d\n",ftell(fp));
  fgets(t,3,fp);
  printf("The last t is :%s\n",t);
  fclose(fp); 
}
输出结果:

PS:本博客借鉴北京理工大学C语言程序设计和课本总结而成,有错请指出,谢谢阅读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值