资源描述
第十三章文件
本章要点:
文件的基本概念文件的基本函数
文件的顺序读写文件的随机读写
文件简单应用§ 13. 1 C文件概述
文件的定义:所谓文件一般指存储在外部介质(如磁盘磁 带)上数据的集合。
操作系统是以文件为单位对数据进行管理的。
文件的分类
从用户观点:
1、特殊文件(标准输入输出文件或标准设备文件)2、普通文件(磁盘文件)
从操作系统的角度看,每一个与主机相连的输入输出设备看作是 一个文件。
例:输入文件:终端键盘输出文件:显示屏和打印机
如果输出成功,那么返回值就是输出的字符;如果输出失 败,那么返回一个EOF.
说明:
其中ch是要输出的字符,它可以是一个字符常量,也可以是‘个 字符变量。fp是文件指针变量。fputc(ch, fp)函数的作用是将字符(ch 的值)输出到fp所指向的文件中去。fpulc函数也带回一个值:如果输 出成功,那么返回值就是输出的字符;如果输出失败,那么返回一个EOF(即 -Do EOF是在sldio. h文件中定义的符号常量,值为-1。
在第4章介绍过putchar函数,其实putchar是从fpulc函数 派生出来的。pulchar(c)是在stdio. h文件中用预处理命令#define 定义的宏:#define putchar (c) fputc (c, stdout)前面已表达,sldout是系统定义的文件指针变量,它与终端输出相联。 fputc (c, stdout)的作用是将c的值输出到终端。用宏putchar (c)比写 fputc(c, stdout)简单一些。从用户的角度,可以把putchar (c)看作函 数而不必严格地称它为宏。
2^ fgets 函数
从指定的文件读人一个字符,该文件必须足以读或读写方式打 开的。
fgetc函数的调用形式为:ch=fgets (fp);
fp为文件型指针变量,ch为字符变量。fgetcc函数带回一个字 符,赋给ch。如果在执行fgetc函数渎字符时遇到文件结束符,函数返 回一个文件结束标志EOF(BP-l)。
函数功能:
从指定的文件读入一个字符,该文件必须是以读或读写方式打 开的。
返回值:
读取成功一个字符,赋给c h。如果遇到文件结束符,返回一 个文件结束标志EOFo如果想从一个磁盘文件顺序读入字符并在屏幕上显示出来,常见的读取 字符操作,从一个文本文件顺序读入字符并在屏幕上显示出来:
ch = fgetc (fp);while (ch!=EOF)
(putchar (ch);
ch = fgetc (fp);}
由于字符的ASCII码不可能出现T,因此EOF定义为是合适 的。当读入的字符值等于-1时,表示读入的已不是正常的字符而是文件 结束符。
注意:注意:EOF不是可输出字符,因此不能在屏幕上显示。由 于宁符的ASCII码不可能小现-1,因此EOF定义为T是合适的。当读人 的字符值等于-1(即EOF)时,表示读入的已不是正常的字符而是文件结 束符。但以上兴适用于读文本文件的情况。现在ANSI c已允许用缓冲 文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有 可能是T,而这又恰好是EOF的值。这就出现了需要读人有用数据而却 被处理为“文件结束”的情况。为了解决这个问题.ANSI C提供一个 feof函数来判断文件是否真的结束。feof(fp)用来测试fp所指向的文 件当前状态是否“文什结束”。如果是文件结束,函数fcof(fp)的值为 1(真);否那么为0(假)。
如果想顺序读人一个二进制文件中的数据。可以用从一个二进 制文件顺序读入字符:
while (1 feof (fp))(
ch = fgetc (fp);}
注意:ANSI C提供一个feof ()函数来判断文件是否真的结束。 如果是文件结束,函数feof (fp)的值为1 (真);否那么为0 (假)。 以上也适用于文本文件的读取。
3、fpetc和fgetc函数使用举例ttinclude <stdlib.h>
-include <stdio.h>void main(void)
{ FILE fp;/*定义文件指针*/
char ch, filename[10];scanf filencime);
if ((fp=fopen(filename, /Zw/Z))==NULL){ printfC'cannot open file\n〃);
exit (0);/*终止程序*/)
ch=getchar( ) ; /*接收接收执行在scanf语句最后输入的回车符*/
ch二getchar( ); /*接收输入的第一个字符*/ while(ch!=> )(
fputc(ch, fp);putchar (ch);ch=getchar ();
)putchar (10)/*向屏幕输出一个换行符*/
fclose (fp);运行情况如下:
filel.c(输入磁盘文件名)
computer and c# (输入一个字符串)computer and c (输出一个字符串)
文件名山键盘输入,赋给字符数组filename。fopen函数中的 第一个参数“文件名”可 以自接写成字符串常量形式(如filel.c) .也 可以用字符数组名,在字符数组中存放文件名(如本例所用的方法)。本 例运行时从键盘输人磁盘文件名“filel.c” ,然后输人要写入该 磁盘 文件的字符〃computer and c〃,是表示输入结束。程序将
“computer and c”写到以“filel.c”命名的磁盘文件中,同时在屏 幕上显示这些字符.以便核对。exit是标准C的库函数,作用是使程序 终止,用此函数应当加入stdli。头文件。
可以用DOS命令输出hlel.c文件中的内容:
Otype filel. c /computer Rnd c
证明了在filel, c文件中已存入了 "computerand cJ,的信息。
例2.将一个磁盘文件中的信息复制到另一个磁盘文件中^include <stdlib.h>
^include <stdio.h> main()
{ FILE *in,*out;char ch, infile[10], outfile[10];
printf ("Enter the infile name:\n/z);scanf(〃%s〃, infile);
printf ("Enter the outfile name:\nz,);scanf (z/%s,z, outf ile);
if((in=fopen(infile, 〃r〃))==NULL){ printf("cannot open infile\n〃); exit (0);
}if ((out=fopen(outfile, zzwz,))==NULL)
{ printf (""cannot open outfile\nz,); exit (0);)
while(!feof(in))fputc(fgetc (in),out);fclose(in);
fclose(out);
}运行情况如下:
Enter the infile name: filel,c/ (输入原有磁盘文件名)
Enter the outfile name:
file2. c/ (输入新复制的磁盘文件名)
程序运行结果是将filel. c文件中的内容复制到file2.c中去。 可以用下面DOS命令验证:
Otype filel. c /computerand c (filel. c 中的信息)
Otype file2. c /computerand c (file2. c 中的信息)
以上程序是按文本文件方式处理的。也可以用此程序来复制一 个二进制文件,只需将两个{open函数中的“r”和“w”分别改为 “rb”和“wb”即可。
也可以在输入命令行时把两个文件名一起输入。这时要用到 main函数的参数。程序可改为:
例:2B^include <stdlib.h>
ttinclude <stdio.h>void main(int argc, char *argv[])
{ FILE *in, *out;char ch;
if (argc!=3){ printf (Z/You forgot to enter a filename\n,/);
exit (0);)
if ((in=fopen (argv[ 1 ], z,r,z)) ==NULL){ printf (z,cannot open infile\n〃);
exit (0);)
if ((out=fopen (argv[2], "w")) =NULL){ printf ("cannot open outfile\n,z);
exit (0);)
while(!feof (in)) fputc(fgetc(in), out);fclose(in);
fclose(out);
)
假假设本程序的源文件名为a. c,经编译连接后得到的可执行文件 名为a.exe,那么在DOS命令工作方式下,可以输入以下的命令行:
Oa filel. c file2. c /
即在输入可执行文件名后,再输入两个参数film, c和file2. c, 分别输入到argv[1]和argv[2]中,argv[0]的内容为a, argc的值等于 3(因为此命令行共有3个参数)。如果输入的参数少于3个,那么程序会 输出:“你忘了输入一个文件名”。程序执行结果是将filel. c中的信 息复制到file2.c中。可以用以下命令验证:
Otype filel. c /computer and c (这是filel。c文件中的信息)
Otype file2. c /
computer and c (这是file2. c文件中的信息。可见 filel. c 已复制到 file2. c 中 了)。
最后说明一点,为了书写方便,系统把fputc和fgetc定义为 宏名putc和getc:
define putc(ch, fp)fputc(ch, fp)^define getc(fp)fgetc(fp)
这是在stdio. h中定义的。因此,用putc和fputc及用getc 和fgetc是一样的。一般可以把它们作为相同的函数来对待。
二、数据块读写函数(fread()和fwriteO)
用getc和putc函数可以用来读写文件中的一个字符。但是常 常要求一次读人一组数据(例如,一个实数或一个结构体变量的值), ANSTC标准提出没置两个函数(fread和fwri te),用来读写一个数据块。 它们的一般调用形式为:
fread (buffer, size, count, fp);
fwrite(buffer, size, count, fp);参数说明:
buffer:是一个指针。对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。
size:要读写的字节数。
count:要进行读写多少个size字节的数据项。
fp:文件型指针。
使用举例:
假设文件以二进制形式翻开:
fread (f, 4, 2, fp);
其中f是一个实型数组名。此函数从fp所指向的文件中读入2 个4个字节的数据-,存储到数组f中。
使用举例:假设有如下结构类型:
struct student type(char name[10];
int num;int age;
char addr[30];}stud[40];
结构体数组stud有40个元素.每一个元素用来存放一个学生 的数据(包括姓名、学号、年龄、地址)。假设学生的数据已有放在磁盘 文件中.可以用下面的for语句和fread函数读入40个学生的数据: 可以用fread和fwrite来进行数据的操作:
for (i=0; i < 4 0 ; i+ + =fread(&stud [i] , sizeof (struct student-type), 1,
fp);for ( i = 0 ; i < 4 0 , i + + =
按数据的组织形式:
1、ASCII文件(文本文件):每一个字节放一个ASCH代码二进制 文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存 放。
2、二进制文件
例:整数10000在内存中的存储形式以及分别按ASCII码形式和 二进制形式输出如程序
数据区
程序
数据区
输文件缓冲区1 :文件i
输入文件缓冲区ASCII文件和二进制文件的比拟:
ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般 占存储空间较多,而且要花费转换时间。二进制文件可以节省外存空间 和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
一般中间结果数据需要暂时保存在外存上,以后又需要输入内存 的,常用二进制文件保存。
ASCI】形式
fwrite(&stud [i] , sizeof(struct student-type),
1, fp);如果fread或fwrite调用成功,那么函数返回值为count的值,即输入 或输出数据项的先整个数。
例3从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去ttinclude <stdio. h>
^define SIZE 4 struct studenttype { char name[10];int num;
int age;char addr[15];
} stud [SIZE];/* 定义结构*/void save()
{ FILE *fp;int i;
if ((fp=fopen ("stuTist", "wb〃))=NULL) { printf("cannot open file\n〃); return;for (i=0;i<STZE;i++)
for (i=0;i<STZE;i++)
/*二进制写*/
if(fwrite(&stud[i],sizeof (struct
student_type), 1, fp)! = 1)printf (,zfile write error\n,z) ; /*出错处理*/ fclose(fp) ;/*关闭文件*/
)main ()
{ int i;for(i=0;i<SlZE;i++)/*从键盘读入学生信息*/
scanf("%s%d%d%s”, stud[i]. name, &stud[i]. num, &st ud[i]. age, stud[i]. addr);save( ) ;/*调用save ()保存学
生信息*/)
在main函数中,从终端键盘输入4个学生的数据,然后调用save 函数,将这些数据输出到以“slu list〃命名的磁盘文件中。fwfite函 数的作用是将一个长度为29字节的数据块送别stu list文件中(一个 student type类型结构体变量的长度为它的成员长度之和,即 0+2+2+15=29)。
运行情况如下:
输入4个学生的姓名、学号、年龄和地址:
Zhang 1001 19 room」01Fun 1002 20 room 102
Tan 1003 21 room_103Ling 1004 21 room_104
程序运行时,屏幕上并无输出任何信息,只是将从键盘输入的 数据送到磁盘文件上。为了验证在磁盘文件〃Stulist〃中是否已存在此 数据,可以用以下程序从“stu」ist”文件中读人数据,然后在屏幕上 输出。
ttinclude <stdio. h>ttdefine SIZE 4
struct studenttype{ char name[10];
int num;int age;
char addr[15];}stud[SIZE];
main(){ int i;
FILE*fp;fp=fopen(〃stu-list〃,〃rb〃);
for(i=0;i<SIZE;i++){ fread(&stud[i], sizeof(struct student_type), 1, fp); printf (/z%\-10s %4d %4d %\-15s\n,z, stud[i]. name,
stud[i]. num, stud[i]. age, stud[i]. addr); }fclose (fp);
}屏幕上显示出以下信息:
Zhang 1001 19 room_101Fun1002 20 room_102
Tan1003 21 room_103Ling 1004 21 room_104
请注意输入输出数据的状况。从键盘输入4个学生的数据 是ASCH码,也就是文本文件。在送到计算机内存时,回车和换行符转 换成一个换行符。再从内存以“wb方式(二进制写)输出到“stu」ist” 文件,此时不发生字符转换,按内存中存储形式原样输出到磁盘文件上。 在上面验证程序中,又用fread函数从〃stu list〃文件向内存读人数据, 注意此时用的是“rb”方式,即二进制方式,数据按原样输入,也不发 生字符转换。也就是这时候内存中的数据恢复到第一个程序向
“stu」ist”输出以前的情况。最后在验证程序中,用printf函数输 出到屏幕,printf是格式输出函数,输出ASCII码,在屏幕上显示字符。 换行符又转换为回车加换行符。
如果企图从“stu」ist〃文件中以〃r〃方式读人数据就会出错。
fread和fwrite函数一般用于二进制文件的输入输出。因为它们 是按数据块的长度来处理输入输出的,在字符发生转换的情况下很可能 出现与原设想的情况不同。
例如,如果写 fread(&stud[i], sizeof (structstudent_type),1, stdin);
企图从终端键盘输入数据•,这在语法上并不存在错误,编译能通 过。如果用以下形式输入数据:Zhang 1001 10 room」01 /
由于fread函数要求一次输入29个字节(而不问这些字节的内 容),因此输入数据中的空格也作为输人数据而不作为数据间的分隔符 了。连空格也存储到stud[i]中了,显然是不对的。
如果已有的数据已经以二进制形式存储在一个磁盘文件 "stu-dat"中,要求从其中读入数据并输出到“stu」ist”文件中, 可以编写一个load函数,从磁盘文件中读二进制数据。
#include <stdio.h>
♦♦define SIZE 10
struct student_type
{ char name[10];int num;
int age;char addr[15];
}stud[SIZE];
void load(){ FILE *fp;
int i;if ((fp=fopen (〃stu-dat〃,〃rb〃))—NULL)
{ printf (z,cannot open infile\n/z);
return;}for(i=0;i<SIZE;i++)
if(fread(&stud[i], sizeof(structstudent type), 1, fp)!=1)
{ if(feof(fp)) {fclose(fp); return;}
printf (z,file read error\nz,);
.) fclose (fp);)
main ()(
load();save ();
}三、格式化读写函数(fprintfO和fscanfO)
printf函数、fscanf函数与print函数、scanf函数作用相仿, 都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对 象不是终端而是磁盘文件。
它们的一般调用方式为:
fprintf (文件指针,格式字符串,输出表列);
fscanf (文件指针,格式字符串,输入表列);函数功能:
从磁盘文件中读入或输出字符。
例:
fprintf (fp, w %d, %6. 2f ",i, t);
fscanf (fpj;注意:
用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解, 但由于在输入时要将ASCH码转换为二进制形式,在输出时又要将二进 制形式转换成字符,花费时间比拟多。因此,在内存与磁盘频繁交换数 据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite 函数。
四、其他读写函数1、putw()和 getw()
大多数C编译系统都提供另外两个函数:putw和getw,用来对磁盘文 件读写一个字(整数)。例如:
函数调用:
putw(int i, FILE * fp);int i = getw(FILE * fp);
函数功能:
对磁盘文件中读写一个字(整数)。
例:putwdo, fp);它的作用是将整数10输出到fp指向的文件。而
i = getw(fp);的作用是从磁盘文件读一个整数到内存,赋给 整型变量i。
如果所用的C编译的库函数中不包括putw和getw函数,可以自己定义 这两个函数。
putw函数如下:
{ char *s;s=&i;
putc(s[O], fp);putc(s[l], fp);return (i);
}
调用putw函数时,如果用〃putw(10, fp); ”语句,形参i得到 实参传来的值10,在putw函数中将i的地址赋予指针变量s,而s是 指向字符变量的指针变量,因此s指向i的第1个字节,s+1指向i的 第2个字节。由于*(s+0)就是s[0], *(+s+l)就是s[l],因此,s[0]、 s[l]分别对应i的第1字节和第2字节。顺序输出s[0]、s[l]就相当于输出了 i的两个字节中的内容。
gutw函数定义如下:
gutw(FILE *fp)
(char s;
s=char *&i;s[0] = getc(fp);
s[l] = getc(fp);return i;
}注:putw和getw并不是ANSIC标准定义的函数。许多C编译都提供这 两个函数,但有的C编译可能不以putw和gctw命名此两函数,而用其 他函数名,请用时注意。
2、用户自定义读取其他类型数据的函数
如果用ANSTT提供的fread和fwrite函数,读写任何类型数据都 是十分方便的。如果所用的系统不提供这两个函数,用户只好自己定义 所需函数。例如.可以定义一个向磁盘文件写一个实数(用二进制方式) 的函数putfloat:
putfloat(float num, FILE *fp)(
char s;int count; s = (char*)#
for (count = 0;count < 4;count++) putc(s[count], fp);)
同样可以编写出读:写任何类型数据的函数。
3、fgets 函数函数作用:从指定文件读入一个字符串。
函数调用:fgets(str,n,fp); n为要求得到的字符,但只从如指向的文竹:输入nT个字符,然后在最后加一个,\0,字符,因此 得到的宁符申共有n个字符,把它们放到字符数组str中。如果在读完 nT个字符之前遇到换行符或EOF,读人即结束。
返回值:
fgers函数返回值为str的首地址。
4、fputs 函数fputs函数的作用足向指定的文件输出一个字符串。
函数作用:
向指定的文件输出一个字符串。
函数调用:
fgets ( "china",fp);C语言对文件的处理方法:
缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开 辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输 出。
非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而山程序 为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级 输入输出系统。
说明:
在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件 系统来处理二进制文件。ANSI C标准只采用缓冲文件系统来处理文本 文件和二进制文件。C语言中对文件的读写都是用库函数来实现。
§ 13. 2文件类型指针
缓冲文件系统中,关键的概念是“文件指引”。每个被使用的文 件都在内存中开辟一个区,用来存放文仆的有关信息(如文件的名字、 文什状态及文件当前位置等)O这些信息是保存在一个结构体变量中的。 该结构体类型是由系统定义的,取名为FILE。TurboC在sudio.h文件 中有以下的文什类型声明:
typedef struct{ shortlevel;/*缓冲区“满”或“空”的程
度*/unsignedflags; /*文件状态标志*/
把字符串“China〃输出到ft指向的文件。fputs函数中第一 个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的, '\o'不输出。假设输出成功,函数值为0;返回值:
输入成功,返回值为0;输入失败,返回EOF.
这两个函数类似以前介绍过的gets和puts函数,只是fgets 和fputs函数以指定的文件作为读写对象。
§ 13. 5文件的定位
文件中有一个位置指针,指向当前读写的位置。如果顺序读写一 个文件,每次读写一个字符,那么读写完一个字符后,该位置指针自动移 动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向 其他指定的位置,可以用后面介绍的有关函数。
顺序读写和随机读写:
顺序读写:位置指针按字节位置顺序移动。
随机读写:读写完上一个字符(字节)后,并不一定要读写其 后续的字符(字节),而可以读些文件中任意位置上所需要的字符(字 节)。
一、rewind 函数
rewind函数的作用是使位置指引重新返回文件的开头,此函 数没有返回值。
例4有一个磁盘文件,第一次将它的内容显示在屏幕上.第二次把它复 制到另一文件上。
#include<stdio. h>void main ()
{ FILE *pL *p2;pl=fopen(,zfilel. c〃, 〃r〃);
fp2=fopen Czfile2. c〃,〃w〃);while(!feof(fpl)) putchar(gete(fpl));
rewind (fpl);while(!feof(fpl)) pute(gete(fpl), fp2);
fclose(fpl); fclose(fp2);}
在第一次将文件的内容显示在屏幕以后,文件filell.c的位置指针 己指到文件末尾,feof的值为非零(真)。执行rewind函数,使文件的 位置指针重新定位于文件开头,并使feof函数的值恢复为0(假)。
二、fseek函数和随机读写(一般用于二进制文件)
对流式文件可以进行顺序读写,也可以进行随机读写,关键在于控 制文件的位置指针。如果位置指针是按字节位置顺序移动的,就是顺序 读写;如果能将位置指针按需要移动到任意位置,就可以实现随机读写。
所谓随机读写,是指读写完上一个字符(字节)后,并不一定要读写其后 续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。
函数功能:
改变文件的位置指针函数调用形式:
fseek(文件类型指针,位移量,起始点)说明:
起始点:文件开头SEEK_SET 0
文件当前位置SEEK_CUR 1
文件末尾SEEK_END 2
位移量:以起始点为基点,向前移动的字节数。一般要求为long 型〃位移量〃指以〃起始点〃为基点,向前移动的字节数。ANSIC和大多数 C版本要求位移量是[ong型数据。这样当文件的长度大于64KB时不致 出问题。ANSIC标准规定在数字的末尾加一个字母L,就表示是long型。 fseek函数一般用于二进制文件,因为文本文件要发生字符转换,计算 位置时往往会发生混乱。
下面是fseek函数调用的。
几个例子;
fseek(fp, 100L, 0);将位置指针移到离文件头100个字节处。
fseek(fp, 50L, 1);将位置指针移到离当前位置50个字节处。
fseek(fp, 50L, 2);将位置指针从文件末尾处向后退10个字节。
利用{seek函数就可以实现随机读写了。
例5在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。
#include<stdio. h>struct student_type
{ char name[10];int num;
int age;char sex;
}stud[10]; main()
{ int i;FILE *fp;
if ((fp=fopen (〃stiid-dat〃,〃rb〃))==NULL){ printf (,zcan not open file\n〃);
exit (0);}for(i=0;i<10;i+=2)
fseek(fp, i*sizeof(struct student_type),0);fread(&stud[i], sizeof(struct student_type),1, fp);
printf (//%s %d %d %c\n,z, stud[i]. name, stud[i]. num, s stud[i].sex);
.)fclose(fp);
)三、ftell函数
ftell函数的作用是得到流式文件中的当前位置,用相对于文件开头 的位移量来表示。由于文件中的位置指针经常移动,人们往往不容易知 道其当前位置。用ftell函数可以得到当前位置。如果ftell函数返回 值为TL,表示山错。
函数作用:
得到流式文件中的当前位置,用相对于文件开头的位移量 来表示。
返回值:
返回当前位置,出错时返回TL。
应用举例:
i = ftell(fp);
if(i==-lL) printf( error\nw );
变量i存放当前位置,如调用函数时出错(如不存在如文件),那么 输出“error”。
§ 13. 6出错的检测
C标准提供一些函数用来检查输入输出函数调用中的错误。
1、f err or 函数
在调用各种输入输出函数(如putc> getcs fread> fwrite等)时, 如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检 查。
调用形式:
ferror (fp);返回值:
返回0,表示未出错;返回非0,表示出错。
在调用一个输入输出函数后立即检查ferror函数的值,否那么信 息会丧失。在执行fopen函数时,febor函数的初始值自动置为0。
2^ cl ear err 函数
clearerr的作用是使文件错误标志和文件结束标志置为。。假设 在调用一个输入输出函数时出现错误,ferror函数值为一个非零值。在 调用clearerr (fp)后,ferror (fp)的值变成0。只要出现错误标志,就 一直保存,直到对同一文件调用clearerr函数或rewind函数,或任 何其他一个输入输出函数。
调用形式:
clearerr(fp);函数作用:
使文件错误标志和文件结束标志置为Oo
只要出现错误标志,就一直保存,直到对同一文件调用clearerr 函数或rewind函数,或任何其他一个输入输出函数。
文件输入输出小结头
分类函数名
功能
翻开文件fopen ()
翻开文件
关闭文件fcloseO
关闭文件
文件定位fseek ()
改变文件位置指针的位置
Rewind ()
使文件位置指针重新至于文件开
FtellO
返回文件位置指针的当前值
文件状态feofO
假设到文件末尾,函数值为真
Ferror ()
假设对文件操作出错,函数值为真
Clearerr()使ferror和feof 0函数值置零
fgetsO从指定文件读取字符串
文件读写fgetcO
getcO从指定文件取得一个字符
fputc ()
putcO把字符输出到指定文件
fputsO把字符串输出到指定文件getw()从指定文件读取一个字(int型)
putw() 把一个字输出到指定文件fread ()从指定文件中读取数据项
fwriteO 把数据项写到指定文件中fscanfO从指定文件按格式输入数据
fprintfO按指定格式将数据写到指定文件中附录资料:不需要的可以自行删除
Abstract: Based on the comprehensive analysis on the plastic part's structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introducedC语言详解-枚举类型
注:以下全部代码的执行环境为VC++ 6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#de行ne来完成这 项工作,您的代码可能是:
# define MON 1define TUE 2
# define WED 3dcfinc THU 4
# define FRI 5define SAT 6
# define SUN 7在此,我们定义•种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。
1 .定义一种新的数据类型-枚举型
以下代码定义了这种新的数据类型-枚举型enurn DAY
{
MON=1,TUE, WED, THU, FR1, SAT, SUN);
(1)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号, 隔开。
(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
(3)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加L(4)可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(5)枚举型是预处理指令#define的替代。
(6)类型定义以分号;结束。
2 .使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型血, 单精度浮点型float,双精度浮点型double,字符型char,短整型short等等。用这些基本数据 类型声明变量通常是这样:
char a; 〃变量a的类型均为字符型charcharletter;
intx,y,
z; 〃变量x,y和z的类型均为整型intint number;
double m, n;double result; 〃变量result的类型为双精度浮点型double
既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。
方法一:枚举类型的定义和变量的声明分开enum DAY
{
MON=1,TUE, WED, THU, FR1, SAT, SUN1;
enum DAY yesterday;enum DAY today;
enum DAY tomorrow;
展开阅读全文