首页计算机计算机软件C语言程序设计 10 第9章 文件.ppt

10 第9章 文件.ppt

页数:44页文件大小:456.0 KB来源: C语言程序设计ppt课件

本课件先说明使用数据文件的目的、文件分类与文件类型指针,随后讲解文件的打开与关闭、按字符与字符串、按格式以及按数据块读写文件的标准函数,最后给出文件定位与出错检测函数的使用方法及用好文件的注意事项。

第9章 文件,讲解的使用9.1文件的基本概念
第八章 概述,讲解文件是程序设计语言的重要内容、文件内容的学习方法等内容
9.1 文件的基本概念,讲解文件的基本概念
查看本课件的文字版(共 44 页,供检索与复制)

第1页:第9章 文件

第9章 文件

指针类型2.打开和关闭3.输入输出函数9.3用好文件要点9.4小结结束教学内容教学要求1.了解文件的概念2.了解文件类型指针的定义和含义3.掌握文件操作的相关标准函数4.了解文件定位的操作及相关的标准函数5.了解出错检测函数的作用

  • 的使用9.1文件的基本概念

第2页:第八章 概述

第八章 概述

(P184)文件是程序设计语言的重要内容,在很多语言中都有关于文件操作的专门语句,这方面,C语言与其他程序设计语言截然不同:C语言没有单独的文件操作语句,有关文件的操作均是通过库函数进行的。

因此,文件内容的学习方法,是在明确文件的基本概念之后,学习和掌握与文件有关的库函数。

第3页:9.1 文件的基本概念

9.1 文件的基本概念

什么叫文件?

文件是具有名字、存储于外存的数据的集合。

计算机所有的数据和程序都以文件的形式保存在外存上。

文件具有驻留性和长度的可变性,它是操作系统能够独立进行存取的最小单位。

操作系统是怎么对文件进行管理的?

通过目录将文件组织成树状结构来实现的,目录是子目录和文件的集合,用户对文件、目录的操作通过目录和文件名字实现。

每个文件或目录必须有且只有一个惟一的名字,包括盘符名、路径、主文件名和文件扩展名4部分信息。

  • 1文件的基本概念(P184)

第4页:9.1 文件的基本概念

9.1 文件的基本概念

文件的按名存取如果想使用存储在外部介质中的数据,必须根据文件名,在目录结构中找到所需的文件,再从该文件中读取数据。

要将数据保存到外存中,也必须先建立一个文件,才能向它输出数据。

  • 文件输入输出的概念程序在内存中运行的过程中与外存交互主要是通过以下两种方法:
  • 以文件为单位将数据写到外存中
  • 从外存中读取文件中的数据。将向外存写入信息称为“输出”;由外存取信息称为“输入”。

第5页:9.1 文件的基本概念

9.1 文件的基本概念

操作系统的观点输出输入的对象是文件,操作系统一般采用统一的观点,把所有与输入输出(简称IO)有关的操作对象统一到“文件”概念里,程序都通过文件来实现,各种标准设备(如键盘、显示器和打印机等)、其他IO设备等也看作文件(叫设备文件),甚至给它们确定了“文件名”。

  • 使用数据文件的目的
  • 数据文件的改动不引起程序的改动(程序与数据分离)
  • 不同程序可访问同一文件中的数据(数据共享)
  • 能长期保存程序运行的中间数据或结果数据

第6页:9.1 文件的基本概念

9.1 文件的基本概念

  • 一般文件分类
  • 按文件的逻辑结构
  • 记录文件由具有一定结构的记录组成
  • 流式文件由一个个字符(字节)数据顺序组成
  • 按存储介质
  • 普通文件存储介质文件(磁盘、磁带等)
  • 设备文件非存储介质(键盘,显示器,打印机等)
  • 按数据的组织形式(存储方式)
  • 文本文件又称为ASCII文件,每个字节存放一个字符的ASCII码
  • 二进制文件数据按其在内存中的存储形式原样存放

第7页:9.1 文件的基本概念

