第十一章 文件 11.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:

Slides:



Advertisements
Similar presentations
Chap 12 文件 12.1 学生成绩文件统计 12.2 用户信息加密和校验 12.3 文件综合应用:资金账户管理.
Advertisements

Chap 12 文件 12.1 将短句“Hello World”写入到文件 12.2 读取学生成绩文件 12.3 文件复制
第九讲 结构体与文件 陆 铭
C 语言程序设计 文件 周闻钧 朱宏明.
第 5 章 文件I/O操作.
C程序设计 第10章 文 件 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
第十三章 文件.
第12章 文 件 §12.1 概述 1.文件信息的集合,如一段程序、一段数据、一副图等
複習 struct score_Type{ int chinese,english; }; struct my_Type{
C File System.
第8章 文件 P 了解文件的处理过程 8.2 掌握文件的基本操作本领 8.3 文件的应用举例 *贯穿教学全过程的实例.
计算概论 第二十一讲 文件操作 北京大学信息学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第十一章 文件操作 文件的概念 文件的读写 主讲:李祥 时间:2015年10月.
第10章 文件操作.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
第10章 文件.
第10章 文件操作.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
11.1 文件的基本概念 11.2 文件的打开与关闭 11.3 文件的顺序读写 11.4 文件的随机读写 11.5 文件检测
函数申明、定义、调用 申明: void sort(float a[], int n); void sort(float *a, int m); void sort(float *a, int); void sort(float *, int);
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
程式設計 博碩文化出版發行.
第九章 文件 程序数据标准输入输出设备 程序数据文件 数据流和文件 文件的打开和关闭 文件读写函数.
File(檔案處理) 學習目標:開檔、讀檔、更新檔與關閉檔案.
THE C PROGRAMMING LANGUAGE
第10章 文件操作.
第十章 文件操作.
C语言大学实用教程 第10章 文件操作 西南财经大学经济信息工程学院 刘家芬
第10章 对文件的输入输出 10.1 C文件的有关基本知识 10.2 打开与关闭文件 10.3 顺序读写数据文件 10.4 随机读写数据文件
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
ACM程序员大赛讲座 _____C语言程序设计要点 讲授人:王敬华.
Linux 文件操作——系统调用和标准 IO 库
第十三章 文件 目录 学生信息管理系统的完善 文件的概念 文件类型指针 文件的打开与关闭 文件的顺序读写
第9章 文件 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第5章 文件.
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
研讨课4 文件操作.
目录 11.1 文件的种类 11.2 文件指针和文件内部的位置指针 11.3 文件的操作 11.4 文件的打开与关闭
第十三章 文件.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
第9章 文件 学习目的与要求: 熟练掌握文件指针的使用 掌握与文件相关的函数 能够利用文件相关函数实现各种操作.
C语言程序设计.
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
C程序设计.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
姚金宇 MIT SCHEME 使用说明 姚金宇
實習十 開讀檔練習.
C標準輸出入函數庫 與 作業系統.
輸出與輸入(I/O).
第二章 类型、对象、运算符和表达式.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
函数申明、定义、调用 申明: void sort(float a[], int n); void sort(float *a, int m); void sort(float *a, int); void sort(float *, int);
第十一章 文件 11.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第13章 文 件.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
結構、檔案處理(Structure, File)
第13章 文 件 六、字符和字符串读写函数 七、无格式转换的读写函数fread和fwrite 八、文件的定位 九、一个简单的读写存盘程序步骤.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab2.
C语言程序设计 第13章 文件操作.
Presentation transcript:

第十一章 文件 11.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质: 第十一章 文件 11.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放 使用数据文件的目的 1、数据文件的改动不引起程序的改动——程序与数据分离 2、不同程序可以访问同一数据文件中的数据——数据共享 3、能长期保存程序运行的中间数据或结果数据

文本文件特点: 存储量大、速度慢、便于对字符操作 二进制文件特点: 存储量小、速度快、便于存放中间结果 如 int型数10000 0010011100010000 内存存储形式 二进制形式 0011000100110000001100000011000000110000 ASCII形式 二进制文件特点: 存储量小、速度快、便于存放中间结果

文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区 缓冲区 指令区 程序 用户数据区 磁盘 非缓冲文件系统: 磁盘文件 输出文件缓冲区 输入文件缓冲区 程序数据区 a 缓冲文件系统:

11.2 文件类型指针 文件结构体FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中 typedef struct { int _fd; //文件号 int _cleft; //缓冲区中剩下的字符数 int _mode; //文件操作方式 char *_next; //文件当前读写位置 char *_buff; //文件缓冲区位置 }FILE;

文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放 文件名 文件使用 方式 文件类型指针 C程序 操作系统 磁盘

11.3 文件的打开与关闭 C文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件-->文件读/写-->关闭文件 11.3 文件的打开与关闭 C文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件-->文件读/写-->关闭文件 系统自动打开和关闭三个标准文件: 标准输入------键盘 stdin 标准输出------显示器 stdout 标准出错输出-----显示器 stderr 打开文件fopen 函数原型: FILE *fopen(char *name,char *mode) “r+/rb+” (读写) “a/ab” (追加) “w/wb” (只写) “r/rb” (只读) “w+/wb+” (读写) “a+/ab+” (读写) 为输入打开一个文本/二进制文件 为输出打开或建立一个文本/二进制文件 为读/写打开一个文本/二进制文件 为读/写建立一个文本/二进制文件 为读/写打开或建立一个文本/二进制文件 向文本/二进制文件尾追加数据 文件使用方式 含义 例 文件打开与测试 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp==NULL) { printf(“File open error!\n”); exit(0); } 例 FILE *fp; char *filename=“c:\\fengyi\\bkc\\test.dat” fp= fopen(filename,”r”); 例 FILE *fp; fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); 使用文件方式 功能:按指定方式打开文件 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL 要打开的文件名

