文件 13.1C文件概述 3.2文件指针 13.3文件的打开与关闭 13.3.1文件的打开( fopen函数) 13.3.2文件关闭函数( fclose函数) 13.4文件的读写 13.4.1 字符读写函数 fgetc和 fputc 13.4.2 字符串读写函数 fgets和 fputs 44489 13.4.3 数据块读写函数 fread和 fwtrite 13.4.4格式化读写函数 fscanf和 fprintf 13.5文件的随机读写 13.5.1 文件定位 13.5.2文件的随机读写 13.6文件检测函数 14 13.6.1 文件结束检测函数feof函数 13.6.2 读写文件出错检测函数 13.6.3 文件出错标志和文件结束标志置0函数. ,14 13.7C库文件 13.8本章小结 15 13文件 131c文件概述 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实 际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、 库文件(头文件)等 文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度 可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文 件、可执行程序:也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文 件、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中, 把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写 通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出 文件输出。如前面经常使用的 printf, putchar函数就是这类输出。 键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据 canf, getchar函数就属于这类输入。 从文件编码的方式来看,文件可分为 ASCII码文件和二进制码文件两种。 ASCII文件也 称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的 ASCII码。 例如,数5678的存储形式为
13 文件.................................................................. 1 13.1 C 文件概述 ........................................................ 1 13.2 文件指针.......................................................... 2 13.3 文件的打开与关闭.................................................. 2 13.3.1 文件的打开(fopen 函数) .................................... 2 13.3.2 文件关闭函数(fclose 函数) ............................... 4 13.4 文件的读写........................................................ 4 13.4.1 字符读写函数 fgetc 和 fputc ................................ 4 13.4.2 字符串读写函数 fgets 和 fputs .............................. 8 13.4.3 数据块读写函数 fread 和 fwtrite ............................ 9 13.4.4 格式化读写函数 fscanf 和 fprintf .......................... 11 13.5 文件的随机读写................................................... 12 13.5.1 文件定位................................................. 12 13.5.2 文件的随机读写........................................... 13 13.6 文件检测函数..................................................... 14 13.6.1 文件结束检测函数 feof 函数................................ 14 13.6.2 读写文件出错检测函数..................................... 14 13.6.3 文件出错标志和文件结束标志置 0 函数....................... 14 13.7 C库文件......................................................... 14 13.8 本章小结......................................................... 15 13 文件 13.1 C 文件概述 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实 际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、 库文件 (头文件)等。 文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。从不同的角度 可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文 件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文 件、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件。 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中, 把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。 通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出 文件输出。如前面经常使用的 printf,putchar 函数就是这类输出。 键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。 scanf,getchar 函数就属于这类输入。 从文件编码的方式来看,文件可分为 ASCII 码文件和二进制码文件两种。ASCII 文件也 称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的 ASCII 码。 例如,数 5678 的存储形式为:
ASCII码: 00110101001101100011011100111000 十进制码 共占用4个字节。 ASCII码文件可在屏幕上按字符显示,例如源程序文件就是 ASCII文件,用DOS命令TYPE 可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的 例如,数5678的存储形式为 0001011000101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些 文件时,并不区分类型,都看成是字符流,按字节进行处理 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也 把这种文件称作流式文件〃 本章讨论流式文件的打开、关闭、读、写、定位等各种操作。 132文件指针 在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可 对它所指的文件进行各种操作。 定义说明文件指针的一般形式为 FILE*指针变量标识符 其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和 文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。 例如: FILE *fp 表示fp是指向FIE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按 结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文 件的指针 133文件的打开与关闭 文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文 件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与 文件之间的联系,也就禁止再对该文件进行操作 在C语言中,文件操作都是由库函数来完成的。在本章内将介绍主要的文件操作函数。 1331文件的打开open函数) fopen函数用来打开一个文件,其调用的一般形式为 文件指针名= fopen(文件名,使用文件方式); 其中 “文件指针名”必须是被说明为FILE类型的指针变量
ASCII 码: 00110101 00110110 00110111 00111000 ↓ ↓ ↓ ↓ 十进制码: 5 6 7 8 共占用 4 个字节。 ASCII 码文件可在屏幕上按字符显示,例如源程序文件就是 ASCII 文件,用 DOS 命令 TYPE 可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。 例如, 数 5678 的存储形式为: 00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C 系统在处理这些 文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也 把这种文件称作“流式文件”。 本章讨论流式文件的打开、关闭、读、写、 定位等各种操作。 13.2 文件指针 在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可 对它所指的文件进行各种操作。 定义说明文件指针的一般形式为: FILE *指针变量标识符; 其中 FILE 应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和 文件当前位置等信息。在编写源程序时不必关心 FILE 结构的细节。 例如: FILE *fp; 表示 fp 是指向 FILE 结构的指针变量,通过 fp 即可找存放某个文件信息的结构变量,然后按 结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把 fp 称为指向一个文 件的指针。 13.3 文件的打开与关闭 文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文 件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与 文件之间的联系,也就禁止再对该文件进行操作。 在C语言中,文件操作都是由库函数来完成的。在本章内将介绍主要的文件操作函数。 13.3.1 文件的打开(fopen 函数) fopen 函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, “文件指针名”必须是被说明为 FILE 类型的指针变量;
“文件名”是被打开文件的文件名 “使用文件方式”是指文件的类型和操作要求 “文件名”是字符串常量或字符串数组 例如: FILE fp 其意义是在当前目录下打开文件 file a,只允许进行"读〃操作,并使fp指向该文件。 又如 FILE *fphzk fphzk=("c: \\hzk16", rb") 其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制文件,只允许按二进 制方式进行读操作。两个反斜线"\\〃中的第一个表示转义字符,第二个表示根目录 使用文件的方式共有12种,下面给出了它们的符号和意义 文件使用方式 意义 只读打开一个文本文件,只允许读数据 只写打开或建立一个文本文件,只允许写数据 追加打开一个文本文件,并在文件末尾写数据 只读打开一个二进制文件,只允许读数据 只写打开或建立一个二进制文件,只允许写数据 追加打开一个二进制文件,并在文件末尾写数据 urt+/ 读写打开一个文本文件,允许读和写 读写打开或建立一个文本文件,允许读写 at+ 读写打开一个文本文件,允许读,或在文件末追加数据 rb+〃 读写打开一个二进制文件,允许读和写 wwb+ 读写打开或建立一个二进制文件,允许读和写 读写打开一个二进制文件,允许读,或在文件末追加数据 对于文件使用方式有以下几点说明 1)文件使用方式由r,W,a,t,b,+六个字符拼成,各字符的含义是: r(read) a (append) 追加 t(text) 文本文件,可省略不写 b (banary) 二进制文件 读和写 2)凡用“r"打开一个文件时,该文件必须已经存在,且只能从该文件读出。 3)用“w〃打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该 文件,若打开的文件已经存在,则将该文件删去,重建一个新文件 4)若要向一个已存在的文件追加新的信息,只能用“a〃方式打开文件。但此时该文件必须 是存在的,否则将会出错。 5)在打开一个文件时,如果出错, fopen将返回一个空指针值NUL。在程序中可以用这 信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件 if((fp=fopen ("c: \\hzk16", rb")==NULL) printf( \nerror on open c: \\hzk16 file! ")
“文件名”是被打开文件的文件名; “使用文件方式”是指文件的类型和操作要求。 “文件名”是字符串常量或字符串数组。 例如: FILE *fp; fp=("file a","r"); 其意义是在当前目录下打开文件 file a,只允许进行“读”操作,并使 fp 指向该文件。 又如: FILE *fphzk fphzk=("c:\\hzk16","rb") 其意义是打开 C 驱动器磁盘的根目录下的文件 hzk16,这是一个二进制文件,只允许按二进 制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。 使用文件的方式共有 12 种,下面给出了它们的符号和意义。 文件使用方式 意义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读写打开一个文本文件,允许读和写 “wt+” 读写打开或建立一个文本文件,允许读写 “at+” 读写打开一个文本文件,允许读,或在文件末追加数据 “rb+” 读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和写 “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据 对于文件使用方式有以下几点说明: 1) 文件使用方式由 r,w,a,t,b,+六个字符拼成,各字符的含义是: r(read): 读 w(write): 写 a(append): 追加 t(text): 文本文件,可省略不写 b(banary): 二进制文件 +: 读和写 2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。 3) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该 文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须 是存在的,否则将会出错。 5) 在打开一个文件时,如果出错,fopen 将返回一个空指针值 NULL。在程序中可以用这一 信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件: 6) if((fp=fopen("c:\\hzk16","rb")==NULL) { printf("\nerror on open c:\\hzk16 file!");
getcho exit 这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzkl6文件 则给出提示信息 error on open C:\hzkl6file!",下一行 retch的功能是从键盘输 入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任 一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行 exit(1)退出程序。 7)把一个文本文件读入内存时,要将 ASCII码转换成二进制码,而把文件以文本方式写入 磁盘时,也要把二进制码转换成ASCIⅠ码,因此文本文件的读写要花费较多的转换时间。 对二进制文件的读写不存在这种转换。 8)标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开 的,可直接使用 1332文件关闭函数(fc|ose函数 文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。 fclose函数调用的一般形式是 fclose(文件指针); 例如: fclose(fp) 正常完成关闭文件操作时, fclose函数返回值为0。如返回非零值则表示有错误发生 134文件的读写 对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数: 字符读写函数: fgetc和 fputc 字符串读写函数: fgets和 fputs 数据块读写函数: freed和 fwrite 格式化读写函数: fscanf和 print 下面分别予以介绍。使用以上函数都要求包含头文件 stdio.h 1341字符读写函数 fgetc和 fputc 字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个 字符 1.读字符函数 fgetc fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为 字符变量= fgetc(文件指针) ch=fgetc(fp) 其意义是从打开的文件fp中读取一个字符并送入ch中
getch(); exit(1); } 这段程序的意义是,如果返回的指针为空,表示不能打开 C 盘根目录下的 hzk16 文件, 则给出提示信息“error on open c:\ hzk16 file!”,下一行 getch()的功能是从键盘输 入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任 一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行 exit(1)退出程序。 7) 把一个文本文件读入内存时,要将 ASCII 码转换成二进制码,而把文件以文本方式写入 磁盘时,也要把二进制码转换成 ASCII 码,因此文本文件的读写要花费较多的转换时间。 对二进制文件的读写不存在这种转换。 8) 标准输入文件(键盘),标准输出文件(显示器),标准出错输出(出错信息)是由系统打开 的,可直接使用。 13.3.2 文件关闭函数(fclose 函数) 文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。 fclose 函数调用的一般形式是: fclose(文件指针); 例如: fclose(fp); 正常完成关闭文件操作时,fclose 函数返回值为 0。如返回非零值则表示有错误发生。 13.4 文件的读写 对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数: ·字符读写函数 :fgetc 和 fputc ·字符串读写函数:fgets 和 fputs ·数据块读写函数:freed 和 fwrite ·格式化读写函数:fscanf 和 fprinf 下面分别予以介绍。使用以上函数都要求包含头文件 stdio.h。 13.4.1 字符读写函数 fgetc 和 fputc 字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个 字符。 1. 读字符函数 fgetc fgetc 函数的功能是从指定的文件中读一个字符,函数调用的形式为: 字符变量=fgetc(文件指针); 例如: ch=fgetc(fp); 其意义是从打开的文件 fp 中读取一个字符并送入 ch 中
对于 fgetc函数的使用有以下几点说明: 1)在 fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 2)读取字符的结果也可以不向字符变量赋值 例如: fgetc(fp) 但是读出的字符不能保存。 3)在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指 针总是指向文件的第一个字节。使用 fgetc函数后,该位置指针将向后移动一个字 节。因此可连续多次使用 fgetc函数,读取多个字符。应注意文件指针和文件内部 的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要 不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当 前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由 系统自动设置的。 【例13.1】读入文件c1.doc,在屏幕上输出。 #include main o FILE *f char ch if((fp=fopen("d: \\jrzh\ \example\\cl. txt", rt"))=NULL printf(" \nCannot open file strike any key exit! " getcho exit(1) ch=fgetc(fp) while(ch!=EOF) putchar(ch) ch=fgetc(fp) fclose(fp) 本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以 读文本文件方式打开文件d:\ jrzh\\example\\exl1.c",并使fp指向该文件。如打开文 件出错,给出提示并退出程序。程序第12行先读出一个字符,然后进入循环,只要读出的字 符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下 字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF 执行本程序将显示整个文件。 2.写字符函数 fputc fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为 fputc(字符量,文件指针)
对于 fgetc 函数的使用有以下几点说明: 1) 在 fgetc 函数调用中,读取的文件必须是以读或读写方式打开的。 2) 读取字符的结果也可以不向字符变量赋值, 例如: fgetc(fp); 但是读出的字符不能保存。 3) 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指 针总是指向文件的第一个字节。使用 fgetc 函数后,该位置指针将向后移动一个字 节。 因此可连续多次使用 fgetc 函数,读取多个字符。应注意文件指针和文件内部 的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要 不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当 前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由 系统自动设置的。 【例 13.1】读入文件 c1.doc,在屏幕上输出。 #include main() { FILE *fp; char ch; if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL) { printf("\nCannot open file strike any key exit!"); getch(); exit(1); } ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } fclose(fp); } 本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针 fp,以 读文本文件方式打开文件“d:\\jrzh\\example\\ex1_1.c”,并使 fp 指向该文件。如打开文 件出错,给出提示并退出程序。程序第 12 行先读出一个字符,然后进入循环,只要读出的字 符不是文件结束标志(每个文件末有一结束标志 EOF)就把该字符显示在屏幕上,再读入下一 字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向 EOF。 执行本程序将显示整个文件。 2. 写字符函数 fputc fputc 函数的功能是把一个字符写入指定的文件中,函数调用的形式为: fputc(字符量,文件指针);
其中,待写入的字符量可以是字符常量或变量,例如 fputc( a', fp) 其意义是把字符a写入fp所指向的文件中 对于 fputc函数的使用也要说明几点: 1)被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的 文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容, 希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不 存在,则创建该文件。 2)每写入一个字符,文件内部位置指针向后移动一个字节。 3) fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用 此来判断写入是否成功 【例13.2】从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。 #<stdio. h main o FILE fp if((fp=fopen(d: \\jrzh\\example\\string","wt+"))==NULL) printf ("cannot open file strike any key exit! " getcho exit(1) printf( input a string: \n") ch=getchar o while(ch!=\n') fputc(ch, fp) ch=getchar o rewind(fp) ch=fgetc(fp) while(ch!=EOF) putchar(ch) ch=fgetc(fp) printf( "\n") 包 程序中第6行以读写文本文件方式打开文件 string。程序第13行从键盘读入一个字符 后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下
其中,待写入的字符量可以是字符常量或变量,例如: fputc('a',fp); 其意义是把字符 a 写入 fp 所指向的文件中。 对于 fputc 函数的使用也要说明几点: 1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的 文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容, 希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不 存在,则创建该文件。 2) 每写入一个字符,文件内部位置指针向后移动一个字节。 3) fputc 函数有一个返回值,如写入成功则返回写入的字符,否则返回一个 EOF。可用 此来判断写入是否成功。 【例 13.2】从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。 #include main() { FILE *fp; char ch; if((fp=fopen("d:\\jrzh\\example\\string","wt+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("input a string:\n"); ch=getchar(); while (ch!='\n') { fputc(ch,fp); ch=getchar(); } rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); } 程序中第 6 行以读写文本文件方式打开文件 string。程序第 13 行从键盘读入一个字符 后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下
字符。每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已指向 文件末。如要把文件从头读出,须把指针移向文件头,程序第19行 rewind函数用于把fp 所指文件的内部位置指针移到文件头。第20至25行用于读出文件中的一行内容。 【例13.3】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中 #<stdio. h main(int argc, char s*argv[]) FILE fpl, *fp2 char ch printf( have not enter file name strike any key exit") retch exit(o) if((fpl=fopen (argv [1], "rt"))==NULL printf (Cannot open %s\n", argv[1]) cho exit(1) if(argc==2)fp2=stdout else if((fp2=fopen(argv [2], " wt+))==NULL) printf("Cannot open %s\n", argv[1]) cho exit(1) while((ch=fgetc(fp1))!=EOF fputc(ch, fp2) fclose (fp1) fclose(fp2) 本程序为带参的main函数。程序中定义了两个文件指针fpl和fp2,分别指向命令行参 数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第18行表示如果 只给出一个文件名,则使fp2指向标准输出文件(即显示器)。程序第25行至28行用循环语 句逐个读出文件1中的字符再送到文件2中。再次运行时,给出了一个文件名,故输出给标 准输出文件 stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把 string中的内容读出,写入到0K之中。可用DOS命令type显示OK的内容
一字符。每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已指向 文件末。如要把文件从头读出,须把指针移向文件头,程序第 19 行 rewind 函数用于把 fp 所指文件的内部位置指针移到文件头。第 20 至 25 行用于读出文件中的一行内容。 【例 13.3】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。 #include main(int argc,char *argv[]) { FILE *fp1,*fp2; char ch; if(argc==1) { printf("have not enter file name strike any key exit"); getch(); exit(0); } if((fp1=fopen(argv[1],"rt"))==NULL) { printf("Cannot open %s\n",argv[1]); getch(); exit(1); } if(argc==2) fp2=stdout; else if((fp2=fopen(argv[2],"wt+"))==NULL) { printf("Cannot open %s\n",argv[1]); getch(); exit(1); } while((ch=fgetc(fp1))!=EOF) fputc(ch,fp2); fclose(fp1); fclose(fp2); } 本程序为带参的 main 函数。程序中定义了两个文件指针 fp1 和 fp2,分别指向命令行参 数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第 18 行表示如果 只给出一个文件名,则使 fp2 指向标准输出文件(即显示器)。程序第 25 行至 28 行用循环语 句逐个读出文件 1 中的字符再送到文件 2 中。再次运行时,给出了一个文件名,故输出给标 准输出文件 stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把 string 中的内容读出,写入到 OK 之中。可用 DOS 命令 type 显示 OK 的内容
1342字符串读写函数 fgets和 fputs 1.读字符串函数fget 函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为 fgets(字符数组名,n,文件指针) 其中的n是一个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入的最后 个字符后加上串结束标志\0’。 例如: fgets(str, n, fp); 的意义是从fp所指的文件中读出n-1个字符送入字符数组str中 【例13.4】从 string文件中读入一个含10个字符的字符串。 #include main o FILE *fp; char str[lll if((fp=fopen("d: \\jrzh\ \example\\string, rt"))==NULL) printf(" \nCannot open file strike any key exit! retch exit(1) fgets(str, 11, fp) printf("\n%s\n, str) fclose(fp) 本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件 string后 从中读出10个字符送入str数组,在数组最后一个单元内将加上’\0',然后在屏幕上显示输 出str数组。输出的十个字符正是例13.1程序的前十个字符 对 fgets函数有两点说明: 1)在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。 2) fgets函数也有返回值,其返回值是字符数组的首地址。 2.写字符串函数 fputs fputs函数的功能是向指定的文件写入一个字符串,其调用形式为 fputs(字符串,文件指针); 其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,例如: fputs("abcd", fp) 其意义是把字符串“abcd"写入fp所指的文件之中。 【例13.5】在例13.2中建立的文件 string中追加一个字符串 #<stdio. h
13.4.2 字符串读写函数 fgets 和 fputs 1. 读字符串函数 fgets 函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的 n 是一个正整数。表示从文件中读出的字符串不超过 n-1 个字符。在读入的最后 一个字符后加上串结束标志'\0'。 例如: fgets(str,n,fp); 的意义是从 fp 所指的文件中读出 n-1 个字符送入字符数组 str 中。 【例 13.4】从 string 文件中读入一个含 10 个字符的字符串。 #include main() { FILE *fp; char str[11]; if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL) { printf("\nCannot open file strike any key exit!"); getch(); exit(1); } fgets(str,11,fp); printf("\n%s\n",str); fclose(fp); } 本例定义了一个字符数组 str 共 11 个字节,在以读文本文件方式打开文件 string 后, 从中读出 10 个字符送入 str 数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输 出 str 数组。输出的十个字符正是例 13.1 程序的前十个字符。 对 fgets 函数有两点说明: 1) 在读出 n-1 个字符之前,如遇到了换行符或 EOF,则读出结束。 2) fgets 函数也有返回值,其返回值是字符数组的首地址。 2. 写字符串函数 fputs fputs 函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针); 其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,例如: fputs(“abcd“,fp); 其意义是把字符串“abcd”写入 fp 所指的文件之中。 【例 13.5】在例 13.2 中建立的文件 string 中追加一个字符串。 #include main()
char ch, st [20] f((fp=fopen(string",at+ ))==NULL) printf("Cannot open file strike any key exit! " tcho exit(1) printf( input a string: \n") scanf(%s", st fputs(st, fp) ch=fgetc(fp) outchar(ch) ch=fgetc close(ip 本例要求在 string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式 打开文件 string。然后输入字符串,并用 fputs函数把该串写入文件 string。在程序15行 用 rewind函数把文件内部位置指针移到文件首。再进入循环逐个显示当前文件中的全部内 容 1343数据块读写函数 fread和 trite C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素, 个结构变量的值等。 读数据块函数调用的一般形式为: fread(buffer, size, count, fp) 写数据块函数调用的一般形式为 fwrite (buffer, size, count, fp) 其中 buffer是一个指针,在 fread函数中,它表示存放输入数据的首地址。在 fwrite函数 中,它表示存放输出数据的首地址。 size表示数据块的字节数 count表示要读写的数据块块数 表示文件指针。 例如
{ FILE *fp; char ch,st[20]; if((fp=fopen("string","at+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("input a string:\n"); scanf("%s",st); fputs(st,fp); rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); } 本例要求在 string 文件末加写字符串,因此,在程序第 6 行以追加读写文本文件的方式 打开文件 string。然后输入字符串,并用 fputs 函数把该串写入文件 string。在程序 15 行 用 rewind 函数把文件内部位置指针移到文件首。再进入循环逐个显示当前文件中的全部内 容。 13.4.3 数据块读写函数 fread 和 fwtrite C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一 个结构变量的值等。 读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中: buffer 是一个指针,在 fread 函数中,它表示存放输入数据的首地址。在 fwrite 函数 中,它表示存放输出数据的首地址。 size 表示数据块的字节数。 count 表示要读写的数据块块数。 fp 表示文件指针。 例如:
fread(fa, 4, 5, fp) 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次 即读5个实数到fa中。 【例13.6】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏 #include struct stu char name [10] 1nt num char addr[15] I boya [2], boy [2], *pp, *qg nain FILE *fp char ch qq=boy if((fp=fopen(d: \\jrzh\ \example\\stu list", wb+"))==NULL) printf( Cannot open file strike any key exit! " tetcho exit(1) printf("\input data\n") for(i=0;iname, &pp->num, &pp->age, pp->addr) pp=boya fwrite(pp, sizeof (struct stu), 2, fp) rewind(fp) fread(qg, sizeof (struct stu), 2, fp) printf("\n\nname\number addr\n") for(i=0;iname, qg>num, ggr>age, qg->addr) fclose(fp) 包 本例程序定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量 pp和 quo pp指向boya,q指向boyb。程序第16行以读写方式打开二进制文件stu_list", 输入二个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两块学 生数据后,在屏幕上显示
fread(fa,4,5,fp); 其意义是从 fp 所指的文件中,每次读 4 个字节(一个实数)送入实数组 fa 中,连续读 5 次, 即读 5 个实数到 fa 中。 【例 13.6】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏 幕上。 #include struct stu { char name[10]; int num; int age; char addr[15]; }boya[2],boyb[2],*pp,*qq; main() { FILE *fp; char ch; int i; pp=boya; qq=boyb; if((fp=fopen("d:\\jrzh\\example\\stu_list","wb+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("\ninput data\n"); for(i=0;iname,&pp->num,&pp->age,pp->addr); pp=boya; fwrite(pp,sizeof(struct stu),2,fp); rewind(fp); fread(qq,sizeof(struct stu),2,fp); printf("\n\nname\tnumber age addr\n"); for(i=0;iname,qq->num,qq->age,qq->addr); fclose(fp); } 本例程序定义了一个结构 stu,说明了两个结构数组 boya 和 boyb 以及两个结构指针变量 pp 和 qq。pp 指向 boya,qq 指向 boyb。程序第 16 行以读写方式打开二进制文件“stu_list”, 输入二个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两块学 生数据后,在屏幕上显示