9.1 文件的基本概念

整数12345在内存中的表示0011000000111001(高字节)(低字节)文本文件0011010100110100001100110011001000110001('5')('4')('3')('2')('1')二进制文件0011000000111001用二进制输出用文本形式输出二进制文件特点:存储量小(占2个字节)、速度快(不需转换)、便于存放中间结果、不可视文本文件特点:存储量大(占5个字节)、速度慢(需要转换)、便于对字符操作、可视

  • 文本文件和二进制文件的特点

第8页:9.1 文件的基本概念

9.1 文件的基本概念

C语言文件存储方式“流”是指一串连续的信息序列,即文件格式用字节解释,在字符之间不会自动插入间隔符。

从逻辑结构上,C语言把文件看作是一个字节序列(流式文件)。

根据数据的存储方式,可分为文本文件(字节流)和二进制文件(比特流)。

C语言IO库函数C语言本身没有IO机制,没有与IO有关的关键字或语言结构,但提供了一组IO库函数。

ANSIC把IO作为标准库的一部分,以提高C程序的可移植性。

所有与IO有关的机制都统一于文件操作函数库中,并提供一组标准IO函数。

第9页:9.1 文件的基本概念

9.1 文件的基本概念

标准错误流(stderr)通常直接与显示器连接。

对三个文件的操作不需要指定文件指针,也不需要打开文件的操作,因为它们的打开和关闭由系统管理,程序运行的过程中,用户随时可以使用它们进行输入输出操作。

以前用的标准IO操作都是对这些流进行的。

如前面使用的格式化IO等输入输出函数(printf、scanf)均是针对标准输入输出而言的。

  • 三个特殊的流文件C程序启动时自动建立三个文件指针:
  • 标准输入流(stdin)与OS的标准输入相连接
  • 标准输出流(stdout)与OS的标准输出连接

第10页:9.1 文件的基本概念

9.1 文件的基本概念

缓冲文件系统概念系统自动地为每一个正在使用的文件再内存中开辟一块存储区(数据缓冲区)作为文件与使用数据的中介。

从内存向磁盘输出数据必须先将数据送到缓冲区,装满缓冲区后才一起写到磁盘上。

从磁盘向内存读入数据时,先从磁盘上将数据读入缓冲区,程序再从缓冲区读取数据。

ANSI标准库采用“缓冲式”IO方式。

  • 缓冲文件系统
  • 使用缓冲区的目的为缓和外存在数据提供(慢)和程序对数据的使用(快)的速度差别。
  • 缓冲文件系统示意图磁盘文件输出文件缓冲区输入文件缓冲区程序数据区

第11页:9.1 文件的基本概念

9.1 文件的基本概念

缓冲区的处理一个文件打开时,系统为创建的文件建立一个缓冲区,文件与程序的数据传递通过这个缓冲区进行。

文件关闭时缓冲区被释放。

缓冲区与外存的数据操作由操作系统完成不需要C程序分入,虽然在程序与外存间有一个缓冲区,但从操作效果看却似乎没有这个中间过程,程序就像是直接在与外存打交道。

缓冲区的大小缓冲区的大小由具体的C版本确定,一般为512字节(一个磁盘扇区的容量,磁盘读写的最小单位)。

第12页:9.1 文件的基本概念

9.1 文件的基本概念

C语言文件处理的基本操作文件操作的第一步是建立与文件关联的流,从已有文件中输入数据要创建输入流,向文件输出数据要建立输出流,还可能建立输入输出流。

建立联系(创建流)的操作称作“打开文件”,文件打开后就可以对它进行数据读写的操作。

当文件不再需要时,程序可以切断与文件的联系,撤销对应流,这称为“关闭文件”。

文件处理的基本操作包括流创建(打开文件)、读写(通过流对文件的读和写)、撤销(关闭文件)及其他辅助函数。

第13页:9.2 文件

9.2 文件

2文件的使用为了能在程序中方便地使用文件,应该使用标准库的文件操作函数,通过建立输入输出流的方式使用文件。

