第11章 文件处理

今天我总结一下文件这一章的知识:

1.文件概述

   文件(file)是指存储在外部介质上数据的集合。操作系统则是以文件为单位对数据进行管理的。C语言中文件是流式文件,即文件是一个字节流二进制流,并以字节为单位进行存取。

根据文件中数据的存储方式,C 语言的文件可分为:文本文件(ASCII码文件)和二进制文件

C语言中可采用“缓冲文件系统”和“非缓冲文件系统”来处理文件。

缓冲文件系统:系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,数据的输入和输出都先经过缓冲区。

  非缓冲文件系统:是指系统不自动为文件开辟缓冲区,而是由用户程序自己为文件设定缓冲区。

2.文件类型指针(FILE)

 

#ifndef _FILE_DEFINED

struct _iobuf {
  char *_ptr;     //文件输入的下一个位置    
    int _cnt;       //当前缓冲区的相对位置    
	char *_base;    //是文件的起始位置    
	int _flag;      //文件标志    
	int _file;      //文件的有效性验证    
	int _charbuf;    //检查缓冲区状况,如果无缓冲区则不读取    
	int _bufsiz;     //缓冲区大小    
	char *_tmpfname; //临时文件名
}; 

typedef struct _iobuf FILE; 

#define _FILE_DEFINED 
#endif 

3.文件基本操作

 

(1)文件读(fopen):主要功能是为需要打开的文件分配一个缓冲区,并返回该缓冲区的首地址

 fp = fopen("文件名","文件使用方式") //文件名:要打开的文件的名,文件使用方式:以何种方式打开文件

(2)文件关闭(fclose):就是使文件指针不再指向该文件,即使文件指针变量与文件“脱钩”。

 fclose("文件指针")//如果fclose 函数关闭文件成功,则返回零值;如果fclose 函数关闭文件失败,则返回非零值 EOF(-1)EOF 文件结束符。fclose 函数在程序结束以前先把文件缓冲区中的数据输出到磁盘文件,  然后才释放文件指针变量。

 

C语言文件使用方式

   文件使用方式

                                               含 义

r(只读)

为输入打开一个已存在的文本文件

w(只写)

为输出创建新文件,(若文件已存在,则文件内容被清空)

a (追加数据)

只用于向已存在的文件的末尾添加数据

rb(只读)

为输入打开一个已存在的二进制文件

wb(只写)

为输出打开一个二进制文件。若文件不存在,则创建新文件

ab(追加)

打开一个已存在的二进制文件,在文件尾追加数据

r+(读/写)

为读写打开一个已存在的文本文件

w+(读/写)

建立一个新文本文件。若文件已存在,则文件内容被清空

a+(读/写)

保留已存在的文件,可以添加数据,也可以读取数据

rb+(读/写)

为读写打开一个已存在的二进制文件

wb+(读/写)

建立一个新的二进制文件,若文件已存在,则文件内容被清空

ab+(读/写)

保留已存在的文件,可以添加数据,也可以读取数据

 

(3)fputc函数和fgetc函数

 

 

 fputc函数:把一个字符写到文件中去

    fgetc函数:从指定的文件读入一个字符

 

 

例1:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。

 

 

#include <stdio.h>
#include <stdlib.h>

int main(){
	FILE *fp;
	char ch,filename[10];
	printf("Input filename:");
	scanf("%s",filename);
	if(fp == NULL){
		printf("Can't open this file!");
		exit(0);
	}
	ch = getchar();
	while((ch = getchar()) != '#'){
		fputc(ch,fp);
	}
	fclose(fp);
	getch();
	return 0;
}

(4)fputs函数和fgets函数

 

  fputs(str,fp)//str指向的一个字符串,舍去结束标记‘\0’后写入fp所指向的磁盘文件上。

                                 正确,则返回写入文件的实际字符数;错误,则返回EOF(-1)

     fgets(str, n, fp)//从文件fp中读取n-1个字符在其后补充一个字符串结束标记‘\0’,组成字符串并存入str

              指定的内存区,正确,则返回str对应的地址;错误,则返回NULL(0)

(5)fprintf函数和fscanf函数

 

  int num;
  float score;
  FILE * fp1, *fp2;
  fp1 = fopen("in.txt", "r");
  fp2 = fopen("out.txt", "w");
  scanf(fp1, "%d,%f", &num, &score);
  fprintf(fp2, "%d,%6.2f", num, score);

(6)frewind函数

 

 

 使位置指针重新返回文件开头。此函数没有返回值。调用形式:frewind(fp)

例2: 有一个磁盘文件file.txt,第一次将它的内容显示在屏幕上,第二次把它 复制到file2.txt文件上

 

#include <stdlib.h>

int main(){
	FILE *fp1,*fp2;
	char ch;
	if((fp1 = fopen("file.txt","r")) == NULL){
		printf("Can't open this file!");
		exit(0);
	}
	if((fp2 = fopen("file1.txt","w")) == NULL){
		printf("Can't open this file!");
		exit(0);
	}
	while((ch = fgetc(fp1)) != EOF){
		putchar(ch);
	}
	frewind(fp1);
	while((ch = fgetc(fp1)) != EOF){
		putchar(ch,fp2);
	}
	fclose(fp1);fclose(fp2);
	return 0;
}

(7)fseek函数和随机读写

 

 fseek(文件类型指针,位移量,起始点)//位移量:是指以起始点为基点向前移动的字节数。一般地,位移量用long

     型数据;起始点:0 —文件开始,1 —当前位置2 —文件末尾

      顺序读写——位置指针按字节位置顺序移动;
 随机读写——位置指针按需要移动到任意位置进行读写 

 

  fseek (fp , 100 L , 0) ;  
       ----将位置指针移到离文件头100个字节处
  fseek (fp , 50 L , 1) ; 
       ----将位置指针移到离当前位置50个字节处
  fseek (fp , -10 L , 2) ; 
       ---将位置指针移到离文件尾向前10个字节处

例3:a1.txt文件存放26个字母,要求先显示该文件中的所有内容,再显示奇数位中的所有字母。

 

 

#include <stdio.h>
#include <stdlib.h>

int main(){
	FILE *fp;
	char ch;
	int i;
	if((fp = fopen("a1.txt","r")) == NULL){
		printf("Can't open this file!");
		exit(0);
	}
	while((ch = fgetc(fp)) != EOF){
		putchar(ch);
	}
	printf("\n");
	frewind(fp);
	while((ch = fgetc(fp1)) != EOF){
		printf("%c",ch);
		fseek(fp,sizeof(char),1);//从当前位置向下移动一个字节 
	}
	fclose(fp);
	return 0;
}

(8)fread函数和fwrite函数

 

 

    fread(buffer , size , count , fp )//buffer:是一个指针,表示读入数据的存放起始地址和要输出数据的起始地址。

    fwrite(buffer , size , count , fp )//size:表示要读写的字节数;count:表示要进行读写多少个 size 字节的数据项,

             即读写的次数;fp:文件指针,应指向被操作的文件。

以上是我的学习分享总结,如有不足,希望指正!

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值