File Processing Chapter 17

Slides:



Advertisements
Similar presentations
第11章 输入输出流类.
Advertisements

流类库与输入/输出 输入/输出标准流类 文件流类 串流类 输入/输出成员函数 用户自定义类型的输入/输出.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
目标 运用File类进行文件操作 理解流,标准输入/输出流的概念
C++的檔案處理 綠園.
在PHP和MYSQL中实现完美的中文显示
Using C++ The Weird Way Something about c++11 & OOP tricks
第8章 文件 P 了解文件的处理过程 8.2 掌握文件的基本操作本领 8.3 文件的应用举例 *贯穿教学全过程的实例.
Hadoop I/O By ShiChaojie.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
走进编程 程序的顺序结构(二).
辅导课程六.
第9章 C++的文件操作 “文件”,一般是指内存以外的存储介质上一批数据的集合。C++在语言层次上提供了文件操作的一系列函数用于完成文件的操作,打开、关闭文件,读取、写入文件数据等操作。 1。字符文件与二进制文件 字符文件:又称ASCII文件或文本TEXT文件,它是以一个字节存放一个ASCII码,代表一个字符。例如,32767需要使用5个字节表示,即:
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
第二章 Java语言基础.
第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例.
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
C++语言程序设计 第十一章 流类库与输入/输出.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
第十三章 文件.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
第 14 章 輸出與輸入.
第十三讲 文件流与 输出输入重载.
第9章 文件 学习目的与要求: 熟练掌握文件指针的使用 掌握与文件相关的函数 能够利用文件相关函数实现各种操作.
第14章 输入输出与文件 输入输出是指程序与外部设备交换信息 C++把输入输出看成是一个数据流 输入流:外围设备流向内存的数据
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第8章 I/O流 8.1 C++流的概念 8.2 C++的输入输出 8.3 文件流与文件操作 8.4 重载插入运算符和提取运算符
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
Chapter 2 & Chapter 3.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
手机移动设备嵌入式C++ 第七章 C++的I/O流库.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
C++的檔案處理 綠園.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
Python 环境搭建 基于Anaconda和VSCode.
本节内容 结构体.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
第11章 文件处理技术 文件是存放在外部介质上的数据集合。很多程序需要读写磁盘文件,所以涉及到如何建立文件,如何从文件中读数据,如何向文件写数据等问题。本章将讨论与文件操作相关的内容。
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第2章 文件操作 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
變數與資料型態  綠園.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第十四讲 文件流与 输出输入重载.
C语言程序设计 第13章 文件操作.
Presentation transcript:

File Processing Chapter 17 http://www.cnblogs.com/kzloser/archive/2012/07/16/2593133.html

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

17.1 Introduction 临时存储:变量和数组 永久存储:文件 保存大量的数据 存储在二级存储设备中 Magnetic disks Optical disks Tapes

文件的基本概念: 本节中文件指的是磁盘文件。C++文件(file)分为两类:二进制文件和文本文件。 2018年11月29日8时56分 文件的基本概念: 本节中文件指的是磁盘文件。C++文件(file)分为两类:二进制文件和文本文件。 文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character) 二进制文件中存取的最小信息单位为字节(Byte),如.obj   C++把每一个文件都看成一个有序的字节流,每一个文件或者以文件结束符(EOF)结束,或者在特定的字节号处结束。 EOF在C++中的定义为:const int EOF = -1; 它这么定义是有道理的: 举个例子来说 int ch; //注意:这里定义了ch是int型的,而不是char型的 while((ch = cin.get()) != EOF) { cout << ch; } cin.get()是读取输入流中的一个字节,但是时常忽略的,也是必须注意的是:那些C++的设计者们将cin.get()设计成返回int型,而不是char型,这不是令人挺奇怪的吗?感觉char ch = cin.get()比较顺其自然吧?原因就是为了能够使cin.get()能够返回一个EOF。 因为对于一个字节的长度,已经定义了256个字符了,即扩展的ASCII码,已经不能再弄出一个字节表示EOF了,而且对于上面的程序,我们如果256个字符都得用,那么拿什么与这些字符比较去结束这个循环呢? 那些设计者门将cin.get()读取的char型提升为一个int型,那么肯定是正的,然后EOF定义为-1,在windows下的ctrl+z表示输入EOF,即输入ctrl+z的时候cin.get()才等于-1,其余的字符输入的时候cin.get()是一个正数。这是设计者门提供EOF的主要原因 1 2 4 3 6 5 7 8 … n-1 文件结束符 C++把文件看作有序的n个字节的流

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

17.2 The Data Hierarchy Bits (二进制位) Characters(字符) 0 or 1 计算机支持的最小数据项 计算机电路执行位处理 所有数据项最终由位组成 Characters(字符) 数字、字母和专门的符号称为“字符” 能够在特定计算机上用来编写程序和代表数据项的所有字符的集合称为“字符集” Char以字节形式存储 (8 bits) Wchar_t 占多个字节(用于非英文字符集的表示)

17.2 The Data Hierarchy (Cont.) Fields(字段或数据项) 由字符组成 代表一定的含义 Example 姓名,颜色等等 Records(记录) 由多个字段组成 C++中表现为:类 An employee’s record might include id#, name, address, etc. 记录的关键字:A record key is a field unique to each record

Fig. 17.1 | Data hierarchy.

17.2 The Data Hierarchy 文 件3 文 件2 文 件1 记录: 字段1(关键字) 字段2 字段3 …… … 数据库:一组相关的文件 数据库管理系统:为建立和管理数据库而设计的文件集合

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

2018年11月29日8时56分 17.3 Files and Streams 当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个文件定位指针(file position pointer)的控制。 输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。 输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。 画一个图

17.3 Files and Streams -- I/O流模板之间的继承关系 为了在C++中执行文件处理,必须包含头文件<iostream>和<fstream>

17.3 Files and Streams --文件处理 必须包含头文件: #include <fstream> <fstream> 包括三种类模板的定义 basic_ifstream (for file input) basic_ofstream (for file output) basic_fstream (for file input and output) 提供了处理字符流的模板特化 ifstream:从文件中读入字符(读文件) ofstream:向文件输出字符(写文件) fstream:支持文件中字符的输入和输出 生成这些流类模板特化的对象,即可打开文件 程序和文件之间通过流对象交互

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

17.4 Creating a Sequential File File structure 需要程序员对文件结构化 C++ :对文件作字节流处理 顺序文件 vs 随机存取文件 顺序文件:记录一般按照关键字顺序存放 随机存取文件:不需查找,直接读取

17.4 Creating a Sequential File 写数据到文件 创建ofstream对象 构造函数ofstream(const char* filename,int mode) filename:文件名由文件的主名和扩展名两部分组成。 mode: ios::out :缺省模式,覆盖文件中已有数据 ios::app:向文件末尾添加数据 例:ofstream outClientFile( "clients.dat", ios::out ); 建立了一个到文件的“通信通道” 如果该文件名不存在,则新建一个同名文件 对于已创建的文件对象,使用成员函数打开文件 与构造函数的参数相同,可以先创建再打开 例:ofstream outClientFile; outClientFile.open(“clients.dat”, ios::out);

Fig. 17.5 | File open modes.

out: (写入文件) 如文件不存在,则建立新文件,如文件存在,如果同时未设定app, in,则文件清空。 2018年11月29日8时56分 in :(从文件读取) 打开方式只要含in,如文件不存在则返回失败。在打开为输入输出方式时(同时用out),编程应注意判断是否失败,失败时千万不可再写入文件。 out: (写入文件) 如文件不存在,则建立新文件,如文件存在,如果同时未设定app, in,则文件清空。 trunc:(打开文件,并清空它)文件不存在则建立新文件,与out默认操作相同。但与in配合,文件不存在则返回失败。 app:(写入文件,添加在末尾)原文件内容保留,新数据接在尾部。 ate: (at end,打开文件,文件指针在文件尾) 文件指针可以移动,即新数据可写到任何位置。文件是否清空由其它标识决定。 trunc/app/ate最好配合out、in等一起用,因为不同的C++平台,要求不同,一起用不会出错。如不一起用,至少VC++不认这种格式。 binary标识以二进制方式打开文件。同时用out时,如文件不存在,则建立新文件,并且新文件能用,不必清状态字。 ?

