当前位置:首页 >> 计算机软件及应用 >>

清华C 语言程序设计:第16章


第16章 文件和流
清华大学

讲授内容
? ? ?

文件和流的概念 使用FILE结构操作文件 使用文件流操作文件

16.1 基本概念(1/4)
? ? ?

文件可以保存程序运行的结果 文件使程序操作大量数据成为可能 大型系统的运行需要文件支持

16.1 基本概念(2/4)
? ? ?

文件是一组相关联的数据的集合 C++将文件看成有序的字节流 文件被打开后,操作系统为该文件建立 的一个缓冲区,或称为一个字节序列, 即流
1 2 3 4 5 6 …… n-2 n-1

0

……

EOF

16.1 基本概念(3/4)
?

文件
?

?

普通文件 ? 二进制文件 ? 文本文件 输入输出设备:键盘、显示器、打印机等 ? 标准输入流(用指针stdin操作) ? 标准输出流(用指针stdout操作) ? 标准错误流(用指针stderr操作)

?

C++采用相同的方式操作普通文件和I/O设备

16.1 基本概念(4/4)
?

文件的操作
? ?

格式化输入输出(文本) 块输入输出(二进制)

16.2 用FILE结构操作文件(1/4)
?

打开一个已存在的文件或建立并打开一 个新文件
FILE *fopen( const char *filename, const char *mode ); filename——路径及文件名 mode——打开方式

16.2 用FILE结构操作文件(2/4)
打开方式 r w a r+ w+ a+ B 打开一个供读取数据的文件 建立或打开一个供写入数据的文件,如果该文件已经存在,则废 弃文件内容 建立或打开一个供写入数据的文件,如果文件已经存在,则写入 的数据将追加到文件的尾部 打开一个已存在的文件,该文件可以写入和读出数据 建立或打开一个可供读和写的文件,如果文件已存在则废弃文件 内容 建立或打开一个可供读和写的文件,如果文件已存在则写入的数 据追加到文件的尾部 打开一个二进制文件 描述

例子1:使用FILE指针新建一个文本文件, 写入了字符串"This is a test file. "
//文件ex16_1.cpp #include <stdio.h> main() { FILE *fptr; //定义FILE指针 //打开或创建文件 if ((fptr = fopen("test.txt","w")) != NULL) { //往文件中写入字符串 fprintf(fptr, "This is a test file."); fclose(fptr); //关闭文件 } else printf("Open file error.\n"); return 0; }

例子2:将字符、字符串、整数、浮点数、 结构等类型的数据写入文件(1/2)
//文件ex16_2.cpp ,写文件 #include <stdio.h> struct Test{ int a; double b; }; main() { Test st; st.a = 10; st.b = 1.1; FILE *fptr; //声明文件指针 //打开文件 if((fptr=fopen("writetest.dat","wb"))!=NULL) {

例子2:将字符、字符串、整数、浮点数、 结构等类型的数据写入文件(2/2)
//以二进制方式写入数据 fwrite(&st, sizeof(st),1,fptr); //以字符方式写入一个字符 fputc('a', fptr); //以字符方式写入一个字符串 fputs("Beijing", fptr); //以字符方式写入整数和浮点数 fprintf(fptr, " %d %f ", 23, 12.34); //关闭文件 fclose(fptr);

} else printf("Open file error.\n"); return 0; }

例子3:将例2创建的文件中的数据读出来 (1/2)
//文件ex16_4.cpp,读二进制文件 #include <stdio.h> struct Test{ int a; double b; }; main() { Test st; char s[20]; int m; float n; char c; FILE *fptr; if((fptr=fopen("writetest.dat","rb"))!=NULL) {

例子3:将例2创建的文件中的数据读出来 (2/2)
fread(&st,sizeof(st),1,fptr); c = fgetc(fptr); fgets(s,8,fptr); fscanf(fptr," %d %f ",&m,&n); fclose(fptr); printf("STRUCT st: a = %d, b = %f\n", st.a, st.b); printf("CHAR c = '%c'\n", c); printf("STRING s = %s\n", s); printf("INTEGER m = %d, FLOAT n = %f\n", m, n); } else printf("File open error.\n"); return 0;

}

16.2 用FILE结构操作文件(3/4)
?

文件位置指针
?