EOF是stdio.h上中定义的宏,它的值是-1,在文件操作中经常用来表示文件操作的结果状态。

  • 的使用

第14页:9.2 .1文件指针类型

9.2 .1文件指针类型

文件指针缓冲文件系统的关键概念是“文件指针”,系统为每一个使用的文件在内存中开辟一个存储区,用于存放文件的有关信息,这些信息用一个结构变量保存,该结构类型的名字是FILE,由系统定义,TurboC在stdio.h文件中定义FILE结构类型。

typedefstruct{ shortlevel;unsignedflags;charfd;unsigned charhold;shortbsize;unsigned char*buffer;unsigned char*curp;unsignedistemp;shorttoken;}FILE;在stdio.h文件中定义FILE结构类型

  • 文件指针类型
  • FILE结构的内容

第15页:9.2 .1文件指针类型

9.2 .1文件指针类型

系统为每一个打开的文件分配一个区以存放FILE结构,程序通过FILE类型指针建立和文件的联系,进行关于文件的一切操作。

如下例定义了一个文件类型指针中fp:FILE*fp;

一个文件通过打开文件操作与fp建立联系。通过fp,能够访问fp关联的文件,所有关于该文件的读写操作均通过fp完成。

一般地说,每一个文件需要一个指向FILE的指针变量,文件操作使用这个指针变量即可,读者不需要知道FILE结构的具体含义。

  • 说明

第16页:9.2 .2文件的打开和关闭

9.2 .2文件的打开和关闭

fopen函数的作用按指定方式打开文件,返回FILE指针值。用FILE指针变量接受fopen返回值后,就可以通过指针进行各种文件操作。

fopen(char*fame,char*mode)
  • 文件的打开和关闭文件的打开和关闭是访问任何一个文件必须进行的一组基本操作。
  • 文件打开(fopen函数)
  • fopen函数的原型FILE*
  • 返回值文件打开成功,返回指向FILE结构的指针;打开出错,返回空(NULL)指针值。

第17页:9.2 .2文件的打开和关闭

9.2 .2文件的打开和关闭

含义文件使用方式为输入打开一个文本/二进制文件“r”/ “rb”(只读)为输出打开或建立一个文本/二进制文件“w”/ “wb”(只写)向文本/二进制文件尾追加数据“a”/ “ab”(追加)为读/写打开一个文本/二进制文件“r+”/“rb+”(读写)为读/写建立一个文本/二进制文件“w+”/“wb+”(读写)为读/写打开或建立一个文本/二进制文件“a+”/“ab+”(读写)

用“a+”时,原文件内容保留,位置指针移到文件末尾。对文件可以添加内容,也可读取数据。

对以读方式打开的文件,使用时有特殊规定。文件必须存在,并且只能用于输入,不能用于输出。

用写方式打开的文件,只能用于输出,不能用于输入。如果要打开的文件不存在,则创建该文件;如果存在,先将该文件删去,重新建立一个同名新文件。

用添加方式打开文件,文件必须存在,文件的内容保留。打开文件时,文件位置指针移到文件尾。可在文件尾部继续写入数据。

  • 参数
  • fame是被打开文件名的字符串
  • mode是指定文件打开方式的字符串,基本方式包括:
  • 用“+”方式打开的文件可以读,也可以写。
  • 用“r+”时,文件已经存在,以便从文件中读数据。
  • 用“w+”时,则新建一个文件,可以先写后读。

第18页:9.2 .2文件的打开和关闭

9.2 .2文件的打开和关闭

fclose函数的作用使文件指针变量不再指向与该文件对应的FILE结构,从而断开与文件的关联。

使用一个文件后应该将其关闭,防止它再被误用。

再次打开文件,可以使原指针指向新的文件。

fclose(FILE*fp)
  • 文件关闭(fclose函数)
  • fclose函数的原型int
  • 返回值正常关闭为0;出错时,非0(EOF)。

第19页:9.2 .2文件的打开和关闭