文件打开方式: fstream iofile;//既输入又输出用 由在ios类中定义的公有枚举成员决定: enum open_mode{ in=0x01, out=0x02, ate=0x04, app=0x08, trunc=0x10, binary=0x80 }; fstream iofile;//既输入又输出用 iofile.open(“myfile.txt”,ios::in|ios::out);

17.4 Creating a Sequential File --流对象和磁盘文件关联 打开文件时应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值就是指它的地址。 //打开一个文件完整的程序 int main() { fstream iofile(”myfile.txt”,ios::in|ios::out); if(!iofile) { //“!”为重载的运算符 cout<<”不能打开文件:”<<”myfile,txt”<<endl; return -1; } //失败退回操作系统 }

17.4 Creating a Sequential File --文件的打开与关闭 1. 说明一个文件流对象,这又被称为内部文件: ifstream ifile;//只输入用 ofstream ofile;//只输出用 fstream iofile;//既输入又输出用 2. 使用文件流对象的成员函数打开一个磁盘文件。 iofile.open(“myfile.txt”,ios::in|ios::out); 3. 使用提取(>>)和插入(<<)运算符对文件进行读写操作,或使用成员函数(get\put)进行读写。 4. 关闭文件。三个文件流类各有一个关闭文件的成员函数 : void ifstream::close(); void ofstream::close(); void fstream::close(); 使用很方便,如:iofile.close(); 也可直接通过构造函数打开文件: fstream iofile(”myfile.txt”,ios::in|ios::out);

17.4 Creating a Sequential File --文件关闭 关闭文件时,系统把该文件相关联的文件缓冲区中的数据写到文件中,保证文件的完整,收回与该文件相关的内存空间,把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。 关闭文件并没有取消文件流对象,该文件流对象又可与其他磁盘文件建立联系。文件流对象在程序结束时,或它的生命期结束时,由析构函数撤消。它同时释放内部分配的预留缓冲区。 调用析构函数也会关闭相应正在打开的文件

(1 of 2) Fig17_04.cpp 创建ofstream对象,打开文件 Overloaded operator! will return true if the file did not open successfully

重载operator void * ,遇到文件结束符EOF时(Ctrl+Z) ,返回一个空指针。 2018年11月29日8时56分 重载operator void * ,遇到文件结束符EOF时(Ctrl+Z) ,返回一个空指针。 使用“<<”向文件中写入数据 ofstream 的析构函数被自动调用,隐式地关闭文件 Ctrl+Z 读入最后一个      分析:a在不能直接转换为bool型的情况下,会试图先进行 (void*)a 操作,这个操作会直接调用成员函数operator void*(),这个函数返回一个void*返回值,所以这里的if(a)实际上是if((void*)a),并根据强制转换函数的结果进行if判断,如果上述函数改为return (void*)this, 那么就可以看到代码输出 ac. 在in读完字符'j'的时候,其实已经到达文件的末尾了,但此时流in的状态还是good,也就是说还可以继续读入下一个字节。而当in继续往下读的时候,就会读到EOF了,当读完EOF并赋值给c后,流in的状态就变成了eofbit,不可再读,在条件判断语句中流in也就成了false了。 http://blog.csdn.net/jakiechen68/article/details/14643305

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

17.5 Reading Data from a Sequential File 创建 ifstream 对象 ifstream构造函数 A filename A file-open mode ios::in – 缺省模式,只能从文件读取数据,最小权限原则 例:ifstream inClientFile( "clients.dat", ios::in ); 对于已经存在的ifstream对象,使用成员函数打开文件 例: ifstream inClientFile; inClientFile.open("clients.dat", ios::in );

Fig17_07.cpp

Open clients.dat for input 重载 !:如果文件打开不成功,返回false 重载 operator void * ,returns,遇到文件结束符,返回一个空指针。 ifstream的析构函数隐式调用,关闭文件

Outline Fig17_07.cpp (3 of 3)

17.5 Reading Data from a Sequential File --顺序文件的读取示例 题目要求: 简单文件的写、读、查找

