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

清华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语言程序设计》(清华大学出版社)书后习题参考答案
C语言程序设计》(清华大学出版社)书后习题参考答案_工学_高等教育_教育专区。C语言,程序设计教程,本资料是我们老师亲自做出后给我们进行学习的资料,在此给大家...
清华大学出版社刘志海版《C程序设计与案例分析》习题参...
清华大学出版社刘志海版《C程序设计与案例分析》习题参考答案习题1 1.1 C 语言...=NULL); fclose(fp); } 习 题 10 10.1 编程题 (1)参照本章实例,编写...
C语言程序设计教学大纲(清华)
C语言程序设计教学大纲(清华)_理学_高等教育_教育专区。C 语言程序设计课程教学...本章的实践性教学环节要求:综合实验 1-8 第二章本章教学目的和要求: 要求...
《C语言程序设计》教案(清华谭浩强)
C语言程序设计》教案(清华谭浩强)_理学_高等教育_教育专区。C语言完整教案 第一章C语言及程序设计概述本章要求: 了解 C 语言的特点、C 语言与其它高级语言相比...
C语言程序设计教程 李含光 郑关胜 清华大学出版社习题...
14页 1下载券 C语言程序设计教程 清华... 6页 1下载券喜欢此文档的还喜欢 ...() 第 2 章习题参考答案 1.单项选择题 (1) C (3) C (5) C(6) D ...
清华大学C语言程序设计考试试卷A
清华大学C语言程序设计考试试卷A 隐藏>> 清华大学考试试卷试卷编号: 2011 — 2012 学年 第___1___学期 考试性质:[正考]、[补考]、[其它] 考试方式:[开卷]...
清华大学C语言程序设计考试复习提纲
清华大学C语言程序设计考试复习提纲_工学_高等教育_教育专区。清华大学C语言程序设计考试复习提纲清华大学 C 语言程序设计考试复习提纲 考试形式:上机考试 考试题型:选...
C语言程序设计教程_李含光_郑关胜_清华大学出版社习题...
C语言程序设计教程_李含光_郑关胜_清华大学出版社习题答案_工学_高等教育_教育...(16)double 第 1 章习题参考答案 1.单项选择题 (1) (3) (5) A (2) ...
C语言程序设计基础教程 课后习题答案 (清华大学出版社 ...
C语言程序设计基础教程 课后习题答案 (清华大学出版社 于延编) 自己做的 欢迎校正_工学_高等教育_教育专区。第一章 计算机程序设计导论一、简答题 1.请简述计算...
C语言程序设计 清华大学出版社 马秀丽 刘志妩科后习题9...
C语言程序设计 清华大学出版社 马秀丽 刘志妩科后习题9答案_工学_高等教育_教育...[i]互换*/ 9.16 读程序分析并给出下面程序的运行结果: #include <stdio.h...
更多相关标签: