第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:

Slides:



Advertisements
Similar presentations
C语言程序设计 主讲教师 :张群燕 电话:
Advertisements

电子成绩单项目实现.
第九章 字串 (String).
補充: Input from a text file
基于操作系统的编程复习 张玉宏
雷 霆 战 机 By—谷恩轩&余万全.
第 5 章 文件I/O操作.
C程序设计 第10章 文 件 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
第十三章 文件.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
複習 struct score_Type{ int chinese,english; }; struct my_Type{
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C File System.
C 程序设计实例 1. 问题描述 2. 数据结构 3. 算法分析 4. 参考程序 5. 改进说明.
函數 授課:ANT 日期:2009/3/24.
计算概论 第二十一讲 文件操作 北京大学信息学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
函數 授課:ANT 日期:2011/3/28.
第10章 文件操作.
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
第10章 文件操作.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
Function.
程序设计期末复习 黎金宁
程式撰寫流程.
C 語言簡介 - 2.
11.1 文件的基本概念 11.2 文件的打开与关闭 11.3 文件的顺序读写 11.4 文件的随机读写 11.5 文件检测
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第四章 C 语言中的输入和输出.
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
第4章 MATLAB文件操作 4.1 文件的打开与关闭 4.2 文件的读写操作 4.3 数据文件定位.
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
程式設計 博碩文化出版發行.
第九章 文件 程序数据标准输入输出设备 程序数据文件 数据流和文件 文件的打开和关闭 文件读写函数.
File(檔案處理) 學習目標:開檔、讀檔、更新檔與關閉檔案.
THE C PROGRAMMING LANGUAGE
字符串和字符数组 字符串的输入和输出 字符串的基本操作
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
Linux 文件操作——系统调用和标准 IO 库
第5章 文件.
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
第十章 指针.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
研讨课4 文件操作.
PHP5與MySQL4 入門學習指南 凱文瑞克 著 第 16 章 檔案處理.
MATLAB介绍 Matlab基本命令介绍 Matlab矩阵运算 Matlab控制流 Matlab图像处理工具箱 实习题讲解.
Struct結構 迴圈
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
C语言概述 第一章.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
第3章 變數、算術運算、 數學函數及輸入輸出.
第 二 章 数据类型、运算符与表达式.
實習十 開讀檔練習.
C標準輸出入函數庫 與 作業系統.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第四章 C 语言中的输入和输出.
第13章 文 件.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
实验二:添加Linux系统调用及熟悉常见系统调用
結構、檔案處理(Structure, File)
Arguments to the main Function and Final Project
第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab2.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C语言程序设计 第13章 文件操作.
Q6. 某學校將學生的電話號碼存貯在一個文字檔'telist.txt'。 在這交字檔中,每行有14個字符,代表學生班別、班號和電話號碼,
Presentation transcript:

第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 11.1 11.6 练习: 11.2 11.3 11.4 11.5 第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 11.1 11.6 练习: 11.2 11.3 11.4 11.5 11.7--11.14

§11.1 重新考虑图书卡管理问题 应该把所有图书卡片保存在磁盘上,每次运行程序时不必都重新输入! §11.1 重新考虑图书卡管理问题 回顾例8.1,图书管理程序当时把图书卡片保存在数组中,仅保存100张卡片,而且每次执行程序都要重新输入所有卡片,这显然不合理。 应该把所有图书卡片保存在磁盘上,每次运行程序时不必都重新输入! 应该可以管理大量的卡片,不能限制数量!因为任何图书馆,其藏书数量都是极大的。 使用文件可以解决这个问题。

【例11.1】使用文件保存图书检索卡数据,重新编写例8.1程序的函数。 解:设全部卡片存放在文件card.dat中。检索函数对欲检索的书号采用顺序检索方式检索;检索到后输出;最后输出提示信息“search end!”。程序如下。 void out_answer( struct bookcard * );// 输出检索结果函数,略 void searchbook( struct bookno );// 检索函数原型 void inputbookno(struct bookno * ); //输入书号 // 书号结构体、日期结构体、检索卡结构体同例8.1

#include "stdio.h" enum class_language { Chinese,English,Japanese,Spaish,Russian };//语种枚举类型 struct date { // 日期结构体类型 int year,month,day ; } ; struct bookno { // 书号结构体类型 char catalogue ; int order ; struct bookcard { // 检索卡结构体类型 char name[32],author[16]; enum class_language languge ; struct date publishingdate ; struct bookno no ; char abstract[256]; } card ;

FILE * cardpointer ; /* 文件指针 */ /* 主程序 */ void main(){ struct bookno no1; cardpointer=fopen("card.dat","r" ); //打开了文件card.dat //输入部分:不用输入,数据在文件中 printf("\nstart search:"); //检索部分 inputbookno(&no1); //输入欲检索的第一个书号 while ( no1.catalogue !='#') { searchbook(no1); inputbookno(&no1); //输入欲检索的下一个书号 } fclose(cardpointer); //关闭文件 } // 主程序结束

/* 检索函数 */ void searchbook(struct cardno no2) { struct bookcard card; rewind(cardpointer); while ( !feof(cardpointer) ) { fread( &card , sizeof(struct bookcard) ,1, cardpointer); if ( ( card.no.catalogue == no2.catalogue ) && ( card.no.order == no2.order ) ) out_anser(&card) ; } printf(“search end!\n”);

//输入一个书号函数 void inputbookno(struct bookno * no){ printf("\nstart search:\nplease input bookno.catalogue:"); scanf("%c",&(no->catalogue)); while(no->catalogue<=' ') printf("\nplease input bookno.order:"); scanf("%d",&(no->order)); }

运行结果演示 /* 输出检索结果函数 */ void out_answer( struct bookcard *card0 ){ printf( "NAME:%s\n", card0->name ); printf( "AUTHOR:%s\n", card0->author); printf( "LANGUGE:"); switch (card0->languge ){ case Chinese:printf( "Chinese\n");break; case Japanese:printf( "Japanese\n");break; case English:printf( "English\n");break; case Spaish:printf( "Spaish\n");break; case Russian:printf( "Russian\n"); } printf("Publish date:%d.%d.%d\n" ,card0->publishingdate.year ,card0->publishingdate.month ,card0->publishingdate.day); printf( "ABSTRACT:" ) ; printf( "%s",card0->abstract) ; printf("\n"); 运行结果演示

§11.2 文件概述 文件是为了某种目的系统的把数据组织起来而构成的数据集合体 §11.2 文件概述 文件是为了某种目的系统的把数据组织起来而构成的数据集合体 从实现角度看:文件往往与外部没备、磁盘上的文件联系在一起,也就是与计算机操作系统的文件联系在一起 人们往往需要加工处理各式各样的数据,连接各种各样的外部设备。这些数据和设备是千差万别的。 为了处理的统一与概念的简化,操作系统把这些外部数据、外部设备一律作为文件来管理。 程序设计语言中管理的文件,就是计算机操作系统中的文件。

文件是程序设计中的一个重要概念,从不同的角度看文件可以分成不同的 从操作角度看 顺序文件 随机文件 从用户角度看 普通文件 设备文件 从文件内部编码方式看 ASCII文件 二进制文件

文件名 文件名是文件的唯一标识,它的一般结构是 主文件名.扩展名 其中的扩展名可以省略,但通常都保留。 通过扩展名,可以判断文件类型。例如. .c C语言的源程序文件 .txt 文本文件 .doc word文档文件

文件名分为 例如: 绝对文件名 从磁盘盘符开始描述的文件名 相对文件名 从计算机操作系统中文件系统的某个节点开始描述的文件名 E:\doc\programing\test.c 表示绝对文件名 test.c 表示相对于节 E:\doc\programing的相对文件名

顺序文件和随机文件 顺序文件的特点:文件分成两种模式 读模式 写模式 读模式 写模式 在任意时刻,一个顺序文件只能处于两种模式之一。当一个顺序文件处于读模式时,只能从该文件读数据。 反之,当一个顺序文件处于写模式时,只能向该文件写数据。 从操作角度看,顺序文件只能顺序操作。 对于读来讲,顺序文件只能从文件第一成分开始顺序的,一个成分接一个成分的读数据。 对于写来讲,顺序文件只能在文件尾一个成分接一个成分的向文件里写数据,每次写进的成分都放在文件末尾

随机文件的特点是:对文件的操作是随机 在同一时刻,即可以向文件中写,也可以从文件中读(文件没有读写模式之分)。 读写操作可以针对文件中任意成分进行。 例如 第一次读了第100个成分 然后再读第3个成分 然后再用一个新的数据修改第50 成分 将其写入第50个成分中 然后又读第200个成分...,等等。 这是允许的,并且是正确的。

普通文件和设备文件 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源程序文件、目标程序文件、可执行程序文件;也可以是一组待输入处理的原始数据,或者是一组输出的结果。 设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。 在操作系统中,把外部设备也作为文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。通常显示器定义为标准输出文件,键盘是标准输入文件

ASCII文件和二进制文件 ASCII文件就是ASCII码文件,也称为文本文件、TEXT文件。 这种文件每个字符对应一个字节,用于存放相应字符的ASCII码,也就是存放字符的存储形态的编码。 字符1、2、3、4的ASCII码分别为49、50、51、52(十六进制的31、32、33、34),字符串“1234”的存储形式为: 共占用4个字节。ASCII文件可以在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可以显示文件的内容。由于是按字符显示,因此能读懂文件内容。

二进制文件就是二进制码文件,它把数据按二进制编码方式存放到文件中。例如,数1234的存储形式为: 0000010011010010 只占二个字节。 用TYPE命令显示二进制文件是无意义的,其内容无法读懂。

流式文件 C系统的文件操作,不区分文件类别。不论 顺序文件还是随机文件、 普通文件还是设备文件、 ASCII文件还是二进制文件。 对字节流的操作;输入输出的开始和结束都由程序控制,不受物理符号(如回车符)的影响。把这种文件操作方式称作“流式文件”。

文件指针 C 系统为了处理文件,为每个文件在内存中开辟一个区域,用来存放文件的有关信息,如文件名、文件状态以及文件当前位置等。 这个区域被作成一个称为 FILE 类型的结构体。FILE 的类型由系统定义,保存在头文件 stdio.h 中,它的具体结构我们暂时不用关心。 C 程序中用指向 FILE 类型变量的指针变量(简称“文件指针”)来标识具体文件。变量声明 FILE *fp ; 声明了一个文件指针变量 fp ,以后 fp 可以用来标识具体文件。

标记 C文件是一个流式文件,在该字节流上有一个隐含的暗标记,该标记总是指向文件中正要操作的字节,即下一个字节,称该标记为文件读写位置指针。 例如: □□□ … □ … 指向文件首,即指向第一个字节 ↑ □□□□ … □ … 指向第四个字节; □□□ … □□ . 指向文件尾;

几个常量 C系统引进几个常量标志文件处理状态。最常用的是 EOF 和 NULL,它们是 stdio.h 中预定义的常量。 习惯上表示文件结束,或文件操作出错; NULL:值为“0” 习惯上表示打开文件失败等。

§11.3 文件操作 C没有文件操作语句,C文件操作全部通过系统定义的库函数来实现。 §11.3 文件操作 C没有文件操作语句,C文件操作全部通过系统定义的库函数来实现。 “库函数”是指系统已经定义好的,存放在“函数库”文件内的,可以被用户直接调用的函数。这些库函数根据其功能的不同,存放在不同的函数库中。 库函数本身并不属于语言,它是系统根据需要提供给用户使用的函数。C 标准定义了常用的函数库和每个函数库中常用的库函数。但是不同的编译系统提供的函数库不同,不同编译系统在每个函数库中提供的库函数也不同。为了提高程序的可移植性,用户应该只使用 C 标准定义的函数库和库函数。

对应每个函数库,有一个头文件,在头文件中包含相应函数库中所有函数的函数原型。用户使用库函数时,需要把相应的头文件用 #include 命令括入到自己的程序文件中。 文件操作函数库的头文件是 “stdio.h”,在用户程序中只要涉及文件操作,即只要涉及输入输出就应该把该文件括入程序中,使用的程序行是: #include "stdio.h" 这就是为什么前述各个章节的程序都含有这一行的原因。

任何高级语言,对文件操作都应该遵循: 打开文件 → 操作文件 → 关闭文件 这样的过程。 下面就遵循这个规则对文件的操作进行说明

§11.3.1 打开和关闭文件 1.打开 函数原型 FILE* fopen ( const char* filename, const char* mode ); 调用方式 fp = fopen( filename , mode ); filename 是一个字符串,具体给出要打开的文件的文件名; mode 也是一个字符串,具体给出文件的打开模式, 表12-1列出各种打开模式; fp 是文件指针变量,以后程序中使用该指针变量标识由文件名给出的文件。

fopen 根据 mode 指定的模式,打开由filename指定的文件。 例如: fp = fopen( "c:\user\file.txt" , "r" ) ; 以“只读”方式,打开 c 盘 user 节点下的 file.txt 文件。如果成功则 fp 就是文件 file.txt 的文件指针变量,并且只允许对文件进行读操作;否则 fp 的值是 NULL 。

下表给出文件打开模式 mode 及其含义。 序号 mode 含义 1 “r” 以只读方式打开一个ASCII文件 2 “w” 以只写方式打开或新建一个ASCII文件,原有文件内容全部删除 3 “a” 同“w”,但是不删除原有文件内容 4 “r+” 以可读可写方式打开一个ASCII文件 5 “w+” 以可读可写方式打开或新建一个ASCII文件,原有文件内容全部删除 6 “a+” 同“w+”,但是不删除原有文件内容

7 “rb” 以只读方式打开一个二进制文件 8 “wb” 以只写方式打开或新建一个二进制文件,原有文件内容全部删除 9 “ab” 同“wb”,但是不删除原有文件内容 10 “rb+” 以可读可写方式打开一个二进制文件 11 “wb+” 以可读可写方式打开或新建一个二进制文件,原有文件内容全部删除 12 “ab+” 同“wb+”,但是不删除原有文件内容

2. 关闭文件 函数原型 int fclose( FILE * stream ); 调用方式 fclose( fp );

功能 从fp指向的文件中读取一个字符,同时将读写位置指针向前移动1个字节 §11.3.2 字符读写 1. 读字符 函数原型: int fgetc( FILE * fp ); 功能 从fp指向的文件中读取一个字符,同时将读写位置指针向前移动1个字节

2.写字符 函数原型 int fputc( int ch, FILE * fp ); 功能 把字符ch写入fp指向的文件,同时将读写位置指针向前移动1个字节。

§11.3.3 字符串读写 1. 读字符串 函数原型: char *fgets( char *str , int num , FILE * fpointer ); 功能: 从fpointer指向的文件中读取一个字符串,并将此串保存在str指向的字符数组中。 字符串的自然结束符是 “换行符” 和 “文件结束符”。 若读到 num-1 个字符后还没遇到结束符,则也强制结束,这时把 num-1 个读入的字符送入数组 str 中。 读入结束后,在数组 str的字符串末尾加字符串终止字符 NULL; 并将文件读写位置指针向前移动实际读取的字节个数

2.写字符串 函数原型 int *fputs( char *str , FILE * fpointer ); 功能: 把str所指字符串(不包括字符串结束符NULL)写入fpointer指向的文件, 同时将读写位置指针向前移动num(字符串长度)个字节。

§11.3.4 读数据块 1.读数据块 函数原型: int fread( void *buf , int size ,int count , FILE *fp ); 功能: 从fp所指的文件中读取count个字段, 每个字段为size个字节,把它们送到buf所指的缓冲数组中, 同时,将读写位置指针向前移动size* count个字节。 一般来讲,数组buf每个元素的尺寸为size ,每个字段正好对应数组buf的一个元素;即读入count个字段送入数组buf的count个元素中。

2. 写数据块 函数原型: int fwrite( void *buf, int size, int count, FILE *fp ); 功能: 从buf所指的数组中,把count个字段写到fp所指的文件中,每个字段为size个字节, 同时,将读写位置指针向前移动size*count个字节。 一般来讲,数组buf每个元素的尺寸为size ,每个字段正好对应数组buf的一个元素;即把数组buf的count个元素写到文件中。

§11.3.5 格式化读写 读/写多个含格式的数据时选用 fscanf() 和 fprintf() 函数。 函数fscanf() 和 fprintf() 与函数 scanf() 和 printf() 的功能相似, 区别在于函数 fscanf() 和 fprintf() 操作对象是一般文件,而 scanf() 和printf() 操作对象是标准输入输出文件。 格式化读写是把数据按 fscanf()和 fprintf() 函数中格式控制字符串中控制字符的要求进行转换,然后再进行读/写。 格式转换在第三章的3.8节已经介绍过,这里不再赘述

1. 格式化输入 函数原型: int fscanf( FILE * fp , char * format , arg_list ); 功能: 从fp所指文件,按format规定的格式进行转换,读取arg_list对应的数据

2. 格式化输出 函数原型 int fprinft( FILE * fp , char * format , arg_list ); 功能 将arg_list内的各参数值按format格式进行转换,输出到fp所指的文件。

§11.3.6 文件定位 C文件是一个流式文件,在该字节流上有一个隐含的暗标记(文件读写位置指针),该标记总是指向文件中正要操作的字节。 当以读模式(“r”)打开文件时,文件读写位置指针指向文件开始; 当以写模式(“w”)打开文件时,文件读写位置指针指向文件开始; 当以追加写模式(“a”)打开文件时,文件读写位置指针指向文件尾; 当以各种随机模式(“a+”、“w+”、“a+”)打开文件时,文件读写位置指针指向文件开始。

在对文件进行任何读写操作时,位置指针都自动向下移动相应个数的字节。如果要打破这种规律,就必须使用定位函数对位置指针重新定位。 函数rewind 和 fseek 用于位置指针定位 函数 ftell 和 feof 用于测试文件位置指针当前所处位置。

rewind( )函数 原型:void rewind( FILE *fp ); 功能:使fp所指文件的位置指针重新指向文件开始 返回值:无 ftell( )函数 原型:long int ftell( FILE *fp ); 功能:给出fp所指文件的位置指针当前所处位置。

int fseek( FILE *fp, long offset, int origin); 功能: 原型: int fseek( FILE *fp, long offset, int origin); 功能: 使fp所指文件的指针指向origin+offset的位置 表示起始位置的宏 起始位置(origin) 宏定义 数字代表 文件开始 SEEK_SET 文件当前位置 SEEK_CUR 1 文件结尾 SEEK_END 2

feof( )函数 原型: int feof( FILE *fp ); 功能: fp 是输入流,标志是否“读”到fp所指文件末尾,即文件是否结束。

§11.4 程序设计实例

例11-2 实现文本文件复制的功能 void main(int argc, char *argv[]){ 例11-2 实现文本文件复制的功能 void main(int argc, char *argv[]){ FILE *output; /* 目标文件指针 */ char ch; if(argc!=3){ /*参数个数不对*/ printf("the number of arguments not correct\n"); printf("\n Usage: 可执行文件名 source-file dest-file"); exit(0); /*退出*/ } if ((input=fopen(argv[1],"r"))==NULL){ /*打开源文件失败*/ printf("can not open source file\n"); exit(0);

if ((output=fopen(argv[2],"w"))==NULL){ /*创建失败*/ printf("can not create destination file\n"); exit(0); } while ((ch=fgetc(input))!=EOF){ /*复制源文件到目标文件中*/ fputc(ch,output); fclose(input); /*关闭源文件*/ fclose(output); /*关闭目标文件*/

例11-3 创建某文本文件的副本, 副本文件要有行号 例11-3 创建某文本文件的副本, 副本文件要有行号 int line=1; /* 复制 */ fprintf( output, "%5d", line ); /*写入第一行行号*/ while((ch=fgetc(input))!=EOF){ fputc( ch,output ); /* 写入当前字符 */ if ( ch=='\n' || ch=='\r' ) fprintf( output, "%5d", line++ ); /*,行号增1*/ }

还可以使用fgets和fputs字符串I/O函数,编出更简洁的程序。编出程序如下 #define SIZE 256 void main(int argc, char *argv[]){ char buf[SIZE]; … … … … while(fgets(buf,SIZE,input)!=NULL){ fprintf( output, "%5d", line++ ); fputs(buf,output); }

例11-4 合并两个已按递增排序的整数 文件成一个按递增排序文件 例11-4 合并两个已按递增排序的整数 文件成一个按递增排序文件 开始 结束 V1写入f3 ; 读f1 V2写入f3; 读f2 文件 f1 未结束 文件 f2 未结束 V1写入f3 ;读f1 V2写入f3;读f2 文件 f1 与 f2 均未结束 v1<v2 打开文件:f1、f2、f3 读f1、f2→v1、v2

fread( &v1 , sizeof(int) , 1 , f1 ); while( !feof(f1) && !feof(f2) ) { if (v1 < v2) { /* 取较小元素存入f3文件 */ fwrite( &v1 , sizeof(int) , 1 , f3 ); fread( &v1 , sizeof(int) , 1 , f1 ); }else { fwrite( &v2 , sizeof(int) , 1 , f3 ); fread( &v2 , sizeof(int) , 1 , f2 ); } while( !feof(f1) ) { /* 处理f1文件尾部 */ while( !feof(f2) ) { /* 处理f2文件尾部 */

例 11-5 在磁盘中建立一个正弦函数表文件“sin.tab” 格式如下: THE LIST OF SIN(X) 例 11-5 在磁盘中建立一个正弦函数表文件“sin.tab” 格式如下: THE LIST OF SIN(X) a SIN(a) a SIN(a) a SIN(a) a SIN(a) a SIN(a) 0 0.0000 1 0.0175 2 0.0349 3 0.0523 4 0.0698 5 0.0872 6 0.1045 7 0.1219 8 0.1392 9 0.1564          ... ...         到 359°为止

开始 打印表头 for( v=0; v<=71; v++) 写( fp , v*5+u , sin((v*5+u) *π/180) ) for( u=0; u<=4; u++) 写(fp,”\n”) 结束

void main(){ int u,v; FILE *f; if (( f=fopen(“sin.tab”,"w"))==NULL){ /*打开文件*/ printf("can not open file \"sin.tab\"\n"); exit(0); } fprintf( f , "%20c THE LIST OF SIN(X)\n" , ' ' ) ; /* 表头 */ fprintf( f , "%5s %7s%5s %7s%5s %7s%5s %7s%5s %7s\n" ,"a","SIN(a)","a","SIN(a)","a","SIN(a)" ,"a","SIN(a)","a","SIN(a)" ) ; for ( v=0; v<=71; v++ ) { /* 表体 */ for ( u=0; u<=4; u++ ) fprintf(f,“%5d 7.4f”,v*5+u,sin((v*5+u)*PAI/180)); fprintf(“\n”); fclose(f);

例11-6 设磁盘上有两个 text 文件, NAME.DAT上为一个人员名单; ADDRESS.DAT上是对应NAME.DAT文件上每个人的家庭地址。 编一个程序,在磁盘上生成一个姓名、地址、电话号码表文件NAMEADDR.TAB ,其中每个人的电话号码在终端上随机录入。

该程序总体上一个人一个人的处理。对每个人来讲: 1. 先从NAME.DAT上读入一个姓名;然后从 ADDRESS.DAT上读入相应家庭地址; 2. 然后在终端屏幕上显示正处理的人员姓名,要求操作员 键入其电话号码,并读入该电话号码; 3. 最后把姓名、地址、电话号码作为一行送入文件 NAMEADDR.TAB上。 开始 读 NAME => name0 ; ADDRESS => addr 初始化文件 显示 name0 读入电话号码 => tel NAME未结束 处理一个人的信息 name0、addr、tel写入文件NAMEADDR.TAB 结束

void main(){ FILE *name; /*名字源文件指针*/ FILE *address; /*地址源文件指针*/ FILE *nameaddr; /*目标文件指针 */ char name0[8],addr[30],tel[10]; if ((name=fopen("NAME.DAT","r"))==NULL){ printf("can not open source file 'NAME.DAT'\n"); exit(0); } if ((address=fopen("ADDRESS.DAT","r"))==NULL){ printf("can not open source file 'ADDRESS.DAT'\n");

if ((nameaddr=fopen("NAMEADDR.DAT","w"))==NULL){ printf("can not create destination file 'NAMEADDR'\n"); exit(0); } while(!feof(name)&&!feof(address)){/*控制全部处理*/ /* 控制读 */ fscanf(name,"%8s",&name0); /* 读入姓名=>name0 */ fscanf(address,"%32s",&addr); /* 读入地址=> addr */ printf("name %s please input tel:",name0); /*输出提示信息*/ scanf("%s",&tel); /* 终端输入电话号码 => tel */ /* 姓名、地址、电话号码写入文件NAMEADDR.DAT一行 */ fprintf(nameaddr,"%12s%32s%10s\n",name0,addr,tel); fclose(name); fclose(address); fclose(nameaddr);

本章小结 本章主要介绍了文件的概念及其操作。 重点掌握文件打开、关闭、读写等操作。