读写文件 ifstream fin("output.txt"); int number; char name2[20]; 2018年11月29日8时56分 ifstream fin("output.txt"); int number; char name2[20]; fin >> number; fin.ignore(); fin.getline(name2,'\n'); //fin>>number>>name2; cout<<number<<" "<<name2<<endl; strcpy(name2,"aaaa bbb"); cout<<"now name2="<<name2<<endl; fin.seekg(5); cout<<"new name2="<<name2<<endl; return 0; } #include <iostream> using std::cerr; using std::cout; using std::endl; using std::ios; #include <fstream> // file stream using std::ofstream; // output file stream using std::ifstream; #include <cstdlib> #include <cstring> int main(){ ofstream fout; fout.open("output.txt"); if (!fout) {cerr<<"File could not be opened"<<endl; exit(1); } int num = 150; char name[] = "John Doe"; fout << num << "\n"; fout << name << "\n"; fout.close(); 在Windows平台下如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"\r\n"转换成"\n";当写入文件的时候,系统会将"\n"转换成"\r\n"写入。如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。 fin.getline(name2,'\n');

17.5 Reading Data from a Sequential File --顺序文件的读取示例 题目要求: 实现文件的复制

int main() // 实现从源文件到目的文件的复制 { char ch; ifstream sfile("d:\\Ex\\in.cpp"); ofstream dfile(“e:\\out.cpp"); //只能创建文件,不能建立子目录,如路径不存在则失败 if(!sfile){ cout<<"不能打开源文件:"<<"d:\\Ex\\in.cpp"<<endl; return -1;} if(!dfile){ cout<<"不能打开目标文件:"<<"e:\\out.cpp"<<endl; sfile.unsetf(ios::skipws); //把跳过空格控制位置0,即不跳过空格,否则空格全部未复制 while(sfile>>ch) dfile<<ch; sfile.close(); //如没有这两个关闭函数,析构函数也可关闭 dfile.close(); return 0; }

将abc.txt复制到xyz.txt 2018年11月29日8时56分 #include<iostream.h> #include<fstream.h> int main() { ifstream ifile("abc.txt"); if (!ifile) { cout << "abc.txt文件不能打开"<<endl; return 0; } ofstream ofile("xyz.txt"); if(!ofile) { cout << "xyz.txt文件不能打开"<< endl; return 0; char ch; while(ifile.get(ch)) ofile.put(ch); ifile.close(); ofile.close(); return 1; Get函数每次会往后一位么?? 使用输入流成员函数get()从文本文件abc.txt中读取一个字符ch,然后使用输出流成员函数put()将字符ch写入文本文件xyz.txt中,继续这一过程直到get()读完为止。

17.5 Reading Data from a Sequential File --顺序文件的读取示例 题目要求: 顺序读取文件内容,按照要求显示数据 程序解读 P618 17.8

Topics 17.1 Introduction 17.2 The Data Hierarchy 17.3 Files and Streams 17.4 Creating a Sequential File 17.5 Reading Data from a Sequential File 17.6 Input/Output of Objects

17.6 Input/Output of Objects 规范化操作: 在面向对象的程序设计中,信息总是放在对象的数据成员里。这些信息最终需要保存到文件中。 读取文件中对象的信息时,必须重新创建对象,把数据读入对象,在运行过程中,对放在对象的数据成员里的信息利用和修改,运行结束时必须把这些信息重新保存到文件中,然后关闭文件 在面向对象的C++程序设计中,文件应该在构造函数中打开,并创建对象;而在析构函数中保存和关闭文件,并撤销对象。

Summary 文件流分为三种 文件处理步骤 文件输入流(ifstream), 文件输出流(ofstream),文件输入/输出流(fstream) 文件处理步骤 定义文件流对象 打开文件 void open(const unsigned char *filename, int mode, int access=filebuf::openprot); 关闭文件 调用成员函数close()

Summary 文件读写 顺序文件操作:这种操作方式只能从文件的开始处依次顺序读写文件内容,而不能任意读写文件内容。 随机文件操作 读:文件流类的get、getline、read成员函数以及抽取符“>>” 写: put、write函数以及插入符“<<” 随机文件操作 读,写:read, write

Homework! 实验必选题目(交实验报告): 实验任选题目(不交实验报告): 见实验报告 作业题目(Homework):

重定位文件定位定位指针 文件定位指针: istream、ostream都提供了修改文件定位指针的成员函数 文件中下一个被读取或写入的字节号 seekg(long pos, int mode)—istream seekp(long pos, int mode)—ostream Return