文件关闭fclose fclose 作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针 函数原型:int fclose(FILE *fp) 功能:关闭fp指向的文件 返值:正常关闭为0;出错时,非0 文件打开时返回的文件类型指针 磁盘文件 输出文件缓冲区 输入文件缓冲区 程序数据区 a 缓冲文件系统: 不关闭文件可能会丢失数据 因为fclose先把缓冲区数据输出 到磁盘文件,然后才释放文件指针 fclose

返值:正常,返回读到的代码值;读到文件尾或出错,为EOF 11.4 文件的读写 字符I/O:fputc与fgetc fputc 函数原型:int fputc(int c, FILE *fp) 功能:把一字节代码c写入fp指向的文件中 返值:正常,返回c;出错,为EOF fgetc 函数原型:int fgetc(FILE *fp) 功能:从fp指向的文件中读取一字节代码 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF 文件I/O与终端I/O #define putc(ch,fp) fputc(ch,fp) #define getc(fp) fgetc(fp) #define putchar( c ) fputc(c,stdout) #define getchar( ) fgetc(stdin)

#include <stdio.h> 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"); while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); 例 从键盘输入字符,逐个 存到磁盘文件中,直到 输入‘#“为止 #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); fclose(fp); 判断二进制文件是否结束 while(!feof(fp)) { c=fgetc(fp); …….. } #include <stdio.h> 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); 例 读文本文件内容, 并显示 例 文件拷贝 feof 函数原型: int feof(FILE *fp) 功能:判断文件是否结束 返值:文件结束,返回真(非0);文件未结束,返回0 1.若文件在当前目录下: fp=fopen("aa.txt","r"); 2.若文件不在当前目录下: fp=fopen("d:\\fengyi\\bkc\\aa.txt","r"); 2.若从键盘输入带路径文件名: char infile[30]; scanf("%s",infile); fp=fopen(infile,"r"); 必须输入:d:\fengyi\bkc\aa.txt 判断文本文件是否结束

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

例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp); for(i=0;i<2;i++) fread(&f[i],4,1,fp); 例 struct student { int num; char name[20]; char sex; int age; float score[3]; }stud[10]; for(i=0;i<10;i++) fread(&stud[i],sizeof(struct student),1,fp);

