C语言40学时第 13章 文件 (2学时 )
文件也是一种数据类型,是指存放在磁盘上的文件,其中可以是各种类型的数据,
也可以是程序清单等
对文件这种类型的处理,主要分为打开与关闭文件、从文件中读取数据和将数据写到文件中
对文件的处理都是利用系统函数和指向
“文件型”的指针变量来进行的
C语言40学时文件概述
组成文件的数据类型可以是字符型、字符串型、整型、实型和结构体型等
磁盘文件名盘符:路径 文件名,扩展名如,D:\tc\file1.c
H:\wL\file2.obj
a:\file3.exe
file4.dat
C语言40学时文本文件与二进制文件
了解被处理文件是文本文件,还是二进制文件,是处理文件的前提
文本文件中的数据是转换成对应的
ASCII码字符来存储的
二进制文件中的数据是以二进制方式存放的
C语言40学时
如:整数 10000
ASCII形式:
二进制形式:
1× 213+1× 210+1× 29+1× 28+1× 24= 10000
00110001 00110000 00110000 00110000 00110000
00100111 00010000
49 48 48 48 48
1 0 00 0
C语言40学时
文件的打开与关闭程序只能处理内存中的数据
文件的打开通常是,从磁盘文件中读取数据到内存
文件的关闭把,内存中的数据存回到磁盘文件中
C语言40学时*****
设备文件由于计算机中的输入/输出设备的作用也是输入/输出数据,其功能和文件的读/写数据相似,所以把输入/输出设备也看成文件,称为设备文件标准输入设备 标准输出设备 标准错误输出设备键盘 显示器 错误输出
系统自动打开,自动关闭
C语言40学时
文件型指针
文件型是一种特殊的“结构体”,该结构体中的成员记录了处理文件时所需的信息.系统已经在
,stdio.h”的头文件中,将该文件结构体定义成数据类型符 FILE
typedef struct
{int –fd; /*文件代号 */
int _cleft; /*文件缓冲区剩余的字节数 */
int _mode; /*文件操作模式 */
char *nextc; /*下一个待处理字节地址 */
char *buff; /*文件缓冲区首地址 */
} FILE;
C语言40学时
FILE定义的文件型指针变量称文件型指针
定义方法:
FILE *文件型指针名1,*文件型指针名2 …;
例:
#include,stdio.h”
FILE *fp1,*fp2,*file_p,f[5];
共定义了 8个文件型指针变量
C语言40学时文件的打开与关闭对文件的读写之前应该“打开”该文件,使用之后应关闭该文件
文件的打开:
FILE *fp;
fp=fopen(文件名,使用文件方式 );
如:
fp=fopen(“a1”,“r”);
C语言40学时还有:,w+”,“a+”,“rb+”,“wb+”,“ab+”
文件使用方式 含义
“r” 打开一个已存在的文本文件,只能读取数据
“w” 打开一个文本文件,只能写入数据
“a” 打开一个已存在的文本文件,追加数据
“rb” 打开一个已存在的二进制文件,只能读数据
“wb” 打开一个二进制文件,只能写入数据
“ab” 打开一个已存在的二进制文件,追加数据
“r+” 打开一个已存在的文本文件,可读/写数据
C语言40学时
文件的关闭( fclose函数)
调用格式:
fclose(文件指针 );
如:
fclose(fp);
返回值:0正确关闭,否则,非0
C语言40学时
文件状态 ( feof函数)
调用格式:
feof(文件指针 )
功能:若到文件末尾,函数值为“真” (非零 )
C语言40学时
终止程序运行函数 exit( )
调用格式:
exit(0)
功能:强迫终止当前程序的运行,
自动关闭所有已经打开的文件
C语言40学时文件的读、写函数
字符读、写函数 fgetc( ),fputc( )
一般处理文本文件
1,从文件中读取字符函数 fgetc( )
格式,fgetc(*fp)
功能,从 fp所指向的文件当前位置读取单字符返回值,正确,读取的单字符 ;
错误,EOF(-1)
C语言40学时
从一个磁盘文件顺序读入字符并在屏幕上显示
ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch);
ch=fgetc(fp);
}
C语言40学时
将字符写入磁盘文件的函数 fputc( )
格式,fputc(ch,fp)
其中,ch是要输出的字符常量或字符变量。
作用:将字符输出到 fp所指向的文件中去。
返回值:正确,输出的字符。错误,EOF(-1)
例:从键盘输入一些字符,逐个送到磁盘上去,直到输入一个“#”号为止
C语言40学时
#include<stdio.h>
main( )
{FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{printf("cannot open file\n");
exit(0);}
ch=getchar( );
while(ch!='#')
{ fputc(ch,fp);putchar(ch);
ch=getchar( );}
fclose(fp);}
C语言40学时
运行情况:
file1.c (输入键盘文件名)
computer and c# (输入一个字符串)
computer and c (输出一个字符串)
c>type file.c
computer and c (验证结果)
C语言40学时例:将一个磁盘文件中的信息复制到另一个磁盘文件中
#include<stdio.h>
main( )
{FILE *in,*out;
char ch,infile[10],outfile[10];
printf("Enter the infile name:\n);
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{printf("cannot open infile\n"):
exit(0);}
if((in=fopen(outfile,"w"))==NULL)
{printf("cannot open outfile\n"):
exit(0);}
while(! feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);}
C语言40学时运行情况
Enter the infile name:
file1.c
Enter the outfile name:
file2.c
查看结果:
c>type file1.c
computer and c
c>type file2.c
computer and c
C语言40学时
fread函数和 fwrite函数
常用来处理二进制文件
调用格式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:
buffer,是一个指针,处理数据的地址
size,要读写的字节数
count:多少个 size
C语言40学时从键盘上输入四个学生的有关数据,然后将它们转存到磁盘文件中
#include<stdio.h>
#define SIZE 4
struct student_type
{char name[10]; 10+2+2+15=29字节
int num;
int age;
char addr[15];
}stud[SIZE];
void save( )
{FILE *fp;
int i;
if((fp==fopen("stu_list","web"))==NULL)
{printf("cannot open file\n");
return;}
C语言40学时
1,for(i=0;i<SIZE;i++)
2,if(fwrite(&stud[i],sizeof(struct
stu_type),1,fp)!=1)
3,printf("file write error\n");
4,fclose(fp)
5,}
6,main( )
7,{int i;
8,for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i]
.num,&stud[i].age,stud[i].addr);
9,save( );
10.}
C语言40学时
运行情况:
Zhang 1001 19 room_101
Fun 1002 20 room_102
Tan 1003 21 room_103
Ling 1004 21 room_104
C语言40学时
fprintf函数和 fscanf函数
用于 ASCII文件或二进制文件的读写
格式:
fprintf(文件指针,格式字符,输出表列 );
fscanf(文件指针,格式字符,输入表列 );
应用
fscanf(fpr,“%d,%f”,&i,&t);
fprintf(fpw,“%d,%6.2f”,i,t);
C语言40学时
例:
#include,stdio.h”
main( )
{int i,s=0,a[5]={1,3,5,7,9};
FILE *fp;
fopen(“outfile”,”w”);
for(i=0;i<5;i++)
s=s+a[i];
printf(“s=%d\n”,s); fprintf(fp,”s=%d\n”,s);
fclose(fp);
}
结果,s=25
C语言40学时
例:
#include,stdio.h”
main( )
{int i,s=0,a[5]={1,3,5,7,9};
FILE *fp;
fopen(“outfile”,”w”);
for(i=0;i<5;i++)
s=s+a[i];
fprintf(fp,”s=%d\n”,s);
fclose(fp);
}
结果,c>type outfile
s=25