文件的随机读写
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
公共计算机基础教研部
10.1.5 文件指针
文件指针
• FILE *fp ;
– 是FILE型指针变量
– 标识一个特定的磁盘文件
– 与文件相关联的每个流都有一个FILE类型 的控制结构,定义有关文件操作的信息,用 户绝对不应修改
公共计算机基础教研部
文件指针(File Pointer)
• typedef struct { short level; /*缓冲区‘满’或‘空’的程度 */ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer;/*数据缓冲区的位置*/ unsigned char *curp; /*指针当前的指向*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ }FILE; • 在stdio.h文件中定义 公共计算机基础教研部
对应二进制文件
应用举例
FILE *fp; <练> 若要打开 E盘上user子目录下名为abc.txt的文本文件进 行读、写操作,下面符合此要求的函数调用是 fp=fopen(“e:\\sun.txt”, “w”); ( ) 。 A. fopen(“E:\user\abc.txt","r") B. fopen(“E:\\user\\abc.txt","r+") FILE *fp; C. fopen(“E:\user\abc.txt","rb") fp=fopen( “temp.c”, “r”); D. fopen(“E: \\user\\abc.txt","w") FILE *fp; fp=fopen(“d:\\tc\\temp\\a.dat”, “rb”); FILE *fp; fp=fopen(“play.cpp”, “a”);
<例>读程序,写结果。 #include <stdio.h> main() { FILE *fp; int i=5; float x=3.14; fp=fopen(“e:\\exam.txt”, “w”); fprintf(fp, “i=%d, x=%f”, i,x); fclose(fp); }
公共计算机基础教研部
mode:
对应文本文件 “r” 只读 “w” 只写 “a” 追加 “r+”读写 “w+”读写 “a+”读写
“rb” “wb” “ab” “rb+” “wb+” “ab+”
必须是已存在的文件。 不论该文件是否存在,都新建一个文件。 向文本文件尾增加数据,该文件必须存在 打开一个已存在的文件,用于读写。 建立一个新文件,可读可写。 向文件尾追加数据,也可读。
fscanf函数
格式: fscanf(fp,format,&arg1,&arg2,…&argn);
按指定format格式从fp所指的文件中读取数据依次送入 arg1,arg2…argn的内存单元; fp: 为指向fopen函数打开的文件的指针 format :为格式字符串 arg1,arg2,…argn(&arg1,&arg2,…&argn) 输出/输入项表列 公共计算机基础教研部
公共计算机基础教研部
#include “stdio.h” 例:从文件 main() tt.txt中顺序读取字符并显示出来。 { char c; FILE *fp; fp=fopen(“tt.txt”, “r”); c=fgetc(fp); while(c!=EOF) { putchar(c); c=fgetc(fp); } fclose(fp); }
<练>. 下面的程序执行后,文件test.t中的内容是( )。 #include <stdio.h> void fun(char *fname.,char *st) { FILE *myf; int i; myf=fopen(fname,"w" ); for(i=0;i<strlen(st); i++) fputc(st[i],myf); fclose(myf); } main() { fun("test.t","new world"); fun("test.t","hello,"); } A. hello, B. new worldhello, C. new world D. hello, rld
10.2 文件的打开与关闭
10.2.2 文件的关闭
函数调用: fclose(文件指针); 函数功能: 使文件指针变量不指向该文件,也就是文件指针变 量与文件“脱钩”,此后不能再通过该指针对原来与 其相联系的文件进行读写操作 返回值: 关闭成功返回值为0;否则返回EOF(-1)
公共计算机基础教研部
EOF:在stdio.h中定义的符号常量(宏名),表示文件结束 10.3 文件的顺序读写 #define EOF (-1) 10.3.1 向文件读写一个字符
10.1.6 文件的位置指针
位置指针用来指示当前的读写位置。 一般情况下,在对字符文件进行顺序读写时,文 件的位置指针指向文件开头,这时如果对文件进 行读的操作,就读第一个字符,然后文件的位置 指针顺序向后移一个位置,在下一次执行读的操 作时,就将指针指向的第二个字符读入。依此类 推,直到遇文件尾.
公共计算机基础教研部
文件的格式
• 二进制文件 – 是一种字节序列,没有字符变换 – 按照数据在内存中的存储形式存储到文件 – 如整数127,在内存占2个字节,为 0000000001111111,则文件中也存储为 0000000001111111,占2个字节 • 文本文件/ASCII码文件 – 是一种字符序列 – 文件中存储每个字符的ASCII码 – 如整数127在文件中占3个字节,分别存放这3个字 符的ASCII码,即49,50,55
公共计算机基础教研部
例如: fp=fopen(“d:\\sqs\\a1.txt”,”r”); fopen函数返回指向文件a1.txt的指针并赋给fp,即 fp指向文件a1.txt. 若不能实现打开任务,fopen函数将带回一个空指针值 NULL(值为0)。 常用打开文件的方法为: if((fp=fopen(“a1.txt”,”r”))==NULL) { printf(“cannot open this file\n”); exit(0); }
– 在程序运行时由程序在磁盘上建立一个文件,并通 过写操作将数据存入该文件;或由程序打开磁盘上 的某个已有文件,并通过读操作将文件中的数据读 入内存供程序使用
公共计算机基础教研部
ቤተ መጻሕፍቲ ባይዱ
文件的存放
• 可以建立若干目录(文件 夹),在目录里保存文件, 同一级目录里保存的文件不 能同名。 • 对使用者而言,只要知道文 件的路径(全目录)和文件 名,就能使用该文件 – D:\home\Sunner\main.c – 这都是托OS的福
{
putchar(ch); ch=fgetc(fp);
} putchar(‘\n’); fclose(fp); }
公共计算机基础教研部
10.3 文件的顺序读写
10.3.3 向文件进行格式化读写 fprintf函数
格式:fprintf(fp,format,arg1,arg2,…,argn);
将输出项arg1,arg2…argn按指定format格式写入fp所指的 文件中,即输出到磁盘文件;
公共计算机基础教研部
文件的格式
• 数据必须按照存入的类型读出,才能恢复其本来 面貌 • 公开的标准格式
– 如bmp、tif、gif、jpg和mp3等类型的文件 ,有大量 软件能生成和使用这些类型的文件
• 也有不公开、甚至加密的文件格式
– 如Microsoft Word的doc格式就不公开,所以至今还 没有Word以外的其它软件能完美地读出doc文件
fgetc和
fputc函数
fputc (ch,fp); —把字符ch写到fp所指向的文件中去。 —如果写入错误返回EOF,否则则返回ch。
ch=fgetc (fp);
—从fp所指向的文件读出一个字符,返回给ch, 若读到文件末尾返回EOF。 注:每次读/写,文件指针自动向前移动1个字节(即指向 下一个读/写位置)。
公共计算机基础教研部
<例>读程序,写结果。 假定,e盘下有一文件exam.txt, 内容为: #include <stdio.h> 2 3.5 main() { FILE *fp; int i; float x; 若换成此语句, 程序结果会怎样? fp=fopen(“e:\\exam.txt”, “r”); fscanf(fp, “%d%f”, &i, &x); printf(“i=%d, x=%f”, i, x); fclose(fp); fscanf(fp, “%d, %f”, &i, &x); }
公共计算机基础教研部
本章要点
文件的基本概念 文件的基本函数
文件的顺序读写
文件的随机读写 文件的简单应用
公共计算机基础教研部
10.1 C 文件的有关概念
• 字符界面的操作系统一般都提供标准输入与输出设备 – DOS、Linux、Unix…… • 一般情况,标准输入就是键盘,标准输出就是终端显示 器 – 操作系统有能力重定向标准输入与输出,比如让文件 作为标准输入,打印机作为标准输出 – 这种重定向程序本身是感觉不到的
公共计算机基础教研部
<练>. 08年4月国二考题 以下程序从名为filea.dat的文本文件中逐个读入字符并显 示在屏幕上。请填空: #include<stdio.h> main() { FILE *fp; char ch; fp=fopen(【 】); ch=fgetc(fp); whlie(!feof(fp))
公共计算机基础教研部
<例>二进制文件拷贝 #include <stdio.h> main() { FILE *in, *out; char ch; in = fopen(“e:\\sun\\abc.txt”, "rb"); out = fopen(“e:\\sun\\abc.bak”, "wb");
公共计算机基础教研部
#include “stdio.h” main() 例:将键盘输入的字符顺序存入磁盘文件 tt.txt中, { 输入ctrl+z 结束 char c; FILE *fp; fp=fopen(“tt.txt”, “w”)); c=getchar(); while(c!=EOF) { 程序文件名为f1.c,程序运行结果 fputc(c,fp); 是生成文件tt.txt; c=getchar(); } fclose(fp); }
↑ 文件头 ↑ 读写当前位置 ↑ 文件尾
公共计算机基础教研部
10.1.6 文件的位置指针
有时希望在一个文件的原有数据之后再添加 新的数据,应该把文件位置指针移到文件尾, 然后再接着写入新的数据,这就是文件的追 加。
↑ 文件头
↑ 读写当前位置
↑ 文件尾
公共计算机基础教研部
10.2 文件的打开与关闭
判断二进制文件是否结束 while(!feof(fp)) { c=fgetc(fp); …….. }
while (!feof(in)) { ch=fgetc(in); fputc(ch,out); } fclose(in); fputc(fgetc(in), out); fclose(out);
}
公共计算机基础教研部
10.2.1 文件的打开
下面介绍的函数均定义在<stdio.h>中 • FILE *fopen(const char *filename, char *mode); 如:FILE *fp=fopen("C:\\CONFIG.SYS", "rw");
– filename是文件名,包含路径。如果不含路径,表 示打开当前目录下的文件 – mode是打开方式,常用为"r"、"w"、"a",分别表 示只读、只写、和添加 – 返回值为指向此文件的指针,留待以后使用。如果打 开失败,返回值为NULL
自来水厂
公共计算机基础教研部
• 计算机的内存容易健忘,所以数据必须保存在硬盘、 软盘、光盘和磁带等“不健忘”的外存上
• 这些能大量、永久保存信息的媒介,一般都以文件的 形式给用户及应用程序使用。操作系统是以文件为单 位对数据进行管理的. • 文件 – 一般指存储在外部介质上具有名字(文件名)的一 组相关数据的集合 – 用文件可长期保存数据,并实现数据共享 • 程序中的文件