第十章  文件
Download
1 / 78

第十章 文件 - PowerPoint PPT Presentation


  • 123 Views
  • Uploaded on

第十章 文件. 本章学习重点: 文件的基本概念 文件的打开、关闭 文件的读写 文件的定位、文件的检测. 本章目录. 第二十五讲 文件概述、文件打开与关闭 第二十六讲 文件读写 第二十七讲 文件的定位和文件的检测 本章小结. 结束. 第二十五讲 文件概述、文件打开与关闭. 【思考题 10-1 】 如果我们需要将程序运行结果存放到外存时,应该用什么方法存储呢?应该怎样读入数据或存储数据呢? ( 一 ) 程序分析 我们如果要将一个字符串 "This is a C program." 存放到一个文件中,应该怎么设计程序呢?请看下例。. 返回到本章目录.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第十章 文件' - idra


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

第十章 文件

本章学习重点:

文件的基本概念

文件的打开、关闭

文件的读写

文件的定位、文件的检测


本章目录

第二十五讲 文件概述、文件打开与关闭

第二十六讲 文件读写

第二十七讲 文件的定位和文件的检测

本章小结

结束


第二十五讲文件概述、文件打开与关闭

【思考题10-1】如果我们需要将程序运行结果存放到外存时,应该用什么方法存储呢?应该怎样读入数据或存储数据呢?

(一)程序分析

我们如果要将一个字符串"This is a C program."存放到一个文件中,应该怎么设计程序呢?请看下例。

返回到本章目录


二)编写程序代码

#include <stdio.h>

main()

{ FILE *fp;

fp=fopen("file1.txt","w");

fprintf(fp,"This is a C program.");

fclose(fp);

}

返回到本章目录


三)调试运行程序

在这个程序中,建立了一个名为"file1.txt"的文件,并将字符串"This is a C program."通过fprintf函数输出到文件中保存起来。同理,也可以用fscanf函数从文件"file1.txt"中输入该内容。该程序在屏幕上没有输出信息。

返回到本章目录


1.文件的定义

所谓文件,是指存储在外部介质上的数据的集合。计算机把所有外部设备都当做文件来对待,这样的文件称为设备文件。例如,键盘是输入文件,显示屏和打印机是输出文件,我们可以用scanf函数输入键盘文件,printf函数输出显示屏和打印机文件。实际上,外部设备的输入/输出操作就是读/写设备文件的过程,对设备文件的读/写与对一般磁盘文件的读/写方法完全相同。

返回到本章目录


2.数据文件的存储形式

根据数据的组织形式,可分为字符文件和二进制文件。

1)字符文件(文本文件)

字符文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符(即一个字符占一字节)。

2)二进制文件

二进制是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,这类文件可以节省内存空间。

返回到本章目录


3.标准文件系统和非标准文件系统

在过去使用的C版本中(如UNIX系统下使用的C)有两种对文件的处理方法:一种叫“缓冲文件系统”,一种叫“非缓冲文件系统”。

1)缓冲文件系统

所谓缓冲文件系统,是指系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。

返回到本章目录


2)非缓冲文件系统

所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件。

返回到本章目录


4.文件类型指针

1)文件类型FILE的定义

在进行文件操作时,要用到文件指针。文件指针用来指向被操作文件的有关信息(如文件名、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,类型名为FILE。有了FILE类型以后可以定义文件类型的指针变量。

返回到本章目录


2)文件类型指针的定义

(1)文件类型指针的定义格式如下:

(2)功能。定义一个文件类型的指针,使用这个指针可以对文件进行各种操作。

3)标准文件操作的四个基本步骤

(1)文件类型指针的定义;

(2)打开标准文件;

(3)标准文件的读或写的操作;

(4)标准文件的关闭操作。

FILE *指针变量标识符;

返回到本章目录


返回到本章目录


5 fopen
5在对文件操作之前必须“打开”文件,打开文件的作用实际上是建立该文件的信息结构体,并且给出指向该信息结构体的指针以便对该文件进行访问。文件使用结束之后应该“关闭”该文件。文件的打开与关闭是通过调用.文件的打开(fopen函数)

  • ANSI C规定了标准输入/输出函数库,用fopen()函数来实现文件的打开,其调用的一般格式如下:

  • 其中,fname是要打开的文件名,可以是字符串常数、字符型数组或字符型指针,文件名也可以带路径。mode表示文件的使用方式,它规定了打开文件的目的,如表10-1所示。

