




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 文 件在使用计算机的过程中,经常需要将一些数据以文件的形式保存在外部存储介中。本章主要介绍磁盘文件、文件指针的概念以及文件指针变量的定义方法;文件的打开、关闭、读、写、定位等基本操作的实现及调用形式;文件操作在程序设计中的应用方法。10.1 语言文件概述在使用计算机的过程中,如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以二进制形式将信息存储到外部存储介质磁盘、磁带、光盘中。所谓文件,就是指存储在外部介质上的相关数据的集合,通过文件来保存数据的好处是一方面可以在外储器上长期保存,且可以由程序读写、处理文件上的数据,满足实际工作中数据处理的要求。如以上提及的成绩管理程序,就可以以文件的形式保存原始数据,同时程序的运行结果也可以以文件的形式保存,以满足实际应用的需要。在编写程序中,经常需要通过文件操作进行大量的输入和输出,因此文件的输入和输出就成为程序的主要部分。本章主要介绍文件的基本概念,以及C语言中常用的文件函数。10.1.1 文件与文件名 文件是指存放在外部存储介质上的数据集合。为了标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名 实际上,我们在以前的学习中就已接触到文件的概念,如C语言的源程序是一个扩展名为.C的文件,而Turbo C则是运行了一个主文件名为TC,扩展名为.EXE的可执行文件。10.1.2 文件分类众所周知,文件有很多种,如文本文件、图形文件、声音文件、可执行文件等,从不同的角度对文件可进行不同的分类。就C语言关心的文件中数据的存储方式而言,文件可分为以下两种:(1)文本文件文本文件是指由字母、数字、符号等字符组成的文件,这些字符以相应的编码(ASCII码)存储在文件中。文本文件中的一个数“65535”是由字符“6”、“5”、“5”、“3”和字符“5”组成的,其ASCII码分别为54、53、53、51和53,所以存储数“65535”需要用五个字节。我们所编写的C语言源程序文件就属此类。(2)二进制文件二进制文件是指按数据原样存储的文件。仍以数“65535”为例,它的二进制形式为11111111,所以它在二进制文件中只占两个字节。如TC.EXE就是一个二进制文件。ASCII码文件的每一个字节存储一个字符,因而便于对字符进行逐个处理,存取方便。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)。二进制文件是把内存中的数据,原样输出到磁盘文件中,节省存储空间,并且存取速度快,但一个字节并不对应一个字符,不能直接输出字符形式。在以后的学习中我们可以知道,C语言中对这两类文件的操作方法是不同的。无论是ASCII码文件还是二进制文件,C语言对文件的存取总是以字符(字节)为单位,即输入和输出操作仅受程序控制,而不受物理符号控制(如回车换行符)。也就是说,在输入时不以回车换行符作为记录间隔,在输出时也不会自动增加回车换行符作为记录结束标志,C文件就是字节流或二进制流,没有记录界限,这种文件被称为流式文件。 10.1.3 缓冲文件系统对一个的存取实际上就是实现内存与磁盘文件的数据交换,缓冲文件系统就是指在进行文件交换时,系统在内存中自动为每一个文件开辟一个文件缓冲区。当从内存向磁盘输出文件时,先将数据传送到该文件的缓冲区,当缓冲区写满后,才将所有数据一起输出到磁盘中,以减少写磁盘的次数;要把磁盘文件中的数据读至内存时,需先将一批数据输入到文件缓冲区,再从缓冲区中将数据逐个送到程序数据区,以减少从磁盘中读数据的次数(如图10-1所示)。输入输出程序数据区输出文件缓冲区输入文件缓冲区磁盘输出输入图10-1 文件缓冲系统由于磁盘读写要比缓冲区读写花较多的时间,采用缓冲文件系统的目的就是为了减少磁盘读写的次数,从而提高程序的执行效率。在C语言中提供了基于缓冲文件系统的文件操作函数,本章主要介绍这些函数的用法,以及如何通过它们实现对文件的操作。10.2 文件类型指针操作系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件的状态、文件位置等),并通过该文件的文件句柄对文件操作。在C语言中,要对已打开的文件进行操作,应首先定义一个能指向该文件的信息的指针变量,这就是文件指针。文件指针是贯穿缓冲型I/O系统的主线,通过这个指针,程序与操作系统互相交流信息,才能使用该文件,为此需要在程序中说明指向文件结构的指针,即定义FILE型(文件型)的指针变量。文件类型指针的定义方法如下:FILE *pname;其中,FILE(必须大写)是一种结构类型,在 stdio.h 中定义,表明后面定义的是一个文件类型的指针,pname是指针的名字,由程序设计者给出,并符合标识符的命名规则。例如定义指向文件类型的指针变量*fp1和*fp2可写成以下形式:FILE *fp1, *fp2;10.3 文件的打开与关闭对文件操作的一般过程如下:(1)说明一个文件指针;(2)通过文件名打开文件,并为文件指针赋值;(3)通过文件指针对文件进行存取及其它操作;(4)通过文件指针关闭文件。可见,对文件进行操作之前,必须先打开该文件,即把程序中要读写的文件和磁盘上实际的数据文件联系起来;使用结束后,应立即关闭,以免数据丢失。C语言提供了丰富的对文件操作的库函数,这些函数原型均在头文件stdio.h中,为了使用这些函数,应使用预处理命令 #include 将stdio.h文件包含到用户文件中,后续函数不再赘述。C语言规定了标准输入输出函数库stdio.h,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。 10.3.1 文件的打开fopen()函数的功能是返回一个指向指定文件的指针,fopen()函数调用形式如下:fopen( 文件名,使用文件方式 );这里“文件名”是指要打开(或创建)的文件名,可以包括路径信息,如不指定路径,系统会自动到当前目录下寻找该文件。如果使用字符数组(或字符指针),则不使用双引号。“使用文件方式”由两部分信息组成,一是文件的打开方式,二是文件的内部组织(ASCII码文件还是二进制文件)。“使用文件方式”可以是下列值之一:r 以只读方式打开文件。若试图打开一个不存在的文件,则会返回出错信息;w 以只写方式打开文件。若文件不存在,则创建新文件;若打开的文件已存在,则将原文件删去,并创建新文件;a 以添加方式打开文件。打开文件时,位置指针移到末尾,用于添加内容;若文件不存在时,创建文件用于写;r+ 以既可读又可写的方式打开一个已存在的文件。打开文件时,位置指针指向文件头;文件不存在时,创建新文件w+ 以既可读又可写的方式创建一个新文件。先向此文件输入数据,后从此文件中读数据。a+ 以读写方式打开文件,允许读,或在文件末尾更改内容。与r+的不同之处在于,打开文件时,位置指针指向文件尾。例如,以只读方式打开文件data.99可用以下语句实现:FILE *fp; fpfopen( data.99,r );说明(1)如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL(其值在头文件stdio.h中被定义为0),此时再用文件指针对文件操作已无任何意义,最好退出程序或跳过对文件操作的语句。为增强程序的可靠性,常用下面的方法打开一个文件:if ( ( fp=fopen( data.99, r ) = NULL ) printf( Can not open this filen );exit(0);这里,exit()函数的功能是关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为0时,表示程序正常退出;非0值时,表示程序出错退出。若n为程序状态值,exit()函数的调用形式是:exit(n);(2)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。(3)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针,它们是标准输入文件,文件指针为stdin,指向终端输入(一般为键盘);标准输出文件,文件指针为stdout:指向终端输出(一般为显示器);标准错误文件,文件指针为stderr,指向终端标准错误输出(一般为显示器)。这些指针是常量,不是变量,因此不能重新赋值。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。10.3.2 文件的关闭关闭文件可通过调用库函数fclose()实现,函数的调用形式如下:fclose( 文件指针 );如果正常关闭了文件,则函数返回值为零;若返回值为EOF时(C语言的预定义标志符,在头文件stdio.h中,被定义为-1),则表示关闭时有错误。通过返回值来判断关闭文件是否出错的方法如下:if (fclose(fp) !=0) printf(“file close error!”);该语句表示关闭fp指针指向的文件(fp的值是在文件打开时,由fopen()函数获得的),当关闭出错时,显示出错信息“file close error!”。【例10.1】看一个文件的打开和关闭的实例:#include “stdio.h”main() FILE *fp;if (fp=fopen(“example.txt”, “w”)=NULL)/* 以w方式打开文本文件example.txt */ printf(“Cannt open this file!n”); exit(1); /* 可按需要对文件实施有关操作 */fclose(fp);/* 关闭文本文件example.txt */当文件被成功关闭后,此时其文件指针就不再指向任何文件了,当然可以重用,用以指向另一文件。但要注意的是,一个文件指针在某一时刻,只能以一种方式打开一个文件。请看下面的语句:FILE *fp;fp = fopen( “test1.txt”, “r” );fp = fopen( “test2.txt”, “w” );这些语句的本意是要同时打开 “test1.txt”和 “test2.txt”两个文件,test1.txt打开用于只读, test2.txt打开用于操作,而实际上文件指针fp仅仅指向test2.txt,并处于“写”状态,这种错误对文件的危害是很严重的。正确的方法是为每一个文件说明一个文件指针,如:FILE *fp1, *fp2;fp1 = fopen( “test1.txt”, “r” );fp2 = fopen( “test2.txt”, “w” );即文件指针fp1和fp2分别指向文件test1.txt和test2.txt,就可以对这两个文件进行相应的操作了。10.4文件的读写操作文件打开之后,就可以对它进行读与写的操作了。所谓“读文件”也称“文件输入”,是指建立一个“输入文件缓冲区”,将磁盘文件中的数据传送到计算机内存的过程;而“写文件”也称“文件输出”,是指通过建立一个“输出文件缓冲区”,程序要将内存中的数据写入磁盘,并以文件的形式保存的过程。C语言提供了丰富的读写函数,下面分别加以介绍。10.4.1 检测文件是否结束函数feof()在介绍文件的读写操作之前,先介绍如何判断文件是否结束,即C语言程序中的文件指针是否指向了文件的末尾。这是一个很重要的读写依据,否则文件的读写将无法停止。在对二进制文件执行读入操作时,必须使用库函数feof()来判断是否遇到文件尾。feof()函数的调形式如下:feof( 文件指针 );当文件指针指向文件末尾时,函数返回值为1,否则返回值0。10.4.2字符读写函数fgetc()和fputc()库函数fputc()的功能是将字符ch,写入到文件指针fp所指的文件位置,若调用成功,则返回该字符,否则返回EOF。fputc()函数的调用形式如下:fputc ( ch,fp );其中“ch”,既可以是字符常量,也可以是字符变量。写数据成功后,同时将读写位置指针向前移动一个字节,即指向下一个写入位置。【例10.2】不断地从键盘上输入的一个字符串(以“#”作为结束字符),以ASCII码形式存储到一个磁盘文件中。/*参数:带参主函数,使用格式:可执行文件名 目标文件名*/#include “stdio.h”main(int argc, char *argv ) FILE *fp; char ch; if(argc!=2) /*参数个数不对*/ printf(the number of arguments not correctnn); printf(“Usage: programname filename n”); exit(0); if (fp=fopen(argv1,w)=NULL) /*打开文件失败*/ printf(can not open this filen); exit(0); /*输入字符,并存储到指定文件中*/ for( ; (ch=getchar() != # ; ) fputc(ch,fp); /*输入字符并存储到文件中*/ fclose(fp); /*关闭文件*/ 若该程序编译连接后生成的可执行文件test1.exe,在命令行方式下键入“test1 file1.txt”,程序就可以运行,并输入以下字符串:This is a sample program!#程序运行后,在磁盘上生成一个名为“file1.txt”的ASCII码文件,我们可以用DOS下的type命令或Windows下的记事本工具,浏览文件内容为“This is a sample program!”。库函数fgetc ()的功能是从文件指针fp所指向的文件中,读入一个字符,同时将读写位置指针向前移动一个字节(即指向下一个字符)。若调用成功,则返回所得到的字符,否则返回EOF。fgetc()函数的调形式如下:fgetc ( fp )即fgetc(fp)表达式,从文件fp中读一个字符,同时将fp的读写位置指针向前移动到下一个字符,程序可根据返回值判断取字符是否成功。【例10.3】顺序显示例10.2创建的磁盘ASCII码文件file1.txt的文件内容。/*参数:带参主函数,使用格式:可执行文件名 源文件名*/#include stdio.hmain(int argc, char *argv) FILE *fp; char ch; if(argc!=2) /* 参数个数不对 */ printf(the number of arguments not correctn); printf(“n Usage: programname source-filename); exit(0); if (fp=fopen(argv1,r)=NULL) printf(can not open source filen); exit(0); /* 顺序输出文件的内容 */ for(; (ch=fgetc(fp)!=EOF; ) /* 当文件没有到达结束符时 */ putchar(ch); /* 顺序读入并显示 */ fclose(fp); /* 关闭打开的文件 */ 若该程序编译连接后生成的可执行文件test2.exe,在命令行方式下键入“test2 file1.txt”,程序就可以运行,并且在屏幕上显示“This is a sample program!”,即为上例中file1.txt文件的内容。 【例10.4】实现制作ASCII码文件副本的功能。生成例10.2中file1.txt文件的副本文件file2.txt,即读出file1.txt文件的内容,并依次写入file2.txt文件中。/*使用格式:可执行文件名 源文件名 目标文件名*/#include stdio.hmain(int argc, char *argv) FILE *input, *output;/* input:源文件指针, output:目标文件指针 */ char ch;if(argc!=3) /*参数个数不对*/ printf(the number of arguments not correctn); printf(n Usage: programname source-file dest-file); exit(0); if (fp=fopen(argv1, r)=NULL) /*打开源文件失败*/printf(can not open source filen); exit(0); if (fp=fopen(argv2, w)=NULL) /*创建目标文件失败*/ printf(can not create destination filen); exit(0); /*复制源文件到目标文件中*/ for( ; (!feof(input) ; ) fputc(fgetc(input),output); fclose(input); fclose(output);/*关闭源文件和目标文件*/若该程序编译连接后生成的可执行文件test3.exe,在命令行方式下键入“test3 file1.txt file2.txt”,程序就可以运行,该程序以只读方式打开file1.txt(不能用w方式打开,否则文件内容会被清空),创建新文件file2.txt,实现了将上例中的已存在的文件file1.txt复制生成其副本文件file2.txt。10.4.3 字符串读写函数fgets()和fputs()由于fgetc()函数和fputc()函数每次只能读写一个字符,若源文件的长度为1000字节,则上例中的for循环就要执行1000次,因此效率较低。为提高效率,在C语言中提供了一次读写一个字符串的函数。C语言提供了fgets ()函数,可以从文件中读出一个字符串,其调用形式为:fgets(str,n+1,fp)fgets()函数的功能是从文件指针fp指向的文件中,按顺序读取长度为n的字符串,存入起始地址为str的字符串数组中,并在尾端自动加一个串结束标志0;同时,将读写位置指针向前移动n(字符串长度)个字节;如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。若读取成功,返回字符数组的地址值,若遇文件结束或出错,函数值为NULL,程序可据此判断对文件的读取是否成功。【例10.5】利用fgets()函数将例10.2中生成的file1.txt内容读出,并显示在屏幕上。#include “stdio.h”main() FILE *fp; char string81; if (fp=fopen(“file1.txt”,”r”)=NULL) printf(“can not open file”);exit(0);while (fgets(string, 81, fp)!=NULL)printf(“%s”,string);fclose(fp);fgets()函数如果返回NULL,表示已到文件尾。只要未到文件结尾,则每次读入一行字符,并向屏幕输出,因为在写文件时,已向文件写入一个换行符作为字符串之间的分隔符,所以在输出时不需要再加n。库函数fputs()的功能是向指定文件输出一个字符串(多个字符,不包括字符串结束标志n),一般定义定义形式为:fputs( str,fp )其中str可以是一个字符串常量,或字符数组名,或字符指针变量名。如果输出成功,则函数返回值为0,同时将读写位置指针向前移动字符串长度个字节;否则,为非0值。【例10.6】在已建立的文件file1.txt中追加一组字符串。#include “stdio.h”main() FILE *fp; char ch, str20; if (fp=fopen(“file1.txt”, “a+”)=NULL)/* 以追加方式打开文件 */ printf(“can not open file!”); exit(1);printf(“input a string:n”); while (strlen( gets(str)0) fputs(str, fp);/* 输入长度不为0的字符串时,追加到文件 */ fputs(“n”, fp);/* 字符串后增加一换行符 */ fclose(fp);程序以追加方式打开file1.txt,用gets()函数接收键盘的输入,每一行以回车键结束的字符串被送到str字符数组中,用fputs()函数写入文件file1.txt,并用fputs()函数在字符串后添加一换行符作为分隔。当接收的串长度为0时,关闭文件,程序终止。若程序运行时,输入以下字符串:This is a C program.This is a sample.若浏览file1.txt的文件内容,可以发现以上输入的字符被正确地追加到文件file1.txt的末尾。10.4.4 数据块读写函数fread()和fwrite()实际应用中,常常要求一次读或写一个数据块(记录)。为此C语言提供了fread()和fwrite()函数。它们用“记录”来读写二进制文件,可以方便地对程序中的数组、结构体数据进行输入和输出操作。fwrite()函数是二进制输出函数,其调用形式如下:fwrite( buffer, size, count, fp );该函数的功能是将ptr所指向的内存区域中的数据写入文件指针stream所指的文件中,这些数据共有nitems项,每项的长度为size个字节,因此字节总数为nitems*size。要注意这里size不是任意值,而是读入数据所属数据类型占用的字节长度,如对整型来说size为2,对字符来说size为1,而对某个结构来说size为sizeof(s)等等,因此,以long型为例,该函数的实际意义为将nitems个整型数据写入指定的文件中,总长度为nitems*4个字节。【例10.7】从键盘输入5个学生的有关信息,然后将它们转存到磁盘文件上,设学生的信息包括姓名、学号、年龄和成绩。#include stdio.h#include stdlib.h#define SIZE 5main() struct student_type char name10; int num; int age; float score; studSIZE;/* 学生信息存储结构 */ FILE *fp; int i; if ( ( fp=fopen (stulist, wb ) )=NULL) printf( cannot open file.n ); exit( 0 ); for (i=1; i=SIZE; i+)scanf(%c%d%d%f,, &studi.age, &studi.score, &studi.score);if ( fwrite( &studi, sizeof( struct student_type ), 1, fp )!=1)printf( file write error!n ); break; fclose(fp);这里,程序将每一个学生的数据信息作为一个数据块,写入stulist文件中,每个数据块的长度为一个student_type结构体变量中所有成员长度之和,即10+2+2+4=18字节。程序运行时,所有从键盘输入的学生信息被存储到文件stulist中,其内容可用fread()函数编程验证。fread()函数是二进制输入函数,其调用形式如下:fread ( buffer, size, count, fp )该函数的功能是从文件指针stream所指的文件中读nitems项数据(每项长为size个字节)到ptr所指的内存区域,读入的字节总数为nitems*size。这里size的含义与fread函数中size的含义相同。以上两个函数可以对数据成批读写,如fwrite(a, 2 ,500,fp)语句表示要输出500个整型数据,总输出量就为1000个字节。【例10.8】编程读出上例磁盘文件中学生的信息。#include stdio.h#include stdlib.hmain() struct student_type char name10; int num; int age; float score; stud;/* 学生信息存储结构 */ FILE *fp;printf( 姓名 学号 年龄 成绩n );fp=fopen( stulist, rb );/* 按二进制只读方式打开文件 */while ( fread(&stud, sizeof(struct student_type), 1, fp )=1)printf( %s%d%d%f, , &stud.age, &stud.score, &stud.score );fclose(fp);运行本程序后,我们可以比较用本程序生成的二进制文件stulist与生成同样信息的文本文件比较其大小,体会为什么说二进制文件的存储效率要高,同时查看两文件内容,体会一下为什么说文本文件易于读取。10.4.5 格式化读写函数fscanf()和fprintf()格式化读写函数的功能与scanf()和printf()函数的功能相似,满足文件格式化输入输出的需要。它们的区别在于scanf()和printf()函数的操作对象是标准输入文件stdin和输出文件stdout,而fscanf()和fprintf()函数的操作对象是指定文件。fscanf()和fprintf()函数的调用形式如下:fscanf( 文件指针,格式-字符串,输入项列表 );fprintf(文件指针,格式-字符串,输出项列表 );当fscanf()和fprintf()函数中的文件指针指向stdin和stdout时,其作用与scanf()和printf()函数的功能相同。例如,. int i=65; float f=7.30; . fprintf(fp,%4d,%6.2f, i, f); . fprintf()函数的作用是,将变量i按%2d格式、变量f按%6.2f格式, 以逗号作分隔符,输出到fp所指向的文件中,即文件内容为:65,7.30(表示1个空格)。10.5 位置指针与文件定位文件中有一个读写位置指针,指向当前的读写位置。当文件打开时,指针指向文件开头,若顺序读写文件,则每次读写一个或一组数据后,系统自动将位置指针移动到下一个读写位置上。在前面的有关函数中都涉及到文件位置指针的操作。如果想改变系统这种读写规律,可使用有关文件定位的函数。10.5.1 位置指针复位函数rewind()在实际应用中,在对文件进行多次读写操作后,可能需要重新对文件进行其它操作,即使位置指针重新回到文件头,一种方法是关闭文件后,再重新打开文件;另一方法则是使用rewind()函数,在不关闭文件的情况下,回到文件头重新读写文件。显然后一种方法的效率要高得多。rewind()又称“反绕”函数,该函数没有返回值,其功能是使文件的位置指针返回到文件头。rewind()函数的调用形式如下:rewind( 文件指针 );10.5.2 随机读写与fseek()函数读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上,这就是文件的顺序读写;所谓文件随机读写,是指读写当前数据后,可将位置指针移动到文件中任何一个下次需要读写的地方。对于流式文件,既可以顺序读写,也可随机读写,在C语言中,提供了fseek()函数控制文件的位置指针。fseek()函数一般用于二进制文件。其调用形式如下:fseek( 文件指针,位移量,起始点 ); 其功能是将指定文件的位置指针,从参照点开始,移动由位移量指定的字节数,指向下一个要读写的位置。以参照点为起点,当位移量为正数时,位置指针向前移动,当位移量为负数时,位置指针向后移动相应的字节数。在ANSI C标准中,要求位移量为长整型数据。对于参照点,在ANSI C标准中也有规定,如表所示:(1)参照点:用0(文件头)、1(当前位置)和2(文件尾)表示。也可以用下列名字表示: SEEK_SET文件头, SEEK_CUR当前位置, SEEK_END文件尾通过该函数可以随机定位文件,即可以将文件位置指针移动到文件的任意位置,从而真正地实现对文件的随机读写。若fp是文件指针,下面是几个调用函数的例子:fseek( fp, 50L, 1); /*位置指针从当前位置向前移100个字节*/fseek( fp, -60L, SEEK_END); /*位置指针从文件尾向后移100个字节*/fseek( fp, 70L, 0); /*位置指针从文件头向前移100个字节*/【例10.9】将例10.2所创建的文本文件file1.txt中的文本内容的反向显示。#include “stdio.h”main() char c;FILE *fp;if (fp=fopen(“file1.txt”, “r”)=NULL)/*以只读方式打开文本文件,位置指针指向文件头*/ printf(“ Can not open file.”);exit(1);fseek( fp, 0L, 2);/*定位文件尾,即定位在文件最后一个字符之后的位置*/ while (fseek(fp, -1L, 1)!=-1) /*在当前位置上后退一个字节*/ c=fgetc(fp); putchar( c ) ; /*定位成功,读取当前字符并显示*/if ( c=n )fseek( fp, -2L, 1); /*n在DOS文本中为回车(0x0d)和换行(0x0a)两个字符*/else fseek( fp, -1L, 1); /*文件指针定位在刚刚读出的字符处*/fclose( fp );10.5.3 返回文件当前位置的函数ftell()由于文件的位置指针可以任意移动,也经常移动,往往容易混淆当前的确切位置。ftell函数就可以在需要的时候,返回文件位置指针的当前位置,该值是一个长整型数,用从文件开始处到当前位置的位移量字节数表示。如果函数的返回值为-1L,则表示出错。ftell()函数的调用形式为:ftell( 文件指针 ); 【例10.10】ftell用法的实例,要求先向二进制文件test中写入一个固定的字符串,然后再读出该文件中46字节位置的字符。#include “stdio.h”main()static char buffer= “qwetras”;FILE *fp; char c;long pick, offset;fp=fopen( “test”,”wb” ); /*以二进制方式打开文件*/fwrite( (buffer, 1, 7, fp ); /*向文件test中定入字符串*/fclose( fp );fp=fopen( “test”, “r”); /*以文本读取方式打开文件*/*读取test文件中46字节位置的字符*/for ( pick=3; pick6; pick+ )fseek(fp, pick, 0); /*移动指针到pick+1的位置*/ off
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计公司前台管理制度
- 设计招标文件管理制度
- 诊所医疗感染管理制度
- 诊所隐患台账管理制度
- 货场租赁使用管理制度
- 2025年中国工业大语言模型行业市场全景分析及前景机遇研判报告
- 货物抵协议书范本
- 个人分账协议书范本大全
- 惩治老婆协议书范本
- 员工持干股协议书范本
- 经空气传播疾病医院感染预防与控制规范课件
- 冠心病合并糖尿病血脂管理
- GB/T 43492-2023预制保温球墨铸铁管、管件和附件
- PDCA循环在我院静脉用药调配中心用药错误管理中的应用静配中心质量持续改进案例
- 精神病患者攻击行为预防
- 《议程设置理论》课件
- 二单元税率利率复习课
- GB/Z 43281-2023即时检验(POCT)设备监督员和操作员指南
- 农药经营56学时培训模拟试题
- 衣柜全屋定制家具施工方案
- 广州市近5年中考语文作文真题及模拟题汇编(含参考例文)
评论
0/150
提交评论