9.2 .2文件的打开和关闭

应该养成在使用文件后关闭文件的习惯一个C程序能同时打开的文件数有限,文件用完后应及时关闭。如果不关闭文件,将会丢失数据。

fopen ("文件名", "r" ) ; if ( fp == NULL){ … } else{ … } fclose(fp)
  • 说明
  • 关闭文件会引起系统对缓冲区一系列操作
  • 将输出缓冲区的数据输出到文件
  • 丢掉输入缓冲区的内容
  • 释放动态缓冲区。
  • 程序退出时所有文件将自动关闭
  • 文件使用的步骤打开文件
  • 文件读/写
  • 关闭文件
  • FILE*fp ;fp =

第20页:9.2 .3文件的输入

9.2 .3文件的输入

顺序读写指从文件中一个接一个地读写数据,仅当读写了前一个数据后,才能读写下一个数据。顺序读写后,位置指针自动下移一个位置。标准I/O只能进行顺序读写。

随机读写指从文件中读写数据时不考虑数据在文件中的位置,也就是说,可以在文件的任何位置读写。随机读写在读写数据前,需要将文件位置指针移到读写位置。

  • 输出函数
  • 文件的输入、输出函数(p188)
  • 文件的输入输出操作的几个概念。
  • 文件位置指针指向当前读写位置的指针。

第21页:9.2 .3文件的输入

9.2 .3文件的输入

  • 输出函数
  • 文件位置指针的位置确定
  • 以读或写方式打开,位置指针设置在文件头
  • 以附加方式打开,位置指针设置在文件末尾
  • 随着读写操作的进行,位置指针随读写过程自动“移动”,总指着随后的读写操作的位置
  • 调用标准库提供的直接对文件位置指针操作函数,可以移动位置指针所指位置。
  • 文本文件的字符转换
  • 输入时,将回车符和换行符转换为换行符
  • 输出时,把换行符转换为回车符和换行符
  • 计算位置指针的位置时易发生混乱,对位置指针的操作有限制(二进制流则没有限制)

第22页:9.2 .3文件的输入

9.2 .3文件的输入

  • 输出函数
  • 文件的字符读写(fgetc函数与fputc函数)
  • fgetc
  • 函数原型int fgetc (FILE*fp)
  • 功能从fp指向的文件中读取一字节代码
  • 返回值正常,返回读到的代码值;读到文件尾或出错,为EOF
  • fputc
  • 函数原型int fputc ( int c, FILE*fp )
  • 功能把一字节代码c写入fp指向的文件
  • 返回值正常,返回c;出错,为EOF

第23页:9.2 .3文件的输入

9.2 .3文件的输入

【补充实例1】从键盘输入字符,逐个存到磁盘文件中,直到输入'#'为止# include<stdio.h>

main ( ){ FILE*fp; char ch,*filename = "out.txt" ; if (( fp=fopen ( filename,"w" )) == NULL ){ printf ( "cannot open file\n " ); exit (0); } printf ( "Please input string:" ); ch = getchar ( ) ; while ( ch!='#' ){ fputc(ch, fp); putchar(ch); ch = getchar ( ); } fclose ( fp ); }
  • 输出函数

第24页:9.2 .3文件的输入

9.2 .3文件的输入

对于文本文件,文件的结束判断通过检查读入字符是否为文件结尾标志EOF即可;(当然也可以使用feof函数)。

对于二进制文件,必须使用feof函数。

因为在二进制文件中,EOF(-1)也是合法的二进制数,如果用EOF来判断的话,可能会造成文件未结束就被认为是结束的错误。

  • 输出函数
  • 文件的结束判断(feof函数)
  • 函数原型intfeof(FILE*fp)
  • 功能检测文件位置指针是否到达了文件结尾
  • 返回值文件结束,返回真;文件未结束,返回0
  • 说明

第25页:9.2 .3文件的输入

9.2 .3文件的输入