FILE *fp;

fp=fopen(fname,mode) ;

返回到本章目录


在对文件操作之前必须“打开”文件,打开文件的作用实际上是建立该文件的信息结构体,并且给出指向该信息结构体的指针以便对该文件进行访问。文件使用结束之后应该“关闭”该文件。文件的打开与关闭是通过调用10-1 fopen函数中的文件使用方式

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“ 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“\\”中的第一个表示转义字符,第二个表示路径分隔符“\”)。例如:

FILE *fp;

fp=fopen("c:\\user\\abc.txt","w");

其意义是以只写方式打开C驱动器磁盘下文件夹user 中的文件abc.txt,并使文件指针fp指向该文件。

返回到本章目录


6 fclose
6 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“.文件的关闭(fclose 函数)

文件使用完后应将它关闭,以保证本次文件操作的有效。用fclose函数关闭文件,其一般形式为:

例如:

fclose(fp);

如果文件关闭成功,fclose函数返回值为0,否则返回EOF(-1)。这可以用ferror函数来测试。

fclose(文件指针);

返回到本章目录


练一练 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“

【练习10-1】以只读的方式打开D盘的"d:\abc.txt"文件,语句应该怎么写?

解:打开文件函数为fopen,第一个参数为文件名;第二个为打开文件的方式,只读方式的模式为"r",所以语句写为:

FILE *fp;

fp=fopen("d:\\abc.txt","r");

返回到本章目录


【练习 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“10-2】以读写的方式打开D盘的"d:\abc.txt"文件,语句应该怎么写?(注意假设D盘中有该文件和没有该文件的两种情况。)

解:打开文件函数为fopen,第一个参数为文件名,文件名注意两侧有双括号引上,并将单个的斜线“\”改为双斜线“\\”即可。第二个为打开文件的方式,读写方式的方式为"r+"或"w+"。使用"r+"的情况是在不删除原有文件时(没有该文件时会出错);而"w+"则会删除原有文件,然后新建一个该名的文件。所以语句写为:

FILE *fp;

fp=fopen("d:\\abc.txt ","r+"); /*不删除原有文件时*/

或:

fp=fopen("d:\\abc.txt ","w+"); /*删除后新建该文件*/

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“练习10-3】 在【练习10-1】中打开"d:\abc.txt"文件后,如果想关闭该文件的语句是什么?

解:关闭文件的函数为fclose,参数为要关闭的文件指针名。所以语句写为:

fclose(fp);

返回到本章目录


第二十六讲 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“文件读写

一、fputc函数和fgetc函数

二、fputs函数和fgets函数

三、fwrite函数和fread函数

四、fprintf函数和fscanf函数

练一练

返回到本章目录


Fputc fgetc
一、 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“fputc函数和fgetc函数

【思考题10-2】若想将一些字符写入一个文本文件,然后输出到屏幕上,应该如何读写程序?

(一)程序分析

设计一个程序,将字符A、B、C和EOF写入文件"c:\file1.txt"中,然后再从文件"c:\file1.txt"中读出所有的字符并显示在屏幕上。

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“二)编写程序代码

#include "stdio.h"

main()

{ char a='A',b='B',c='C',filename[20];

FILE *fp;

clrscr(); /*清屏*/

printf("\nPlease input the write filename:");

scanf("%s",filename); /*从键盘读入文件名*/

if((fp=fopen(filename,"w"))==NULL) /*以只写方式打开文件*/

{ printf("write cannot open file\n");

exit(0);

}

fputc(a,fp); /*将字符变量a的值存入文件*/

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“三)调试运行程序

程序运行时,用户先输入文件路径及文件名"c:\file1.txt",程序以"w"方式打开文件,然后由函数fputc()依次将保存在变量a、b、c中的字符写到文件中,最后写入EOF并关闭文件。通过Windows资源管理器可以看到文件file1.txt被建立,其长度为4字节。然后程序再循环从该文件中输出A、B、C三个字符并显示到屏幕上,当遇到文件结束标志时循环结束。

程序运行结果如下:


1 fputc
1 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“.fputc函数

fputc函数是把一个字符输出(写入)到磁盘文件上,与其完全等价的还有putc()。它们的一般调用形式

其中,ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量。fputc(ch,fp)函数的作用是将字符(ch的值)输出到fp所指向的文件上。如果输出成功,函数的返回值是输出的字符;如果输出失败,则返回文件结束标志EOF。EOF是在stdio.h中定义的符号常量,值为-1,十六进制表示为0xFF。

