白 雪 飞
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept,of Elec,Sci,& Tech.,USTC
Fall,2003
第 10章 文件操作
C语言程序设计 - 第 10章 文件操作 2
目 录
文件概述
文件类型指针
文件的打开和关闭
文件的读写
文件的定位
C语言程序设计 - 第 10章 文件操作 3
文件 (File)
C语言中的文件
C语言把文件看作一个字节的序列
C语言对文件的存取是以字节为单位的
文本文件 (ASCII文件 )
按数据的 ASCII形式存储
二进制文件
按数据在内存中的二进制形式存储
C语言程序设计 - 第 10章 文件操作 4
文本文件和二进制文件
0 0 0 1 0 1 1 1
1 0 0 1 0 1 1 0
0 0 0 1 0 1 1 1
1 0 0 1 0 1 1 0
0 0 1 1 0 1 1 0
0 0 1 1 0 0 0 0
0 0 1 1 0 0 1 1
0 0 1 1 1 0 0 0
( 6 0 3 8 )
( ‘ 6 ’ )
( ‘ 0 ’ )
( ‘ 3 ’ )
( ‘ 8 ’ )
A S C I I 形 式二 进 制 形 式内 存 存 储 形 式
C语言程序设计 - 第 10章 文件操作 5
缓冲文件系统程 序 数 据 区输 出 文 件 缓 冲 区输 入 文 件 缓 冲 区磁 盘输 入输 入输 出输 出
C语言程序设计 - 第 10章 文件操作 6
文件类型指针
FILE类型
保存被使用的文件的有关信息
所有的文件操作都需要 FILE类型的指针
FILE是库文件中定义的结构体的别名
注意不要写成 struct FILE
举例
FILE *fp;
C语言程序设计 - 第 10章 文件操作 7
FILE类型
typedef struct {
short level; /*缓冲区满空程度 */
unsigned flags; /*文件状态标志 */
char fd; /*文件描述符 */
unsigned char hold; /*无缓冲则不读取字符 */
short bsize; /*缓冲区大小 */
unsigned char *buffer; /*数据缓冲区 */
unsigned char *curp; /*当前位置指针 */
unsigned istemp; /*临时文件指示器 */
short token; /*用于有效性检查 */
} FILE;
C语言程序设计 - 第 10章 文件操作 8
文件的打开 (fopen函数 )
函数原型
FILE *fopen(char *filename,
char *mode);
参数说明
filename:要打开的 文件路径
mode,打开模式
返回值
若成功,返回指向被打开文件的指针
若出错,返回空指针 NULL(0)
C语言程序设计 - 第 10章 文件操作 9
文件的打开模式打开模式 描 述
r 只读,打开已有文件,不能写
w 只写,创建或打开,覆盖已有文件
a 追加,创建或打开,在已有文件末尾追加
r+ 读写,打开已有文件
w+ 读写,创建或打开,覆盖已有文件
a+ 读写,创建或打开,在已有文件末尾追加
t 按文本方式打开 (缺省 )
b 按二进制方式打开
C语言程序设计 - 第 10章 文件操作 10
文件的打开举例
FILE *fp1,*fp2,*fp3;
char filename[]="file3.dat";
/* 以文本只读方式打开 file1 */
if (!(fp1=fopen("file1","r"))) {
printf("Cannot Open This File!\n");
exit(0); /* 退出程序 */
}
/* 以二进制读写方式打开 FILE2.TXT */
fp2=fopen("C:\\HOME\\FILE2.TXT","rb+");
/* 以二进制读写方式打开 file3.dat */
fp3=fopen(filename,"a+b");
C语言程序设计 - 第 10章 文件操作 11
文件的关闭 (fclose函数 )
函数原型
int fclose(FILE *fp);
参数说明
fp:要关闭的文件指针
返回值
若成功,返回 0
若出错,返回 EOF(-1)
不用的文件应关闭,防止数据破坏丢失
C语言程序设计 - 第 10章 文件操作 12
文件的关闭举例
FILE *fp;
char file[]="D:\\USER\\STUDENTS.DAT";
if (!(fp=fopen(file,"rb+"))) {
printf("Open file %s error!\n",file);
exit(0);
}
...,..
fclose(fp);
C语言程序设计 - 第 10章 文件操作 13
文件的读写函数 功能 函数 功能
fputc 输出字符 fprintf 格式化输出
fgetc 输入字符 fscanf 格式化输入
putc 输出字符 putw 输出一个字
getc 输入字符 getw 输入一个字
fwrite 输出数据块 fputs 输出字符串
fread 输入数据块 fgets 输入字符串
C语言程序设计 - 第 10章 文件操作 14
feof函数
函数原型
int feof(FILE *fp);
参数
fp:文件指针
返回值
若文件结束,返回非零值
若文件尚未结束,返回 0
C语言程序设计 - 第 10章 文件操作 15
fputc/putc函数
函数原型
int fputc(int c,FILE *fp);
int putc(int c,FILE *fp);
参数
c,要输出到文件的字符
fp:文件指针
返回值
若成功,返回输出的字符
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 16
fgetc/getc函数
函数原型
int fgetc(FILE *fp);
int getc(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回输入的字符
若失败或文件结束,返回 EOF
C语言程序设计 - 第 10章 文件操作 17
fputc和 fgetc函数举例
FILE *fp1,*fp2;
char c;
fp1 = fopen("file.in","r");
fp2 = fopen("file.out","w");
while(!feof(fp1)) {
c = fgetc(fp1);
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
C语言程序设计 - 第 10章 文件操作 18
fwrite和 fread函数 (1)
函数原型
size_t fwrite(void *buffer,
size_t size,
size_t count,
FILE *fp);
size_t fread (void *buffer,
size_t size,
size_t count,
FILE *fp);
C语言程序设计 - 第 10章 文件操作 19
fwrite和 fread函数 (2)
参数
buffer:要读 /写的数据块地址
size,要读 /写的每个数据项的字节数
count,要读 /写的数据项数量
fp,文件指针
返回值
若成功,返回实际读 /写的数据项数量
若失败,一般返回 0
C语言程序设计 - 第 10章 文件操作 20
fwrite和 fread函数举例
FILE *fp;
int i;
struct stud s[NUM];
fp=fopen("students.dat","rb+");
for (i=0; i<NUM; i++)
fwrite(s+i,sizeof(struct stud),1,fp);
for (i=0; i<NUM; i++)
fread(s+i,sizeof(struct stud),1,fp);
fclose(fp);
C语言程序设计 - 第 10章 文件操作 21
fprintf和 fscanf函数
函数原型
int fscanf(FILE *fp,
char *format[,address,...]);
int fprintf(FILE *fp,
char *format[,argument,...]);
说明
与 printf和 scanf函数类似
从文件输入或输出到文件
C语言程序设计 - 第 10章 文件操作 22
putw函数
函数原型
int putw(int w,FILE *fp);
参数
w,要 输出到文件的整数 (字 )
fp:文件指针
返回值
若成功,返回输出的整数 (字 )
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 23
getw函数
函数原型
int getw(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回输入的整数 (字 )
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 24
fputs函数
函数原型
int fputs(char *s,FILE *fp);
返回值
若成功,返回输出字符个数 (或最后的字符 )
若失败,返回 EOF
说明
字符串的结束标志 '\0'不会输出到文件
也不会在字符串末尾自动添加换行符
C语言程序设计 - 第 10章 文件操作 25
fgets函数
函数原型
char *fgets(char *s,int n,
FILE *fp);
返回值
若成功,返回 s首地址;若失败,返回 NULL
说明
从 fp输入字符串到 s中
输入 n-1个字符,或遇到换行符或 EOF为止
读完后自动在字符串末尾添加 '\0'
C语言程序设计 - 第 10章 文件操作 26
文件的定位
文件位置指针
位置指针指向当前读写的位置
每次读写文件,位置指针都会相应移动
可以通过相关函数强制修改位置指针
相关函数
rewind函数
fseek函数
ftell函数
C语言程序设计 - 第 10章 文件操作 27
rewind函数
函数原型
void rewind(FILE *fp);
参数
fp:文件指针
功能
使文件位置指针重新返回文件开头
C语言程序设计 - 第 10章 文件操作 28
fseek函数 (1)
函数原型
int fseek(FILE *fp,long offset,
int whence);
参数
fp,文件指针
offset:偏移量
whence:起始位置
功能
随机改变文件的位置指针
C语言程序设计 - 第 10章 文件操作 29
fseek函数 (2)
起始位置
SEEK_SET(0):文件开始
SEEK_CUR(1):文件当前位置
SEEK_END(2):文件末尾
举例
fseek(fp,100L,SEEK_SET);
fseek(fp,-10L,SEEK_CUR);
fseek(fp,-20L,SEEK_END);
C语言程序设计 - 第 10章 文件操作 30
ftell函数
函数原型
long ftell(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回当前文件指针位置
若出错,返回 -1L
C语言程序设计 - 第 10章 文件操作 31
结束
The End
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept,of Elec,Sci,& Tech.,USTC
Fall,2003
第 10章 文件操作
C语言程序设计 - 第 10章 文件操作 2
目 录
文件概述
文件类型指针
文件的打开和关闭
文件的读写
文件的定位
C语言程序设计 - 第 10章 文件操作 3
文件 (File)
C语言中的文件
C语言把文件看作一个字节的序列
C语言对文件的存取是以字节为单位的
文本文件 (ASCII文件 )
按数据的 ASCII形式存储
二进制文件
按数据在内存中的二进制形式存储
C语言程序设计 - 第 10章 文件操作 4
文本文件和二进制文件
0 0 0 1 0 1 1 1
1 0 0 1 0 1 1 0
0 0 0 1 0 1 1 1
1 0 0 1 0 1 1 0
0 0 1 1 0 1 1 0
0 0 1 1 0 0 0 0
0 0 1 1 0 0 1 1
0 0 1 1 1 0 0 0
( 6 0 3 8 )
( ‘ 6 ’ )
( ‘ 0 ’ )
( ‘ 3 ’ )
( ‘ 8 ’ )
A S C I I 形 式二 进 制 形 式内 存 存 储 形 式
C语言程序设计 - 第 10章 文件操作 5
缓冲文件系统程 序 数 据 区输 出 文 件 缓 冲 区输 入 文 件 缓 冲 区磁 盘输 入输 入输 出输 出
C语言程序设计 - 第 10章 文件操作 6
文件类型指针
FILE类型
保存被使用的文件的有关信息
所有的文件操作都需要 FILE类型的指针
FILE是库文件中定义的结构体的别名
注意不要写成 struct FILE
举例
FILE *fp;
C语言程序设计 - 第 10章 文件操作 7
FILE类型
typedef struct {
short level; /*缓冲区满空程度 */
unsigned flags; /*文件状态标志 */
char fd; /*文件描述符 */
unsigned char hold; /*无缓冲则不读取字符 */
short bsize; /*缓冲区大小 */
unsigned char *buffer; /*数据缓冲区 */
unsigned char *curp; /*当前位置指针 */
unsigned istemp; /*临时文件指示器 */
short token; /*用于有效性检查 */
} FILE;
C语言程序设计 - 第 10章 文件操作 8
文件的打开 (fopen函数 )
函数原型
FILE *fopen(char *filename,
char *mode);
参数说明
filename:要打开的 文件路径
mode,打开模式
返回值
若成功,返回指向被打开文件的指针
若出错,返回空指针 NULL(0)
C语言程序设计 - 第 10章 文件操作 9
文件的打开模式打开模式 描 述
r 只读,打开已有文件,不能写
w 只写,创建或打开,覆盖已有文件
a 追加,创建或打开,在已有文件末尾追加
r+ 读写,打开已有文件
w+ 读写,创建或打开,覆盖已有文件
a+ 读写,创建或打开,在已有文件末尾追加
t 按文本方式打开 (缺省 )
b 按二进制方式打开
C语言程序设计 - 第 10章 文件操作 10
文件的打开举例
FILE *fp1,*fp2,*fp3;
char filename[]="file3.dat";
/* 以文本只读方式打开 file1 */
if (!(fp1=fopen("file1","r"))) {
printf("Cannot Open This File!\n");
exit(0); /* 退出程序 */
}
/* 以二进制读写方式打开 FILE2.TXT */
fp2=fopen("C:\\HOME\\FILE2.TXT","rb+");
/* 以二进制读写方式打开 file3.dat */
fp3=fopen(filename,"a+b");
C语言程序设计 - 第 10章 文件操作 11
文件的关闭 (fclose函数 )
函数原型
int fclose(FILE *fp);
参数说明
fp:要关闭的文件指针
返回值
若成功,返回 0
若出错,返回 EOF(-1)
不用的文件应关闭,防止数据破坏丢失
C语言程序设计 - 第 10章 文件操作 12
文件的关闭举例
FILE *fp;
char file[]="D:\\USER\\STUDENTS.DAT";
if (!(fp=fopen(file,"rb+"))) {
printf("Open file %s error!\n",file);
exit(0);
}
...,..
fclose(fp);
C语言程序设计 - 第 10章 文件操作 13
文件的读写函数 功能 函数 功能
fputc 输出字符 fprintf 格式化输出
fgetc 输入字符 fscanf 格式化输入
putc 输出字符 putw 输出一个字
getc 输入字符 getw 输入一个字
fwrite 输出数据块 fputs 输出字符串
fread 输入数据块 fgets 输入字符串
C语言程序设计 - 第 10章 文件操作 14
feof函数
函数原型
int feof(FILE *fp);
参数
fp:文件指针
返回值
若文件结束,返回非零值
若文件尚未结束,返回 0
C语言程序设计 - 第 10章 文件操作 15
fputc/putc函数
函数原型
int fputc(int c,FILE *fp);
int putc(int c,FILE *fp);
参数
c,要输出到文件的字符
fp:文件指针
返回值
若成功,返回输出的字符
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 16
fgetc/getc函数
函数原型
int fgetc(FILE *fp);
int getc(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回输入的字符
若失败或文件结束,返回 EOF
C语言程序设计 - 第 10章 文件操作 17
fputc和 fgetc函数举例
FILE *fp1,*fp2;
char c;
fp1 = fopen("file.in","r");
fp2 = fopen("file.out","w");
while(!feof(fp1)) {
c = fgetc(fp1);
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
C语言程序设计 - 第 10章 文件操作 18
fwrite和 fread函数 (1)
函数原型
size_t fwrite(void *buffer,
size_t size,
size_t count,
FILE *fp);
size_t fread (void *buffer,
size_t size,
size_t count,
FILE *fp);
C语言程序设计 - 第 10章 文件操作 19
fwrite和 fread函数 (2)
参数
buffer:要读 /写的数据块地址
size,要读 /写的每个数据项的字节数
count,要读 /写的数据项数量
fp,文件指针
返回值
若成功,返回实际读 /写的数据项数量
若失败,一般返回 0
C语言程序设计 - 第 10章 文件操作 20
fwrite和 fread函数举例
FILE *fp;
int i;
struct stud s[NUM];
fp=fopen("students.dat","rb+");
for (i=0; i<NUM; i++)
fwrite(s+i,sizeof(struct stud),1,fp);
for (i=0; i<NUM; i++)
fread(s+i,sizeof(struct stud),1,fp);
fclose(fp);
C语言程序设计 - 第 10章 文件操作 21
fprintf和 fscanf函数
函数原型
int fscanf(FILE *fp,
char *format[,address,...]);
int fprintf(FILE *fp,
char *format[,argument,...]);
说明
与 printf和 scanf函数类似
从文件输入或输出到文件
C语言程序设计 - 第 10章 文件操作 22
putw函数
函数原型
int putw(int w,FILE *fp);
参数
w,要 输出到文件的整数 (字 )
fp:文件指针
返回值
若成功,返回输出的整数 (字 )
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 23
getw函数
函数原型
int getw(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回输入的整数 (字 )
若失败,返回 EOF
C语言程序设计 - 第 10章 文件操作 24
fputs函数
函数原型
int fputs(char *s,FILE *fp);
返回值
若成功,返回输出字符个数 (或最后的字符 )
若失败,返回 EOF
说明
字符串的结束标志 '\0'不会输出到文件
也不会在字符串末尾自动添加换行符
C语言程序设计 - 第 10章 文件操作 25
fgets函数
函数原型
char *fgets(char *s,int n,
FILE *fp);
返回值
若成功,返回 s首地址;若失败,返回 NULL
说明
从 fp输入字符串到 s中
输入 n-1个字符,或遇到换行符或 EOF为止
读完后自动在字符串末尾添加 '\0'
C语言程序设计 - 第 10章 文件操作 26
文件的定位
文件位置指针
位置指针指向当前读写的位置
每次读写文件,位置指针都会相应移动
可以通过相关函数强制修改位置指针
相关函数
rewind函数
fseek函数
ftell函数
C语言程序设计 - 第 10章 文件操作 27
rewind函数
函数原型
void rewind(FILE *fp);
参数
fp:文件指针
功能
使文件位置指针重新返回文件开头
C语言程序设计 - 第 10章 文件操作 28
fseek函数 (1)
函数原型
int fseek(FILE *fp,long offset,
int whence);
参数
fp,文件指针
offset:偏移量
whence:起始位置
功能
随机改变文件的位置指针
C语言程序设计 - 第 10章 文件操作 29
fseek函数 (2)
起始位置
SEEK_SET(0):文件开始
SEEK_CUR(1):文件当前位置
SEEK_END(2):文件末尾
举例
fseek(fp,100L,SEEK_SET);
fseek(fp,-10L,SEEK_CUR);
fseek(fp,-20L,SEEK_END);
C语言程序设计 - 第 10章 文件操作 30
ftell函数
函数原型
long ftell(FILE *fp);
参数
fp:文件指针
返回值
若成功,返回当前文件指针位置
若出错,返回 -1L
C语言程序设计 - 第 10章 文件操作 31
结束
The End