文件的每次读写操作都在文件位置指针处进 行
fptr 文件位置指针

0

1

2

3

4

5

6

……

n-2

n-1

……

EOF

16.2 用FILE结构操作文件(4/4)
?

文件位置指针可以修改
int fseek(FILE *, long, int); 第一个参数——文件指针 第二个参数——偏移量 第三个参数——基准,可以为SEEK_SET、 SEEK_CUR和SEEK_END,分别表示文件的 起始位置、当前位置和文件尾

例子4:将例2创建的文件中的数据读出来, 跳过字符'a'和字符串“Beijing” (1/2)
//文件ex16_5.cpp,读文件 #include <stdio.h> struct Test{ int a; double b; }; main() { Test st; int m; float n; FILE *fptr; if((fptr=fopen("wrtest.txt","rb"))!=NULL) { fread(&st,sizeof(st),1,fptr);

例子4:将例2创建的文件中的数据读出来, 跳过字符‘a’和字符串“Beijing” (2/2)
//修改文件位置指针,跳过字符a和字符串Beijing fseek(fptr,8,SEEK_CUR); fscanf(fptr," %d %f ",&m,&n); fclose(fptr); printf("STRUCT st: a = %d, b = %f\n", st.a, st.b); printf("INTEGER m = %d,\nFLOAT n = %f\n", m, n); } else printf("File open error.\n"); return 0; }

16.3 通过文件流进行操作(1/5)
?

几个特殊的流对象
? ?

?
?

标准输出流对象cout 标准输入流对象cin 非缓冲标准错误流对象cerr 缓冲标准错误流对象clog

16.3 通过文件流进行操作(2/5)
?

和文件流相关的几个类
? ?

?
?

类ifstream——文件的输入 类ofstream——文件的输出 类fstream——文件的输入输出 上述三个类都在头文件<fstream.h>中

16.3 通过文件流进行操作(3/5)
?

文件流类的继承关系
ios

istream

ostream

ifstream

iostream

ofstream

fstream

例子5:使用文件流新建或打开一个文件, 并写入字符串"This is a test file. "
//文件ex16_6.cpp,新建和打开文件 #include <fstream.h> main() { //声明文件流对象 ofstream outFile("outFile.txt",ios::out); if (!outFile) //使用错误流对象输出错误信息 cerr<<"Open file or create file error."<<endl; else //输出数据到与对象outFile 关联的文件中 outFile << "This is a test file."; return 0; }

16.3 通过文件流进行操作(4/5)
打开方式
ios::in ios::out

描述
打开一个供读取的文件 打开一个供写入的文件



打 开 文 件 的 方 式

?

fstream

ios::app
ios::ate

写入的所有数据将被追加到文件的末尾,此方式 需要使用ios::out
写入的数据将被追加到文件的末尾,但也可以写 到其它地方,此方式不需要使用ios::out

ios::trunc
ios::nocreate

废弃当前文件内容
如果要打开的文件并不存在,那么以此参数调用 open()函数将无法进行

ios::noreplace 如果要打开的文件已存在,试图用open()函数 打开时将返回一个错误。 ios::binary 以二进制的形式打开一个文件

16.3 通过文件流进行操作(5/5)
ofstream outFile("outFile.txt",ios::out);
可以改写为: ofstream outFile; outFile.open("outFile.txt",ios::out); 或 ofstream outFile; outFile.open("outFile.txt"); 文件可以显式关闭: outFile.close();

例子6:使用文件流的方式将整数、浮点数、 字符串等类型的数据写入文件
//文件ex16_7.cpp,写文件 #include <fstream.h> main() { ofstream outFile ("outFile.txt", ios::out); if (!outFile ) cerr<<"Open file or create file error."<<endl; else { outFile <<5<<"string"<<" "<<1.2; outFile .close(); } return 0; }

例子7:用文件流的方式读取上例中程序创 建的文件中的数据,跳过字符串“string”
//文件ex16_9.cpp,读文件 #include <fstream.h> main() { ifstream inFile ("outFile.txt", ios::in); int a; float c; if (!inFile) cerr<<"File open error."<<endl; else { inFile>>a; inFile.seekg(7,ios::cur); inFile>>c; cout<<"INT--"<<a<<endl<<"FLO--"<<c<<endl; inFile.close(); } return 0; }

