【C语言】第十篇·文件操作


一、static和extern关键字
    1. 概述:
       1)static和extern都是用来修饰变量的。(局部的static变量也是全局的)
       2)static修饰的变量,只有包含该变量的源代码文件可以访问。(内部变量
       3)extern定义的变量,任何一个源代码文件都可以访问,只要声明就行。(外部变量)
    2. static 和extern 对局部变量的作用
      1)static对局部变量的作用
           (1)延长局部变量的生命期,从程序启动到退出,但是它并没有改变变量的作用域。
           (2)定义变量的代码会在整个程序运行期间只执行一次。
      2)extern不能修饰局部变量
    3.static和extern对全局变量的作用
      1)static对全局变量的作用
           static修饰的全局变量,表示该全局变量只能在该文件当中使用,而不能在其它文件当中使用
      2)extern修饰全局变量(全局变量默认为外部变量 )
            表示该全局变量在本文件中可以使用,也可以在其它文件当中使用
    4. static和extern对函数的作用
         static修饰的函数,是一个内部函数,只能在本文件当中调用。
         exter修饰的函数,是一个外部函数,可在本文件中调用,也可以其它文件组调用。

二、文件
    1. 什么是文件
      “文件”是指在外部介质上的数据集合,这个数据集有一个名称,叫做文件名。
      操作系统是以文件为单位对对数据进行管理。
    2. 文件分类
      1)从用户角度进行分类:普通文件和设备文件
      2)文件编码方式来看,文件可分为ASCII码文件和二进制码文件两种。
    3.对文件操作的步骤
      1)引入头文件  2)定义文件指针  3)打开文件  4)文件读写  5)文件关闭
    4. 文件读写函数
        字符读写函数:fgetc,fputc
        字符串读写函数:fgets,fputs
        数据块读写函数:fread,fwrite
        格式化读写函数:fprintf,fscanf
    5. 文件操作原理
      1)文件缓冲区
         ANSI C采用“文件缓冲系统”处理数据文件。所谓文件缓冲系统是指系统自动地在内存区为程序中正在使用的文件开辟一个文件缓冲区。
         从内存向磁盘输出数据必须先到内存中的缓冲区,装满缓冲区后一起送到磁盘去。
         从磁盘中读数据时,则一次从磁盘文件将一批数据输入到内存缓冲区,充满缓冲区后,在一次性将缓冲区的所有内容逐个送到程序数据区(给变量)。
      2)数据流
         输入输出数据传送过程,数据如流水一样从一处流向另一处,因此常见输入输出形象地称为流,即数据流。流表示了信息从源到目的端的流动。  

三、文件指针
    1. 定义:FILE *指针变量标识符  (FILE为大写)
    2. FILE类型的结构体信息包含在头文件“stdio.h”中
    3. FILE *fp 表示fp指向了FILE结构的指针变量,通过fp可以找到存放某个文件信息的结构变量,然后结构变量提供信息找到该文件,实施对文件操作,即fp指向了一个文件指针。

四、文件打开和关闭
    1.文件打开fopen函数
       文件指针变量名 = fopen(文件名,使用文件方式);
       例如: FILE *fp = fopen("a.txt","r");  //以只读的方式打开一个文件“a.txt”
    2. 文件关闭fclose函数
       fclose(文件指针);
       例如:fclose(fp);
    3. 文件使用方式    

五、 字符读写函数:fgetc,fputc
    1.fputc:把一个字符写入指定的文件中
        函数调用方式:fputc(字符量,文件指针)  字符量:字符常量,字符变量
    2. fgetc:从文件中读取一个字符
         函数调用方式:char ch;    ch = fgetc(文件指针);
    3. 示例程序:
程序一:给文件读写数据

#include <stdio.h> #include <string.h> int main(){ FILE *fp =NULL; //文件指针 unsigned int i; char ch='n'; char ch1[]="This is a Test!"; char re; fp=fopen("a.txt","r"); //r读,w写 if(fp != NULL){ printf("文件打开成功!\n"); printf("strlen(ch1) = %d\n",strlen(ch1)); //写字符串 for(i=0;i<strlen(ch1);i++){ fputc(ch1[i],fp); } //读文件中的所有字符 re=fgetc(fp); while(re != EOF){ putchar(re); re=fgetc(fp);//获取下一个字符 } printf("\n"); printf("文件读写成功!\n"); } else{ printf("文件打开失败!按任意键退出。\n"); getchar(); return 2; } fclose(fp); printf("ch = %c\n",ch); return 0; }

程序二:保存从键盘输入的数据

#include <stdio.h> void main(){ FILE *fp=fopen("readstring.txt","w+"); //w+ 读写模式 char ch; printf("输入需要保存的字符串:\n"); if(fp != NULL){ ch=getchar(); while(ch != '\n'){ fputc(ch,fp); ch=getchar(); } printf("读取输入的数据:\n"); rewind(fp); //将文件指针重新放到文件的开头 ch=fgetc(fp); while(ch != EOF){ //EOF文件末尾 (-1) putchar(ch); ch=fgetc(fp); } printf("\n"); } else{ printf("文件创建或打开失败!\n"); } fclose(fp); }


  
六、字符串读写函数:fgets,fputs
    1. fputs:向指定的文件写入一个字符串
        调用方式:fputs(字符串,文件指针)
    2. fgets
         调用方式:fgets(数组名,读取数据长度,文件指针)
          注意事项:
             1)fgets读取的时候,当文件内容读取完毕后,会给字符加上结束符\0
             2)fgets读取的时候,遇到\n 或者EOF,读取结束
    3.示例程序