main ( ){ FILE*fp; char ch,*filename = "out.txt" ; if ( ( fp = fopen ( filename, "r" ) ) == NULL ){ printf ( "cannot open file\n" ) ; exit(0); } while ( (ch = fgetc (fp)) !=EOF)putchar(ch); fclose(fp); }
  • 输出函数
  • 【补充实例2】读文本文件内容并显示。# include<stdio.h>
  • 判断文本文件是否

第26页:9.2 .3文件的输入

9.2 .3文件的输入

main ( ){ FILE*in,*out; char ch, infile[10], outfile[10]; scanf ( "%s", infile); scanf ( "%s", outfile) ; if( (in = fopen ( infile, "r" )) == NULL){ printf ( "Cannot open infile.\n" ); exit(0); } if( (out = fopen ( outfile, "w") ) == NULL){ printf ( "Cannot open outfile.\n" ); exit(0); } while( !feof (in) )fputc ( fgetc ( in ), out ); fclose (in); fclose (out); }
  • 输出函数
  • 【补充实例3】文件拷贝。# include<stdio.h>
  • 判断文件(文本或二进制)是否

第27页:9.2 .3文件的输入

9.2 .3文件的输入

函数原型int fread (void*buffer,int size,int count,FILE*fp)int fwrite (void*buffer,int size,int count,FILE*fp)

  • 输出函数
  • 文件的数据块读写(fread与fwrite函数)
  • 功能读/写数据块
  • 返值成功,为读/写的块数;出错或文件尾,为0
  • 参数说明
  • buffer指向要I/O数据块的首地址的指针
  • size每个要读/写的数据块的大小(字节数)
  • count要读/写的数据块的个数
  • fp要读/写的文件指针
  • 适用文件一般用于二进制文件的输入/输出

第28页:9.2 .3文件的输入

9.2 .3文件的输入

# include<stdio.h># define SIZE 2struct student_type{ char name[10];int num;int age;char addr[15];} stud[SIZE];

main ( ){ int i; for ( i = 0; i<SIZE; i++ )scanf ( "%s%d%d%s", stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr); save ( ); display ( ); } void save ( ){ FILE*fp; int i, stu_size ; stu_size = sizeof ( struct student_type ); if ((fp = fopen ( "stu_dat","wb" ))== NULL){ printf ( "cannot open file\n" ); return; } for ( i = 0; i<SIZE; i++ )if (write ( &stud[i], stru_size ,1,fp)!= 1 )printf ( "file write error\n" ); fclose ( fp ); } void display(){ FILE*fp; int i, stu_size ; stu_size = sizeof ( struct student_type ); if ((fp=fopen ("stu_dat","rb"))==NULL){ printf( "cannot open file\n" ); return; } for ( i = 0; i<SIZE; i++ ){ fread ( &stud[i],stu_size,1,fp ); printf ( "%-10s%4d%4d%-15s\n", stud[i].name,stud[i].num,stud[i].age,stud[i].addr); } fclose ( fp ); }
  • 输出函数
  • 【补充实例4】从键盘输入4个学生数据,把他们转存到磁盘文件中去。

第29页:9.2 .3文件的输入

9.2 .3文件的输入

printf(FILE*fp,char*format[,variable-list])intfscanf(FILE*fp,char*format[,address-list])
printf()、scanf()函数相似,都是格式化读写函数; 只是两个函数的读写对象是磁盘文件,而不是键盘或显示器。
printf(fp,"%d,%6.2f",i,t); fscanf ( fp,“%d,%f”,&i,&t ) ; 
  • 输出函数
  • 文件的格式化读写(fprintf与fscanf函数)
  • 函数原型intf
  • 功能按格式对文件进行读/写操作。
  • 返值成功,为I/O个数;出错或文件尾,为EOF
  • 说明两个函数用法与

第30页:9.2 .3文件的输入

9.2 .3文件的输入