fputc(ch,fp);

putc(ch,fp);

返回到本章目录


2 fgetc
2 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“.fgetc函数

fgetc函数是用来从指定文件中读取一个字符,与它完全等价的还有getc()。它们的调用格式如下:

其中,fp为文件指针。该函数的功能是从指定的文件读取一个字符,并赋给字符型变量ch。如果读取成功,函数返回读取的字符;如果遇到文件结束符,则返回一个文件结束标志EOF。

ch=fgetc(fp);

ch=getc(fp);

返回到本章目录


Fputs fgets
二、 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“fputs函数和fgets函数

【思考题10-3】若想将多个字符串写入一个文本文件,然后输出到屏幕上,应该如何读写程序?

(一)程序分析

设计一个程序,将字符串"Hello,"、"all "、"the "、"world "、"people!"写入文件"c:\file2.txt"中,然后再从文件"c:\file2.txt"中读出所有的字符串并显示在屏幕上。

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“二)编写程序代码

#include "stdio.h"

main()

{ char a[][9]={"Hello,","all ","the ","world ","people!"};

char filename[20],out[9];

int i;

FILE *fp;

clrscr(); /*清屏*/

printf("\nPlease input the write filename:");

scanf("%s",filename); /*从键盘读入文件名*/

if((fp=fopen(filename,"w"))==NULL) /*以只写方式打开文件*/

{ printf("write cannot open file\n");

exit(0);

}

返回到本章目录


for(i=0;i<=4;i++) 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“

fputs(a[i],fp); /*将字符串存入文件*/

fclose(fp);

/*以下为从文件中读出各字符串并显示在屏幕上*/

if((fp=fopen(filename,"r"))==NULL) /*以只读方式打开该文件*/

{ printf("read cannot open file\n");

exit(0);

}

while((fgets(out,9,fp))!=NULL) /*当fp指针没到文件尾部,取出一字符串*/

printf("%s",out);

fclose(fp); /*关闭该文件*/

}

返回到本章目录


fputc(b,fp); /* 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“将字符变量b的值存入文件*/

fputc(c,fp); /*将字符变量c的值存入文件*/

fputc(0xff,fp); /*将文件结束标志EOF存入文件*/

fclose(fp); /*关闭该文件*/

/*以下为输出文件内容*/

if((fp=fopen(filename,"r"))==NULL) /*以只读方式打开该文件*/

{ printf("read cannot open file\n");

exit(0);

}

while((a=fgetc(fp))!=EOF) /*当文件指针没到文件尾部时*/

putchar(a);

fclose(fp); /*关闭该文件*/

}

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“三)调试运行程序

程序运行时,用户先输入文件路径及文件名"c:\file2.txt",程序以"w"方式打开文件"c:\file2.txt",然后由fputs()依次将字符数组a中的各字符串写到文件"c:\file2.txt"中。然后程序再用循环方式从该文件中读出各字符串并显示到屏幕上。

程序运行结果如下:

返回到本章目录


3 fputs
3 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“.写文件字符串函数fputs()

(1)函数调用格式如下:

其中,字符串可以是一个字符串常量,或字符数组名,或字符指针变量名。

(2)功能。向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)字节。如果输出成功,则函数返回值为0;否则,为非0值。

fputs(字符串,文件指针);

返回到本章目录


4 fgets
4 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“.读文件字符串函数fgets()

(1)函数调用格式如下:

(2)功能。从指定文件中读入一个字符串,存入字符数组/指针中,并在尾端自动加一个结束标志'\0';同时,将读写位置指针向前移动strlength(字符串长度+1)字节。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。

fgets(字符数组名/指针名,字符串长度+1,文件指针);

返回到本章目录


Fwrite fread
三、 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“fwrite函数和fread函数

【思考题10-4】若想向文件中输入或从文件中读出结构体类型(成员为多种数据类型)的信息,应该用什么样的方法比较好?

(一)程序分析

设计一个程序,从键盘输入一批学生数据,然后存储到磁盘文件上,再输出磁盘文件中的学生数据到屏幕上。注意成块输入fread函数和成块输出fwrite函数的使用方法。

返回到本章目录


如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“二)编写程序代码

#include "stdio.h"

#include "string.h"

struct student /*定义学生结构体类型*/