#include <stdio.h> void readFile(FILE *p){ char ch[100]; fgets(ch,sizeof(ch),p); printf("读到的字符串为:%s\n",ch); } void writeFile(FILE *p1){ char ch[]="Welcome to China!\n"; fputs(ch,p1); printf("字符串写入成功!\n\n"); } void main(){ FILE *fp = fopen("readAndWrite.txt","w+"); if(fp != NULL){ writeFile(fp); rewind(fp); readFile(fp); } else printf("文件创建失败!\n"); fclose(fp); }


七、数据块读写函数:fread,fwrite
    1. 概述:可以用来读写一组数据。如:一个数组元素、一个结构体变量的值等
    2. 函数调用
       读数据块:fread(buffer,size,count,fp);
       写数据块:fwrite(buffer,size,count,fp);
        buffer:是一个指针,在fread函数中表示输入数据的首地址;fwrite中表示输出数据的首地址
        size:数据块的字节数
        count:读写数据块的个数
         fp:文件指针
     3. 示例程序
程序一:读写测试

#include <stdio.h> #include <string.h>

//文件写数据 void writeFile(FILE *p){ char *ch="Welcome"; fwrite(ch,strlen(ch),1,p); //参数:要写的字符串的首地址,块的长度,次数,写的文件地址 printf("字符串写入成功!\n"); }

//文件读数据 void readFile(FILE *p){ char ch[8]; fread(ch,strlen(ch),1,p); printf("读取到的字符串为:%s\n\n",ch); }

void main(){ FILE *fp=fopen("fwrite.txt","w+"); if(fp != NULL){ writeFile(fp); rewind(fp); readFile(fp); } else printf("文件创建失败!\n"); fclose(fp); }

程序二:读写结构体信息

#include <stdio.h> void main(){ int i; struct student{ char name[20]; int age; float score; }stu[3]={{"Liming",19,65.5f},{"Lihua",23,55.5f},{"Danny",29,79.5f}}; FILE *fp = fopen("student.dat","wb+"); if(fp != NULL){ struct student stu1[3]; for(i=0;i<3;i++){ fwrite(stu+i,sizeof(struct student),1,fp); } printf("数据写入成功!\n"); rewind(fp); for(i=0;i<3;i++){ fread(&stu1[i],sizeof(struct student),1,fp); } for(i=0;i<3;i++){ printf("姓名:%s 年龄:%d 成绩:%.2f\n",stu1[i].name,stu1[i].age,stu[i].score); } } printf("\n"); fclose(fp); }


八、 格式化读写函数:fprintf,fscanf
    1. 函数调用方式:
          fscanf(文件指针,格式字符串,输入列表);
          fprintf(文件指针,格式字符串,输出列表);
    2. 示例程序
程序一:读写测试

#include <stdio.h> void main(){ FILE *fp=fopen("data.dat","w+"); int a=3,b=4; if(fp != NULL){ fprintf(fp,"%d#%d;",a,b); printf("文件写入成功!\n"); rewind(fp); a=0; b=0; fscanf(fp,"%d#%d;",&a,&b); printf("a = %d,b = %d\n",a,b); } }

程序二:读写二维数组

#include <stdio.h> void main(){ int i; int m,n; FILE *fp = fopen("arry.dat","w+"); int a[3][2]={{1,2},{3,4},{5,6}}; if(fp != NULL){ for(i=0;i<3;i++){ fprintf(fp,"%d,%d\n",a[i][0],a[i][1]); } printf("数据写入成功!\n"); rewind(fp); for(i=0;i<3;i++){ fscanf(fp,"%d,%d\n",&m,&n); printf("%d %d\n",m,n); } } fclose(fp); }


九、文件随机读写
    1. 实现文件随机读写的关键是按要求移动文件指针,这称为文件定位。
    2. 文件定位
        1)rewind:把文件内部指针移动到文件首
               rewind(文件指针)
        2)fseek:移动文件内部指针
              fseek(文件指针,位移量,起始点)
              位移量:表示移动的字节数,要求位移量是long型数据。
              起始点:表示从何处开始计算位移量。文件首:SEEK_SET 当前位置:SEEK_CUR 文件尾:SEEK_END
       3)示例程序

#include <stdio.h> void main(){ FILE *fp=fopen("student.dat","r"); struct student{ char name[20]; int age; float score; }stu; if(fp != NULL){ //文件定位

//参数:文件地址,位移量,开始位置(SEEK_SET默认是从前面开始) fseek(fp,sizeof(struct student)*2,SEEK_SET); fread(&stu,sizeof(struct student),1,fp); printf("姓名:%s 年龄:%d 分数:%.2f\n",stu.name,stu.age,stu.score); } fclose(fp); }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值