main ( ){ char s[80], c[80]; int a, b; FILE*fp; if(( fp = fopen ( "test","w" ) ) == NULL ){ puts ("can't open file") ; exit ( ) ; } fscanf ( stdin, "%s%d", s, &a ); fprintf (fp, "%s %d", s, a); fclose(fp); if ( (fp = fopen ( "test", "r" ) ) == NULL){ puts ( "can't open file" ) ; exit ( ) ; } fscanf ( fp,"%s%d", c, &b ); fprintf (stdout, "%s %d", c, b); fclose(fp); }
  • 输出函数
  • 【补充实例4】从键盘按格式输入数据存到文件# include<stdio.h>

第31页:9.2 .3文件的输入

9.2 .3文件的输入

功能从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或EOF即结束)

puts ( char*s, FILE*fp )
  • 输出函数
  • 文件的字符串读写(fgets函数与fputs函数)
  • fgets
  • 函数原型char*fgets (char*s,int n,FILE*fp)
  • 返回值正常时返回读取字符串的首地址;出错或文件尾,返回NULL
  • fputs
  • 函数原型int f
  • 功能把s指向的字符串写入fp指向的文件
  • 返回值正常,最后一个字符;出错,为EOF

第32页:9.2 .3文件的输入

9.2 .3文件的输入

【补充实例5】从键盘读入字符串存入文件,再从文件读回显示# include<stdio.h>

main (){ FILE*fp; char string [81]; if ( (fp = fopen ( "file.txt", "w" ) ) == NULL){ printf ( "cann't open file" ); exit (0) ; } while (strlen (gets ( string ))>0 ){ fputs(string,fp); fputs("\n",fp); } fclose(fp); if ( (fp = fopen ( "file.txt", "r" ) ) == NULL){ printf ( "cann't open file" ); exit (0) ; } while (fgets ( string, 81, fp ) != NULL)fputs ( string, stdout ) ; fclose(fp); }
  • 输出函数

第33页:9.2 .3文件的输入

9.2 .3文件的输入

main ( ){ FILE*fp1,*fp2 ; fp1=fopen("f1.c", "r") ; fp2=fopen("f2.c", "w") ; while (! feof ( fp1 )) putchar ( fgetc ( fp1) ); rewind ( fp1 ) ; while ( ! feof ( fp1 ) )fputc ( fgetc ( fp1 ), fp2 ); fclose(fp1); fclose(fp2); }
  • 输出函数
  • 文件的定位(rewind、fseek与ftell函数)
  • rewind
  • 函数原型void rewind ( FILE*fp )
  • 功能重置文件位置指针到文件开头
  • 返回值无
  • 【补充实例6】对一个磁盘文件进行显示和复制# include<stdio.h>

第34页:9.2 .3文件的输入

9.2 .3文件的输入

whence起始点,是下列三个宏定义之一:SEEK_SET0(文件开始)SEEK_CUR1(文件当前位置)SEEK_END2(文件末尾)

  • 输出函数
  • fseek
  • 函数原型intfseek(FILE*fp,longoffset,intwhence)
  • 功能改变文件位置指针的位置
  • 返回值成功,返回0;失败,返回非0值
  • 参数说明
  • fp文件指针
  • offset位移量(以起始点为基点,移动的字节数)>0,向后移动;<0,向前移动
  • 例:fseek ( fp, 100L, 0 ) ;fseek ( fp, 50L, 1 ) ;fseek ( fp,-10L, 2 )

第35页:9.2 .3文件的输入

9.2 .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];
  • 输出函数
  • 【补充实例7】磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示(随机读)

第36页:9.2 .3文件的输入

9.2 .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("Len of File is %ld bytes\n",length); fclose (fp) ; } }
  • 输出函数
  • ftell
  • 函数原型longftell(FILE*fp)
  • 功能返回位置指针当前位置(的位移量用相对文件开头表示)
  • 返回值成功,返回当前位置指针位置;失败,返回-1L。
  • 【补充实例8】求文件长度

第37页:9.2 .3文件的输入

9.2 .3文件的输入

说明每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试;fopen件时,ferror函数初值自动置为0