{ int num; /*定义学号*/

char name[20]; /*定义姓名*/

int chinese,math,english; /*定义语文,数学,英语成绩*/

};

main()

{ FILE *fp;

int i;

char ch,filename[30];

float f;

struct student stu[30],st; /*定义结构体类型的变量*/

clrscr(); /*清屏*/

printf("\nPlease input the write filename:");

返回到本章目录


scanf("%s",filename); /* 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“从键盘读入文件名*/

if((fp=fopen(filename,"wb"))==NULL) /*以只写方式打开文件*/

{ printf("Cannot open %s file\n",filename);

exit(0);

}

/*循环读入一批学生信息,当输入n或N时输入结束输入*/

i=0;

do

{ printf("please input information of the %d student:",i+1);

printf("\nnumber name chinese math english\n");

scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].chinese,

&stu[i].math,&stu[i].english);

fwrite(&stu[i],sizeof(stu[i]),1,fp);

i++;

返回到本章目录


printf("Have another student record(y/n)?"); 如果文件名中包括文件的路径,则用双反斜线表示路径(双反斜线“

getchar();

ch=getchar();

}while(ch=='y'||ch=='Y'); /*当输入y或Y时继续输入*/

fclose(fp);

/*以下功能为将学生成绩读出并显示到屏幕上*/

if((fp=fopen(filename,"rb"))==NULL) /*以只读方式打开该文件*/

{ printf("read cannot open file %s!\n",filename);

exit(0);

}

printf("\nInformation of the student score:");

printf("\n number name chinese math english");

while(fread(&st,sizeof(st),1,fp)==1)

返回到本章目录


printf("\n%5d%7s%5d%5d%5d",st.num,st.name,st.chinese,st.math, st.english);

if(!feof(fp))

printf("\n file read error");

fclose(fp);

}

(三)调试运行程序

首先输入文件名"c:\file3.txt",程序以"wb"方式打开文件"c:\file3.txt",然后输入第一个学生信息,由函数fwrite()依次将一个学生信息写到文件"c:\file3.txt"中,然后出现提示是否继续输入下一条学生信息,当输入y或Y时继续输入,当输入n或N时输入结束输入,关闭该文件。然后以只读方式"rb"打开该文件,程序再用循环方式用函数fread()从该文件中读出各学生信息并显示到屏幕上。

返回到本章目录


程序运行结果如下 st.english);:

返回到本章目录


5 fwrite
5 st.english);.fwrite函数

(1)fwrite函数调用格式如下:

(2)说明。fwrite函数用来向指定文件中写入数据块。其中,buf为被写入数据在内存中存放的起始地址,可以是数组名或指向数组的指针;size为每次要写入的字节数;count为要写入的次数;fp为文件指针。

fwrite(buf,size,count,fp);

返回到本章目录


st.english);3)功能。该函数的功能是从buf所指向的内存区域取出count个数据项写入fp指向的文件中,每个数据项的长度为size,也就是写入的数据块大小为size*count个字节。如果函数执行成功,返回值为实际写入数据项的个数,否则若返回值小于实际需要写入数据项的个数count,则出错。当文件按二进制形式打开时,fwrite函数可以写入任何类型的信息。

返回到本章目录


6 fread
6 st.english);.fread函数

(1)fread函数调用格式如下:

(2)功能。该函数用于从文件中读取一个数据块。其中,buf为从文件中读取的数据在内存中存放的起始地址,size为一次读取的字节数,count为要读取的次数,fp为文件指针。该函数的功能是从fp所指的文件中,读取长度为size字节的数据项count次,存放到buf所指的内存单元中,所读取的数据块大小为size*count字节。当文件按二进制形式打开时,fread函数可以读出任何类型的信息。函数执行成功时,返回值为实际读出的数据项个数,否则若返回值小于实际需要读出数据项的个数count,则出错。

fwrite(buf,size,count,fp);

返回到本章目录


Fprintf fscanf
四、 st.english);fprintf函数和fscanf函数

【思考题10-5】 若想将多个不同类型的数据写入一个文本文件,然后输出到屏幕上,应该如何读写程序?

(一)程序分析

设计一个程序,从键盘输入一批学生信息,并将学生信息写入到一个二进制文件中,然后存储到磁盘文件上,再输出磁盘文件中的学生信息到屏幕上。注意格式化输入fprintf函数和格式化输出fscanf函数的使用方法。

返回到本章目录


st.english);二)编写程序代码

#include "stdio.h"

struct student

{ char name[10];

int num;

int age;

char addr[15];

}boy[2],*bp;

main()

{ FILE *fp;

char ch,filename[20];

int i;

clrscr(); /*清屏*/

printf("\nPlease input the write filename:");

gets(filename); /*读取文件名*/

bp=boy;

返回到本章目录


if((fp=fopen(filename,"wb+"))==NULL) st.english);

{ printf("Cannot open file!");

getch();

exit(1);

}

printf ("input 2 boy information:");

printf("\nname num age addr:\n");

for(i=0;i<2;i++,bp++)

scanf("%s%d%d%s",bp->name,&bp->num,&bp->age,bp->addr);

bp=boy;

for(i=0;i<2;i++,bp++) /*依次将学生信息存入文件中*/

fprintf(fp,"%s %d %d %s\n",bp->name,bp->num,bp->age,bp->addr);

fclose(fp);

返回到本章目录


/* st.english);以下功能是将信息显示到屏幕上*/

if((fp=fopen(filename,"r"))==NULL) /*以只读方式开该文件*/

{ printf("read cannot open file %s!\n",filename);

exit(0);

}

bp=boy; /*bp指针重新指向结构体数组首地址*/

for(i=0;i<2;i++,bp++) /*将文件中学生信息读取到结构体数组中*/

fscanf(fp,"%s %d %d %s\n",bp->name,&bp->num, &bp->age,bp->addr);

printf("name\t number age addr\n");

bp=boy;

for(i=0;i<2;i++,bp++)

printf("%s\t%5d%10d%12s\n",bp->name,bp->num,bp->age,bp->addr);

fclose(fp);

}

返回到本章目录


st.english);三)调试运行程序

返回到本章目录


7 fprintf
7 st.english);.fprintf函数

fprintf函数与printf函数作用相仿,都是格式化写入函数,只不过写入对象不是终端而是文件。其调用格式为:

该函数的功能是按格式字符串的格式,将输出表列的值写入文件指针所指向的文本文件中。注意:输出表列为变量名,不是变量的地址,不能在变量前加“&”符号。

fprintf(文件指针,格式字符串,输出表列);

返回到本章目录


8 fscanf
8 st.english);.fscanf函数

  • fscanf函数与scanf函数作用相仿,都是格式化读取函数,只不过不是从终端读取而是从文件读取。其调用格式为:

  • 该函数的功能是从文件指针所指向的文本文件中读取数据,按格式字符串的格式存入输入表列变量所指向的内存中。注意:输入表列为变量的地址,除字符串输入(用字符数组名接收该字符串)不加“&”符号外,其他变量名前必须加“&”符号。

fscanf(文件指针,格式字符串,输入表列);

返回到本章目录


9 st.english);.文件的其他读写函数

(1)判断文件是否结束函数feof(),函数调用格式如下:

其中,fp是文件指针。函数功能为判断文件指针fp所指文件是否结束,如果遇到文件结束,函数返回值为1,否则函数返回值为0。

(2)文件读/写整数函数,putw和getw。对于大多数C编译系统来说,都提供这两个函数,用来对磁盘读/写一个字(整数)。getw函数的调用格式为:

feof(fp);

整型变量名=getw(文件指针名);

返回到本章目录


putw st.english);函数的调用格式为:

例如:

putw(10,fp);

作用是将整数10写入fp所指的文件,而语句:

i=getw(fp);

作用是从文件读一个整数到内存,赋给变量i。

putw(整型常量,文件指针名);

返回到本章目录


练一练 st.english);

【练习10-4】编写一个程序:从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,输出到磁盘文件"c:\upper.txt"中保存。输入的字符串以"!"结束。然后再将文件"c:\upper.txt"中的内容读出显示在屏幕上。

解:源程序如下:

#include "stdio.h"

main()

{ FILE *fp;

char str[100],filename[10];

int i=0;

返回到本章目录


if((fp=fopen("c:\\upper.txt","w"))==NULL) st.english);

{ printf("Can not open file\n");

exit(0);

}

printf("Enter a string:\n");

gets(str);

while(str[i]!='!')

{ if(str[i]>='a'&&str[i]<='z')

str[i]=str[i]-32;

fputc(str[i],fp);

i++;

}

返回到本章目录


fclose(fp); st.english);

fp=fopen("c:\upper.txt","r");

fgets(str,strlen(str)+1,fp);

printf("%s\n",str);

fclose(fp);

}

程序运行结果如下:

返回到本章目录


第二十七讲 文件的定位和文件的检测 st.english);

一、文件的定位函数

二、文件的检测函数

练一练

返回到本章目录


一、文件的定位函数 st.english);

【思考题10-6】如果想将【思考题10-4】的程序生成的"c:\file3.txt"文件中第奇数个学生的信息输出,应该怎样实现?

(一)程序分析

首先使用fopen()函数以二进制只读"rb"的方式打开该文件,然后采用重定位函数对文件的指针进行定位,每次指针位置移动两个结构体大小,直到全部输出为止。

返回到本章目录


(二)编写程序代码 st.english);

#include "stdio.h"

#include "string.h"

struct student /*定义学生结构体类型*/

{ int num /*定义学号*/

char name[20]; /*定义姓名*/

int chinese,math,english; /*定义语文,数学,英语成绩*/

};

main()

{ FILE *fp;

int i;

char ch,filename[30];

float f;

struct student stu[30]; /*定义结构体类型的变量*/

返回到本章目录


clrscr(); st.english);

printf("\nPlease input the write filename:");

scanf("%s",filename); /*从键盘读入文件名*/

if((fp=fopen(filename,"rb"))==NULL) /*以只读方式打开文件*/

{ printf("Cannot open %s file\n",filename);

exit(0);

}

printf("\nInformation of the student score:");

printf("\n number name chinese math english\n");

返回到本章目录


for(i=0;i<3;i+=2) st.english);

{ fseek(fp,i*sizeof(struct student),0); /*对文件指针重定位*/

fread(&stu[i],sizeof(struct student),1,fp); /*读出第i个学生信息*/

printf("\n%5d%9s%7d%9d%7d",stu[i].num,stu[i].name,stu[i].chinese,

stu[i].math,stu[i].english);

}

fclose(fp);

}

返回到本章目录


(三)调试运行程序 st.english);

输入要打开的文件名,输入"c:\file3.txt",程序显示运行结果如下:

返回到本章目录


1 rewind
1 st.english);.文件指针重返到文件头部函数rewind

(1)函数调用格式如下:

(2)功能。rewind函数使文件指针指定的文件的位置指针指向文件的开始位置(文件头)。

rewind(文件指针);

返回到本章目录


2 ftell
2 st.english);.返回文件当前指针位置函数ftell

(1)函数调用格式如下:

(2)功能。可以用ftell函数来返回文件指针的当前位置。

(3)说明。由于在文件的随机读写过程中,位置指针不断移动,往往不容易搞清当前位置,这时就可以使用ftell函数得到文件指针的当前位置。ftell函数的返回值为一个长整型数,表示当前位置相对文件头的字节数,出错时返回-1L。

ftell(文件指针);

返回到本章目录


3 fseek
3 st.english);.移动文件指针到指定位置fseek函数

(1)函数调用格式如下:

(2)功能。将文件指针指到以“起始位置”定位点为初始位置,移动“位移量”字节后的位置上。如果文件定位成功,则fseek返回0,否则返回一个非0值。

fseek(文件指针,位移量,起始位置);

返回到本章目录


说明: st.english);

起始位置分别有0(文件开始)、1(文件当前位置)和2(文件末尾)三种情况。

位移量可正可负。位移量为正数时,位置指针向后移动;位移量为负数时,位置指针向前移动。

“起始位置”是初始位置的“定位代码”,表示从文件的哪一点开始测量“位移量”,按表10-2所示的规定方式取值,既可以是标准C规定的常量名,也可以取对应的数字。

注意:位移量一般被要求是长整(long)型数据,这样当文件的长度大于64KB时不致出问题。

返回到本章目录


二、文件的检测函数 st.english);

【思考题10-7】当要打开的文件不存在时,显示错误提示信息,若存在时,输出文件中的所有信息,程序应该如果编写?

(一)程序分析

首先使用fopen()函数以只读"rb"的方式打开该文件,若文件不存在,则给出提示信息(在此处使用ferror函数和clearerr函数)。若存在,则将该文件的信息全部输出,直到文件结束为止。

返回到本章目录


(二) st.english);编写程序代码

#include "stdio.h"

main()