例 从键盘输入4个学生数据,把他们转存到磁盘文件中去 例 从键盘输入4个学生数据,把他们转存到磁盘文件中去 void save() { FILE *fp; int i; if((fp=fopen("d:\\fengyi\\exe\\stu_dat","wb"))==NULL) { printf("cannot open file\n"); return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); #include <stdio.h> #define SIZE 2 struct 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 display() { FILE *fp; int i; if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL) { printf("cannot open file\n"); return; } for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student_type),1,fp); printf("%-10s %4d %4d %-15s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr); fclose(fp);

格式化I/O:fprintf与fscanf 函数原型: #include <stdio.h> 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);/*read from keaboard*/ fprintf(fp,"%s %d",s,a);/*write to file*/ fclose(fp); if((fp=fopen("test","r"))==NULL) { puts("can't open file"); exit(); } fscanf(fp,"%s%d",c,&b);/*read from file*/ fprintf(stdout,"%s %d",c,b);/*print to screen*/ } int fprintf(FILE *fp,const char *format[,argument,…]) int fscanf(FILE *fp,const char *format[,address,…]) 功能:按格式对文件进行I/O操作 返值:成功,返回I/O的个数;出错或文件尾,返回EOF 例 fprintf(fp,“%d,%6.2f”,i,t); //将i和t按%d,%6.2f格式输出到fp文件 fscanf(fp,“%d,%f”,&i,&t); //若文件中有3,4.5 ,则将3送入i, 4.5送入t 例 从键盘按格式输入数据存到磁盘文件中去 说明:输入时,要将ASCII码转换成二进制;输出时,要将二进制转换成ASCII码

fputs把s指向的字符串写入fp指向的文件 字符串I/O: fgets与fputs 函数原型: #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) while(fgets(string,81,fp)!=NULL) fputs(string,stdout); char *fgets(char *s,int n,FILE *fp) int fputs(char *s,FILE *fp) 功能:从fp指向的文件读/写一个字符串 返值: fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULL fputs正常时返回写入的最后一个字符;出错为EOF fputs把s指向的字符串写入fp指向的文件 fgets从fp所指文件读n-1个字符送入s指向的内存区, 并在最后加一个‘\0’ (若读入n-1个字符前遇换行符或文件尾(EOF)即结束) 例 从键盘读入字符串存入文件,再从文件读回显示 第一个参数可以是:字符串常量、char数组名、char指针

11.5 文件的定位 几个概念 rewind函数 文件位置指针-----指向当前读写位置的指针 读写方式 11.5 文件的定位 几个概念 文件位置指针-----指向当前读写位置的指针 读写方式 顺序读写:位置指针按字节位置顺序移动,叫~ 随机读写:位置指针按需要移动到任意位置,叫~ rewind函数 函数原型: void rewind(FILE *fp) 功能:重置文件位置指针到文件开头 返值:无 #include <stdio.h> main() { FILE *fp1,*fp2; fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r"); fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w"); while(!feof(fp1)) putchar(getc(fp1)); rewind(fp1); while(!feof(fp1)) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); } 例 对一个磁盘文件进行显示和复制两次操作

fseek函数 ftell函数 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]; #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("Length of File is %1d bytes\n",length); fclose(fp); } fseek函数 函数原型: int fseek(FILE *fp,long offset,int whence) 功能:改变文件位置指针的位置 返值:成功,返回0;失败,返回非0值 文件指针 起始点 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 ftell函数 函数原型: long ftell(FILE *fp) 功能:返回位置指针当前位置(用相对文件开头的位移量表示) 返值:成功,返回当前位置指针位置;失败,返回-1L, 位移量(以起始点为基点,移动的字节数) >0 向后移动 <0 向前移动 例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2); 例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示 例 求文件长度(ch12_101.c)

11.6 出错的检测 ferror函数 函数原型: int ferror(FILE *fp) 功能:测试文件是否出现错误 11.6 出错的检测 ferror函数 函数原型: int ferror(FILE *fp) 功能:测试文件是否出现错误 返值:未出错,0;出错,非0 说明 每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试 fopen打开文件时,ferror函数初值自动置为0

clearerr函数 函数原型: void clearerr(FILE *fp) #include <stdio.h> 功能:使文件错误标志置为0 返值:无 说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数 #include <stdio.h> int main(void) { FILE *stream; stream = fopen("DUMMY.FIL", "w"); getc(stream); if (ferror(stream)) { printf("Error reading from DUMMY.FIL\n"); clearerr(stream); } if(!ferror(stream)) printf("Error indicator cleared!"); fclose(stream); return 0; 例 ferror()与clearerr()举例