例子8:使用文件保存和恢复类的对象(1/3)
//文件ex16_10.cpp, 以二进制方式读写对象 #include <fstream.h> class Test{ public: Test(int m, double n) { a = m; b = n; } void set(int m, double n) { a = m; b = n; } void show() { cout<<"int--"<<a<<"double--"<<b<<endl; } private: int a; double b; };

例子8:使用文件保存和恢复类的对象(2/3)
main() { Test st(10,10.5); cout<<"Object st:"<<endl; st.show(); ofstream outFile("outFile.txt",ios::out|ios::binary); if (!outFile ) cerr<<"Open file or create file error."<<endl; else { outFile.write((char *)&st,sizeof(st)); outFile.close(); } st.set(1,2.3); cout<<"After set, object st:"<<endl; st.show();

例子8:使用文件保存和恢复类的对象(3/3)
//创建文件流对象,再次打开该文件用于读 ifstream infile("outFile.txt", ios::in|ios::binary); if (!outFile ) cerr<<"File open error."<<endl; else { //从文件中恢复对象st infile.read((char *)&st,sizeof(st)); infile.close(); } cout<<" After read from file:"<<endl; st.show(); return 0; }

学习目的检测
? ?

? ?

掌握文件和流的基本概念 掌握使用FILE结构操作文本文件和二进 制文件的方法 了解文件流类的继承关系
掌握使用文件流操作文本文件和二进制 文件的方法

作业
16.1 16.3 16.5


赞助商链接
相关文章:
C++语言程序设计课后答案(郑莉第4版)
第二章 C++简单程序设计 2-1 C++语言有那些主要特点和优点? 解: C++语言的主要特点表现在两个方面,一是全面兼容 C,二是支持面向对象的方法。C++是一 个更好...
清华大学C语言程序设计考试试卷A
清华大学C语言程序设计考试试卷A 隐藏>> 清华大学考试试卷试卷编号: 2011 — 2012 学年 第___1___学期 考试性质:[正考]、[补考]、[其它] 考试方式:[开卷]...
清华大学出版社刘志海版《C程序设计与案例分析》习题参...
清华大学出版社刘志海版《C程序设计与案例分析》习题参考答案习题1 1.1 C 语言...=NULL); fclose(fp); } 习 题 10 10.1 编程题 (1)参照本章实例,编写...
c语言程序设计答案(常东超)清华大学出版社
c语言程序设计答案(常东超)清华大学出版社_理学_高等教育_教育专区。第一章 一...C 5.8 B 5.9 A 5.14 1024 5.15 -1 5.16 2500 5.17 11 5.18 ...
《C语言程序设计》教案(清华谭浩强)
C语言程序设计》教案(清华谭浩强)_理学_高等教育_教育专区。C语言完整教案 第一章C语言及程序设计概述本章要求: 了解 C 语言的特点、C 语言与其它高级语言相比...
C语言程序设计 清华大学出版社 马秀丽 刘志妩科后习题9...
C语言程序设计 清华大学出版社 马秀丽 刘志妩科后习题9答案_工学_高等教育_教育...[i]互换*/ 9.16 读程序分析并给出下面程序的运行结果: #include <stdio.h...
清华大学 c语言课本习题参考答案
清华大学 c语言课本习题参考答案_电脑基础知识_IT/...c语言课本第1到6章习题参考答案 第1 章习题 一、...C语言程序设计教程 李含... 41页 1下载券 ...
C语言程序设计教程 李含光 郑关胜 清华大学出版社习题答案
C语言程序设计教程 清华... 14页 1下载券 C语言程序设计教程 清华... 6页...第1 章习题参考答案 1.单项选择题 (1) (3) (5) A (2) D (4) B2....
C语言程序设计例题源程序(清华大学出版社黄保和编第三版)
C语言程序设计例题源程序(清华大学出版社黄保和编第三版)_工学_高等教育_教育专区。《C 语言程序设计》例题源程序 第一章 绪论 例 1.4.1 设圆柱体的半径为 r...
C语言程序设计 第三版 部分习题 (谭浩强 著) 清华大学...
C语言程序设计 第三版 部分习题 (谭浩强 著) 清华大学出版社 课后答案 C语言程序设计 第三版 部分习题 (谭浩强 著) 清华大学出版社 课后答案C语言程序设计 第...
更多相关标签: