文件访问文件C文件概述
– 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,能 永久 保存数据。
文件分类
按文件的逻辑结构:
记录文件,由具有一定结构的记录组成(定长和不定长)
流式文件,由一个个字符(字节)数据顺序组成
按存储介质:
普通文件,存储介质文件(磁盘、磁带等)
设备文件,非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件,ASCII文件,每个字节存放一个字符的 ASCII码
二进制文件,数据按其在内存中的存储形式原样存放如 int 型数 10000
0010011100010000
内存存储形式
0010011100010000
二进制形式
0011000100110000001100000011000000110000
ASCII形式文本文件特点,
耗费存储量大、速度慢、便于对字符操作二进制文件特点,
节约存储空间、速度快、便于存放中间结果文本文件与二进制文件
– 文件处理方法
缓冲文件系统,高级 文件系统,系统自动为正在使用的文件开辟内存缓冲区
非缓冲文件系统,低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件输出文件缓冲区输入文件缓冲区程序数据区
a
缓冲文件系统:
缓冲区指令区程序用户数据区磁盘非缓冲文件系统:
文件类型指针
– 文件结构体 FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区
文件信息用系统定义的名为 FILE的结构体描述
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 *fp; //定义指向结构体的指针 fp
– 文件类型指针
指针变量说明,FILE *fp;
一般步骤,
– 定义文件指针变量。
– 文件打开 时,系统 自动 建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得 文件信息,访问文件
– 文件操作(读或写)
– 文 件关闭 后,它的文件结构体被释放文件名文件使用方式文件类型指针
C程序 操作系统磁盘文件的打开与关闭
C文件操作用 库函数 实现,包含在 stdio.h
文件使用方式,打开 -->读 /写 -->关闭
系统 自动 打开和关闭三个 标准文件,
标准输入 ------键盘 stdin
标准输出 ------显示器 stdout
标准出错输出 -----显示器 stderr
– 打开文件 fopen 函数
函数原型,FILE *fopen(char *name,char *mode)
功能:按指定方式打开文件
返值:正常打开,为指向文件结构体的指针;
打开失败,为 NULL(系统定义的常量 0 )
要打开的文件名使用文件方式例 文件打开与测试
FILE *fp;
fp=fopen(“aa.c”,“w”);
if(fp==NULL)
{ printf(“File open error!\n”);
exit(0);
}
例 FILE *f ;
fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”);
例 FILE *fp;
char *filename=“c:\\fengyi\\bkc\\test.dat”
fp= fopen(filename,”r”);
“r+/rb+” (读写 )
“a/ab” (追加 )
“w/wb” (只写 )
“r/rb” (只读 )
“w+/wb+” (读写 )
“a+/ab+” (读写 )
为 输入 打开一个文本 /二进制文件为 输出 打开或建立一个文本 /二进制文件为 读 /写 打开一个文本 /二进制文件为 读 /写 建立一个文本 /二进制文件为读 /写打开或建立一个文本 /二进制文件向文本 /二进制文件尾 追加 数据文件使用方式 含义
– 文件关闭 fclose 函数
作用,使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,将缓冲区数据写入文件
函数原型,int fclose(FILE *fp)
功能:关闭 fp指向的文件
返值:正常关闭为 0;出错时,非 0文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区
a
缓冲文件系统:
fclose
不关闭文件可能会 丢失数据
/*参考源程序 8-1.c*/
#include <stdio.h>
main()
{
FILE *fp;
long position;
fp=fopen("8-1.txt","w");
position=ftell(fp);
printf("When file is
created,position=%d\n",position);
fprintf(fp,"Sample data");
position=ftell(fp);
printf("After writing 11
characters,position=%ld\n",position);
fclose(fp);
}
文件的读写一 (8.3.1)
– 字符 I/O,fputc 与 fgetc 函数
fputc
– 函数原型,int fputc(int c,FILE *fp)
– 功能:把一字符 c( ASCII) 写入 fp指向的文件中
– 返值:正常,返回 c; 出错,为 EOF( -1)?fgetc
函数原型,int fgetc(FILE *fp)
功能:从 fp指向的文件中读取 一字节代码
返值:正常,返回读到的代码值 ;读到文件尾或出错,为 EOF
/*参考源程序 8-2.c*/
#include <stdio.h>
main()
{
FILE *fp;
char filename[20],ch;
printf("Enter filename:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("file open error.\n");
exit(0);
}
while((ch=fgetc(fp)!=EOF)
putchar(ch);
fclose(fp);
}
文件的读写二 (8.3.2)
字符串 I/O,fgets 与 fputs
函数 调用,char * fgets(str,n,fp)
int fputs(str,fp)
功能:从 fp指向的文件读 /写一个字符串
返值:
fgets正常时返回读取字符串的首地址;出错或文件尾,
返回 NULL
fputs正常时返回写入的最后一个字符;出错为 EOF
例 /*参考源程序 8-5.c*/
fgets 从 fp所指文件读 n-1 个字符送入 str指向的内存区,
并在最后加一个 ‘ \0’
(若读入 n-1个字符前遇换行符或文件尾( EOF) 即结束 )
fputs 把 str指向的字符串写入 fp指向的文件
main()
{ FILE fp; char str[81]; int i,len[N];
if((fp=fopen("f8-5.txt","w"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Input %d lines of characters:\n",N);
for(i=0;i<N;i++)
{ gets(str); len[i]=strlen(str); fputs(str,fp);
fputs("\n",fp); }
fclose(fp); printf("Output flie:\n");
if((fp=fopen("f8-5.txt","r"))==NULL)
{ printf("file open error.\n"); exit(0); }
for(i=0;i<N;i++)
{fgets(str,len[i]+1,fp); puts(str); fgets(fp);}
fclose(fp);}
文件的读 写三 (8.3.3)
– 格式化 I/O,fprintf 与 fscanf
函数调用形式:
fprintf(文件指针,格式字符串,输出表列 )
fscanf (文件指针,格式字符串,输出表列 )
功能:按格式对文件进行 I/O操作
返值:成功,返回 I/O的个数 ;出错或文件尾,返回 EOF
printf(“%d,%6.2f”,i,t); //将 i和 t按 %d,%6.2f格式输出到 屏幕
fprintf(fp,“%d,%6.2f”,i,t); //将 i和 t按 %d,%6.2f格式输出到 fp文件
scanf(,%d,%f”,&i,&t); //手工从 键盘 输入数据到 i,t中
fscanf(fp,“%d,%f”,&i,&t); //从 文件 fp中读入数据到变量 i,t中与常用的输入输出函数对比学习:
/*参考源程序 8-6.c*/
#include <stdio.h>
#include <string.h>
main()
{ FILE fp; int i,j,k,a[10];
if((fp=fopen("f8-61.txt","r"))==NULL)
{ printf("file open error.\n"); exit(0); }
for(i=0;i<10;i++)
fscanf(fp,"%d",&a[i]
fclose(fp);
if((fp=fopen("f8-62.txt","w"))==NULL)
{ printf("file open error.\n"); exit(0); }
k=0;
for(i=1;i<=4;i++)
for(j=0;j<i;i++)
{ fprintf(fp,"%d",a[k]); printf("%d",a[k]); k++; }
fprintf(fp,"\n"); printf("\n"); fclose(fp); }
文件的读写四 (8.3.4)
– 数据块 I/O,fread 与 fwrite
调用形式:
int fread (buffer,size,count,fp)
int fwrite(buffer,size,count,fp)
功能:读 /写数据块
返值:成功,返回读 /写的块数;出错或文件尾,返回 0
说明:
buffer,指向要输入 /输出数据块的 首地址 的指针
size,每个要读 /写的数据块的 大小 (字节数)
count,要读 /写的 数据块的个数
fp,要读 /写的 文件指针
fread与 fwrite 一般用于 二进制文件 的输入 /输出
/*参考源程序 8-7.c*/
#include <stdio.h>
#define N 3
struct student
{int num; char name[10]; int score[3];}s[N];
void writedata()
{ FILE *fp; int i;
if((fp=fopen("f8-7.txt","wb"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Input Data:\n");
for(i=0;i<N;i++)
scanf("%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0],&s[i].s
core[1],&s[i].score[2]);
for(i=0;i<N;i++)
if(fwrite(&s[i],sizeof(struct student),fp)!=1)
{printf("file write error\n"); fclose(fp); exit(0);}fclose(fp);}
/*参考源程序 8-7.c*/
void readdata()
{ FILE *fp; int i;
if((fp=fopen("f8-7.txt","rb"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Output Data:\n");
for(i=0;i<N;i++)
{ if(fwrite(&s[i],sizeof(struct student),fp)!=1)
{printf("file write error\n"); fclose(fp); exit(0);}
printf("%-4d%-
10s%4d%4d%4d\n",s[i].num,s[i].name,s[i].score[0],s[i].score[
1],s[i].score[2]); }fclose(fp);}
main()
{ writedata(); readdata();}
文件的定位
– 几个概念
文件位置指针 -----指向当前读写位置的指针
读写方式
– 顺序读写:位置指针按字节位置顺序移动,叫 ~
– 随机读写:位置指针按需要移动到任意位置,叫 ~
– rewind函数
函数原型,void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返值:无例 对一个磁盘文件进行显示和复制两次操作
#include <stdio.h>
main()
{ FILE *fp1,*fp2;
fp1=fopen("ch12_4.c","r");
fp2=fopen("ch12_41.c","w");
while(!feof(fp1))
putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1))
putc(getc(fp1),fp2);
fclose(fp1);
fclose(fp2);
}
– fseek函数
函数调用,fseek(文件类型指针,位移量,起始点 )
功能:改变文件位置指针的位置
返值:成功,返回 0;失败,返回非 0值文件指针位移量(以起始点为基点,移动的字节数 )
>0 向后移动
<0 向前移动起始点文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例 fseek(fp,100L,0);
fseek(fp,50L,1);
fseek(fp,-10L,2);
ftell函数
函数原型,long ftell(FILE *fp)
功能:返回位置指针当前位置 (用相对文件开头的位移量表示 )
返值:成功,返回当前位置指针位置;失败,返回 -1L,
例 磁盘文件上有 3个学生数据,要求读入 1,3学生数据并显示
main()
{ int i;
FILE *fp;
if((fp=fopen("studat","rb"))==NULL)
{ printf("can't open file\n");exit(0); }
for(i=0;i<3;i+=2)
{ fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%s %d %d %s\n",
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
#include <stdio.h>
struct student_type
{ int num;
char name[10];
int age;
char addr[15];
}stud[3];
例 求文件长度
#include"stdio.h"
main()
{ FILE *fp;
char filename[80];
long length;
gets(filename);
fp = fopen(filename,"rb");
if(fp == NULL)
printf("file not found!\n");
else
{ fseek(fp,0L,SEEK_END);
length = ftell(fp);
printf("Length of File is %1d bytes\n",length);
fclose(fp);
}
}
出错的检测
– ferror函数
函数原型,int ferror(FILE *fp)
功能:测试文件是否出现错误
返值:未出错,0;出错,非 0
说明
– 每次调用文件输入输出函数,均产生一个新的
ferror函数值,所以应及时测试
– fopen打开文件时,ferror函数初值自动置为 0
– clearerr函数
函数原型,void clearerr(FILE *fp)
功能:使文件错误标志置为 0
返值:无
说明:出错后,错误标志一直保留,直到对同一文件调 clearerr(fp)或 rewind或任何其它一个输入输出函数例 ferror()与 clearerr()举例
#include <stdio.h>
int main(void)
{
FILE *stream;
stream = fopen("DUMMY.FIL","w");
getc(stream);
if (ferror(stream))
{ printf("Error reading from DUMMY.FIL\n");
clearerr(stream);
}
if(!ferror(stream))
printf("Error indicator cleared!");
fclose(stream);
return 0;
}
– 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,能 永久 保存数据。
文件分类
按文件的逻辑结构:
记录文件,由具有一定结构的记录组成(定长和不定长)
流式文件,由一个个字符(字节)数据顺序组成
按存储介质:
普通文件,存储介质文件(磁盘、磁带等)
设备文件,非存储介质(键盘、显示器、打印机等)
按数据的组织形式:
文本文件,ASCII文件,每个字节存放一个字符的 ASCII码
二进制文件,数据按其在内存中的存储形式原样存放如 int 型数 10000
0010011100010000
内存存储形式
0010011100010000
二进制形式
0011000100110000001100000011000000110000
ASCII形式文本文件特点,
耗费存储量大、速度慢、便于对字符操作二进制文件特点,
节约存储空间、速度快、便于存放中间结果文本文件与二进制文件
– 文件处理方法
缓冲文件系统,高级 文件系统,系统自动为正在使用的文件开辟内存缓冲区
非缓冲文件系统,低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件输出文件缓冲区输入文件缓冲区程序数据区
a
缓冲文件系统:
缓冲区指令区程序用户数据区磁盘非缓冲文件系统:
文件类型指针
– 文件结构体 FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区
文件信息用系统定义的名为 FILE的结构体描述
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 *fp; //定义指向结构体的指针 fp
– 文件类型指针
指针变量说明,FILE *fp;
一般步骤,
– 定义文件指针变量。
– 文件打开 时,系统 自动 建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得 文件信息,访问文件
– 文件操作(读或写)
– 文 件关闭 后,它的文件结构体被释放文件名文件使用方式文件类型指针
C程序 操作系统磁盘文件的打开与关闭
C文件操作用 库函数 实现,包含在 stdio.h
文件使用方式,打开 -->读 /写 -->关闭
系统 自动 打开和关闭三个 标准文件,
标准输入 ------键盘 stdin
标准输出 ------显示器 stdout
标准出错输出 -----显示器 stderr
– 打开文件 fopen 函数
函数原型,FILE *fopen(char *name,char *mode)
功能:按指定方式打开文件
返值:正常打开,为指向文件结构体的指针;
打开失败,为 NULL(系统定义的常量 0 )
要打开的文件名使用文件方式例 文件打开与测试
FILE *fp;
fp=fopen(“aa.c”,“w”);
if(fp==NULL)
{ printf(“File open error!\n”);
exit(0);
}
例 FILE *f ;
fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”);
例 FILE *fp;
char *filename=“c:\\fengyi\\bkc\\test.dat”
fp= fopen(filename,”r”);
“r+/rb+” (读写 )
“a/ab” (追加 )
“w/wb” (只写 )
“r/rb” (只读 )
“w+/wb+” (读写 )
“a+/ab+” (读写 )
为 输入 打开一个文本 /二进制文件为 输出 打开或建立一个文本 /二进制文件为 读 /写 打开一个文本 /二进制文件为 读 /写 建立一个文本 /二进制文件为读 /写打开或建立一个文本 /二进制文件向文本 /二进制文件尾 追加 数据文件使用方式 含义
– 文件关闭 fclose 函数
作用,使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,将缓冲区数据写入文件
函数原型,int fclose(FILE *fp)
功能:关闭 fp指向的文件
返值:正常关闭为 0;出错时,非 0文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区
a
缓冲文件系统:
fclose
不关闭文件可能会 丢失数据
/*参考源程序 8-1.c*/
#include <stdio.h>
main()
{
FILE *fp;
long position;
fp=fopen("8-1.txt","w");
position=ftell(fp);
printf("When file is
created,position=%d\n",position);
fprintf(fp,"Sample data");
position=ftell(fp);
printf("After writing 11
characters,position=%ld\n",position);
fclose(fp);
}
文件的读写一 (8.3.1)
– 字符 I/O,fputc 与 fgetc 函数
fputc
– 函数原型,int fputc(int c,FILE *fp)
– 功能:把一字符 c( ASCII) 写入 fp指向的文件中
– 返值:正常,返回 c; 出错,为 EOF( -1)?fgetc
函数原型,int fgetc(FILE *fp)
功能:从 fp指向的文件中读取 一字节代码
返值:正常,返回读到的代码值 ;读到文件尾或出错,为 EOF
/*参考源程序 8-2.c*/
#include <stdio.h>
main()
{
FILE *fp;
char filename[20],ch;
printf("Enter filename:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("file open error.\n");
exit(0);
}
while((ch=fgetc(fp)!=EOF)
putchar(ch);
fclose(fp);
}
文件的读写二 (8.3.2)
字符串 I/O,fgets 与 fputs
函数 调用,char * fgets(str,n,fp)
int fputs(str,fp)
功能:从 fp指向的文件读 /写一个字符串
返值:
fgets正常时返回读取字符串的首地址;出错或文件尾,
返回 NULL
fputs正常时返回写入的最后一个字符;出错为 EOF
例 /*参考源程序 8-5.c*/
fgets 从 fp所指文件读 n-1 个字符送入 str指向的内存区,
并在最后加一个 ‘ \0’
(若读入 n-1个字符前遇换行符或文件尾( EOF) 即结束 )
fputs 把 str指向的字符串写入 fp指向的文件
main()
{ FILE fp; char str[81]; int i,len[N];
if((fp=fopen("f8-5.txt","w"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Input %d lines of characters:\n",N);
for(i=0;i<N;i++)
{ gets(str); len[i]=strlen(str); fputs(str,fp);
fputs("\n",fp); }
fclose(fp); printf("Output flie:\n");
if((fp=fopen("f8-5.txt","r"))==NULL)
{ printf("file open error.\n"); exit(0); }
for(i=0;i<N;i++)
{fgets(str,len[i]+1,fp); puts(str); fgets(fp);}
fclose(fp);}
文件的读 写三 (8.3.3)
– 格式化 I/O,fprintf 与 fscanf
函数调用形式:
fprintf(文件指针,格式字符串,输出表列 )
fscanf (文件指针,格式字符串,输出表列 )
功能:按格式对文件进行 I/O操作
返值:成功,返回 I/O的个数 ;出错或文件尾,返回 EOF
printf(“%d,%6.2f”,i,t); //将 i和 t按 %d,%6.2f格式输出到 屏幕
fprintf(fp,“%d,%6.2f”,i,t); //将 i和 t按 %d,%6.2f格式输出到 fp文件
scanf(,%d,%f”,&i,&t); //手工从 键盘 输入数据到 i,t中
fscanf(fp,“%d,%f”,&i,&t); //从 文件 fp中读入数据到变量 i,t中与常用的输入输出函数对比学习:
/*参考源程序 8-6.c*/
#include <stdio.h>
#include <string.h>
main()
{ FILE fp; int i,j,k,a[10];
if((fp=fopen("f8-61.txt","r"))==NULL)
{ printf("file open error.\n"); exit(0); }
for(i=0;i<10;i++)
fscanf(fp,"%d",&a[i]
fclose(fp);
if((fp=fopen("f8-62.txt","w"))==NULL)
{ printf("file open error.\n"); exit(0); }
k=0;
for(i=1;i<=4;i++)
for(j=0;j<i;i++)
{ fprintf(fp,"%d",a[k]); printf("%d",a[k]); k++; }
fprintf(fp,"\n"); printf("\n"); fclose(fp); }
文件的读写四 (8.3.4)
– 数据块 I/O,fread 与 fwrite
调用形式:
int fread (buffer,size,count,fp)
int fwrite(buffer,size,count,fp)
功能:读 /写数据块
返值:成功,返回读 /写的块数;出错或文件尾,返回 0
说明:
buffer,指向要输入 /输出数据块的 首地址 的指针
size,每个要读 /写的数据块的 大小 (字节数)
count,要读 /写的 数据块的个数
fp,要读 /写的 文件指针
fread与 fwrite 一般用于 二进制文件 的输入 /输出
/*参考源程序 8-7.c*/
#include <stdio.h>
#define N 3
struct student
{int num; char name[10]; int score[3];}s[N];
void writedata()
{ FILE *fp; int i;
if((fp=fopen("f8-7.txt","wb"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Input Data:\n");
for(i=0;i<N;i++)
scanf("%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0],&s[i].s
core[1],&s[i].score[2]);
for(i=0;i<N;i++)
if(fwrite(&s[i],sizeof(struct student),fp)!=1)
{printf("file write error\n"); fclose(fp); exit(0);}fclose(fp);}
/*参考源程序 8-7.c*/
void readdata()
{ FILE *fp; int i;
if((fp=fopen("f8-7.txt","rb"))==NULL)
{ printf("file open error.\n"); exit(0); }
printf("Output Data:\n");
for(i=0;i<N;i++)
{ if(fwrite(&s[i],sizeof(struct student),fp)!=1)
{printf("file write error\n"); fclose(fp); exit(0);}
printf("%-4d%-
10s%4d%4d%4d\n",s[i].num,s[i].name,s[i].score[0],s[i].score[
1],s[i].score[2]); }fclose(fp);}
main()
{ writedata(); readdata();}
文件的定位
– 几个概念
文件位置指针 -----指向当前读写位置的指针
读写方式
– 顺序读写:位置指针按字节位置顺序移动,叫 ~
– 随机读写:位置指针按需要移动到任意位置,叫 ~
– rewind函数
函数原型,void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返值:无例 对一个磁盘文件进行显示和复制两次操作
#include <stdio.h>
main()
{ FILE *fp1,*fp2;
fp1=fopen("ch12_4.c","r");
fp2=fopen("ch12_41.c","w");
while(!feof(fp1))
putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1))
putc(getc(fp1),fp2);
fclose(fp1);
fclose(fp2);
}
– fseek函数
函数调用,fseek(文件类型指针,位移量,起始点 )
功能:改变文件位置指针的位置
返值:成功,返回 0;失败,返回非 0值文件指针位移量(以起始点为基点,移动的字节数 )
>0 向后移动
<0 向前移动起始点文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例 fseek(fp,100L,0);
fseek(fp,50L,1);
fseek(fp,-10L,2);
ftell函数
函数原型,long ftell(FILE *fp)
功能:返回位置指针当前位置 (用相对文件开头的位移量表示 )
返值:成功,返回当前位置指针位置;失败,返回 -1L,
例 磁盘文件上有 3个学生数据,要求读入 1,3学生数据并显示
main()
{ int i;
FILE *fp;
if((fp=fopen("studat","rb"))==NULL)
{ printf("can't open file\n");exit(0); }
for(i=0;i<3;i+=2)
{ fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%s %d %d %s\n",
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
#include <stdio.h>
struct student_type
{ int num;
char name[10];
int age;
char addr[15];
}stud[3];
例 求文件长度
#include"stdio.h"
main()
{ FILE *fp;
char filename[80];
long length;
gets(filename);
fp = fopen(filename,"rb");
if(fp == NULL)
printf("file not found!\n");
else
{ fseek(fp,0L,SEEK_END);
length = ftell(fp);
printf("Length of File is %1d bytes\n",length);
fclose(fp);
}
}
出错的检测
– ferror函数
函数原型,int ferror(FILE *fp)
功能:测试文件是否出现错误
返值:未出错,0;出错,非 0
说明
– 每次调用文件输入输出函数,均产生一个新的
ferror函数值,所以应及时测试
– fopen打开文件时,ferror函数初值自动置为 0
– clearerr函数
函数原型,void clearerr(FILE *fp)
功能:使文件错误标志置为 0
返值:无
说明:出错后,错误标志一直保留,直到对同一文件调 clearerr(fp)或 rewind或任何其它一个输入输出函数例 ferror()与 clearerr()举例
#include <stdio.h>
int main(void)
{
FILE *stream;
stream = fopen("DUMMY.FIL","w");
getc(stream);
if (ferror(stream))
{ printf("Error reading from DUMMY.FIL\n");
clearerr(stream);
}
if(!ferror(stream))
printf("Error indicator cleared!");
fclose(stream);
return 0;
}