说明出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数。

  • 输出函数
  • 文件出错的检测(ferror和clearerr函数)
  • ferror
  • 函数原型int ferror ( FILE*fp )
  • 功能测试文件是否出现错误
  • 返回值未出错,0;出错,非0
  • clearerr
  • 函数原型void clearerr ( FILE*fp )
  • 功能使文件错误标志置为0

第38页:9.2 .3文件的输入

9.2 .3文件的输入

【补充实例9】ferror ( )与clearerr ( )举例。# include<stdio.h>int

main ( ){ FILE*stream; stream =fopen ( "DUMMY.FIL", "w" ) ; fgetc ( stream ) ; if (ferror ( stream) ){ printf ( "Error reading from DUMMY.FIL\n" ); clearerr ( stream ); } if (!ferror(stream))printf ( "Error indicator cleared!" ) ; fclose ( stream ) ; return 0; }
  • 输出函数

第39页:9.3 用好文件要点

9.3 用好文件要点

3用好文件要点文件操作是程序设计中非常重要的一环,很多同学反映文件这部分内容很难掌握,学完C语言初级课程后,大部分人难于应付文件方面的问题,其实和其他部分一样,掌握文件的使用也是有规可循的。

这一节,我们来归纳文件使用的一些要点和技巧。

第40页:9.3 用好文件要点

9.3 用好文件要点

掌握文件操作的步骤理解文件结构FILE的作用和使用方法,用以下模式掌握文件操作的三大步骤。FILE*fp;fp=

fopen("文件名","方式"); if(fp==NULL){ …… } ……fclose(fp); 归结起来,文件操作只有打开、处理和关闭三类。注意并行操作的每一个文件都需要一个指向FILE结构的指针。一个文件指针只有在其关联的文件关闭后,才可以指向另一个文件。

第41页:9.3 用好文件要点

9.3 用好文件要点

用什么方式组织文件数据。文件的数据是ASCll码还是二进制方式。二进制文件打开时,要指明"r"方式。

  • 确定文件打开方式确定文件打开方式需要考虑下面几个问题:
  • 文件的用途。文件是用于输入、输出或既输入又输出。
  • 文件的状态。包括文件是否存在,是打开新文件还是旧文件,旧文件中数据如何处理。
  • 打开操作是否成功。必须判断打开操作是否成功,才能进行下一步文件操作。

第42页:9.3 用好文件要点

9.3 用好文件要点

文件操作是顺序读写还是随机读写,是否需要定位文件位置指针。顺序读写文件位置指针自动移动,随机读写在每次读写前要使用fseek函数定位文件位置指针。

读写的数据是ASCll码还是二进制码。ASCll文件多使用顺序读写、二进制文件多使用随机读写。注意函数参数是变量名称还是变量地址。

注意判断读写操作是否成功。可用操作函数的返回值或ferror函数进行检查。要保持读写内容和文件位置指针的一致性。

  • 确定文件的操作确定文件的操作需要考虑下面三个方面:

第43页:9.3 用好文件要点

9.3 用好文件要点

  • 注意关闭文件关闭文件的两种思路::
  • 某文件的读写操作完毕,马上关闭该文件,可减少文件指针变量的数量。。
  • 结束程序前,关闭所有文件。

第44页:9.4 小结

9.4 小结

文件的基本概念。

包括文件与文件输入/输出的概念,C语言中文件的两种组织形式(文本文件,二进制文件),标准输入/输出文件,文件操作的一般步骤,文件的基本操作及特点,FILE类型,文件结束标记EOF。

文件的读写方式。包括顺序读写文件和随机读写文件的概念,文件的读写位置指针,文件操作与文件指针的关系,常用的与文件位置指针有关的函数。

fopen(),fclose(),fgetc(),fputc(),fgets(),fputs(),和fprintf(),fscanf(),fread(),fwrite(),feof(),ferror()等函数的使用。
  • 4小结本章主要介绍以下一些内容:
  • 常用文件操作函数的使用。包括
  • 文件操作的基本算法。包括文件的读、写和追加。
顶部目录