{ char c,filename[30];

FILE *fp;

clrscr(); /*清屏*/

printf("\nPlease input the open filename:");

scanf("%s",filename); /*从键盘读入文件名*/

fp=fopen(filename,"r");

if(ferror(fp)) /*若文件指针出错,即没打开该文件*/

返回到本章目录


{ printf("Error reading from %s file\n",filename); st.english);

clearerr(fp); /*将文件出错指针置为0*/

exit(0);

}

else

{ while ((c=fgetc(fp))!=EOF) /*当文件指针没到文件尾部时*/

putchar(c);

fclose(fp); /*关闭该文件*/

}

}

返回到本章目录


(三)调试运行程序 st.english);

当输入的文件名存在时,程序会输出该文件中的所有字符,运行结果如下:

当输入的文件名不存在时,程序会给出错误提示信息,运行结果如下:

返回到本章目录


C st.english);标准中有一些检测输入/输出函数调用中的错误的函数,主要有文件结束检测函数feof()、文件出错检测函数ferror()及文件出错标志和文件结束标志置0函数clearerr()三个。

返回到本章目录


4 feof
4 st.english);.文件结束检测函数feof()

(1)函数调用格式如下:

(2)功能。feof()函数用来判断“文件指针”指向的文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。

int feof(文件指针);

返回到本章目录


5 ferror
5 st.english);.文件出错检测函数ferror()

大多数输入/输出函数不具有明确的出错信息返回,在调用各种输入/输出函数(如fputc、fgetc、fread、fwrite等)时,如果出现了错误,除了函数返回值有所反映外,还可以用ferror函数检测。

(1)函数调用格式如下:

(2)功能。ferror()函数用来检查文件fp在用各种输入/输出函数进行读/写时是否出错,若出错,返回值为1,否则返回0。

int ferror(文件指针);

返回到本章目录


6 0 clearerr
6 st.english);.文件出错标志和文件结束标志置0函数clearerr()

(1)函数调用格式如下:

(2)功能。clearer()函数用来使文件的错误标志和文件结束标志置为0。假设在调用一个输入/输出函数时出现错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变成0。

int clearer(文件指针);

返回到本章目录


7 st.english);.常用文件操作函数表

返回到本章目录


练一练 st.english);

【练习10-5】设计一个程序实现人员登录,即每当从键盘接收一个姓名时,便在文件"c:\member.dat"中进行查找。若此姓名已存在,则显示相应信息,若文件中没有该姓名,则将其存入文件(若文件"c:\member.dat"不存在,应在磁盘上建立一个新文件)。当输入姓名按<回车>键或处理过程中出现错误时程序结束。

解:源程序如下:

#include "stdio.h"

main()

{ FILE *fp;

int flag;

char name[20],data[20];

返回到本章目录


if((fp=fopen("c:\\member.dat","a+"))==NULL) /* st.english);以追加方式打开文件*/

{ printf("Open file error\n");

exit(0);

}

do

{ printf("Enter name(end with input empty):\n");

gets(name); /*读入字符串*/

if(strlen(name)==0) /*当输入名字为空时跳出循环*/

break;

strcat(name,"\n"); /*为字符串加一个回车符*/

rewind(fp); /*文件指针重新回到文件头*/

flag=1;

返回到本章目录


while(flag&&(fgets(data,30,fp)!=NULL)) st.english);

/*当输入名字正确且从文件中读数据正确时*/

if(strcmp(data,name)==0) /*若输入名字与已存名字相同*/

flag=0;

if(flag)

fputs(name,fp);

else

printf("\nThis name has been existed!\n");

}while(ferror(fp)==0); /*当文件指针不出错时*/

fclose(fp);

}

返回到本章目录


程序运行结果如下: st.english);

返回到本章目录


本章小结 st.english);

  • 本章着重介绍了文件、文件系统、文件指针的概念,文件的打开和关闭,文件的基本操作、文件的定位,文件的检测等内容。特别是文件的字符级、字符串级、数据块级的输入/输出函数,在文件操作中非常重要。

  • 磁盘文件可以分为文本文件和二进制文件两种存储方式,每个磁盘文件都有一个文件结束符标记文件结束位置。

返回到本章目录


本章小结 st.english);

  • 本章着重介绍了文件、文件系统、文件指针的概念,文件的打开和关闭,文件的基本操作、文件的定位,文件的检测等内容。特别是文件的字符级、字符串级、数据块级的输入/输出函数,在文件操作中非常重要。

  • 磁盘文件可以分为文本文件和二进制文件两种存储方式,每个磁盘文件都有一个文件结束符标记文件结束位置。

返回到本章目录


ad