第八﹑九章 I/O系統 檔案I/O的基本概念 格式化I/O 建立自訂的嵌入子 建立自訂的擷取子 自訂I/O與檔案.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

計算機程式語言實習課.
第 2 章 初探 C++.
课程概况 加入班级QQ群,便于及时沟通和资料共享。 课程教学的组成:
第11章 输入输出流类.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
流类库与输入/输出 输入/输出标准流类 文件流类 串流类 输入/输出成员函数 用户自定义类型的输入/输出.
File Access 井民全製作.
C++程序设计 王希 图书馆三楼办公室.
C++的檔案處理 綠園.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
Visual C++ introduction
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第11章 运算符重载 什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
第9章 C++的文件操作 “文件”,一般是指内存以外的存储介质上一批数据的集合。C++在语言层次上提供了文件操作的一系列函数用于完成文件的操作,打开、关闭文件,读取、写入文件数据等操作。 1。字符文件与二进制文件 字符文件:又称ASCII文件或文本TEXT文件,它是以一个字节存放一个ASCII码,代表一个字符。例如,32767需要使用5个字节表示,即:
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
第13章 输入输出流 王雪晶.
C++语言程序设计 第二章 C++简单程序设计.
第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例.
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C++语言程序设计 第十一章 流类库与输入/输出.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第一單元 建立java 程式.
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第 14 章 輸出與輸入.
第十三讲 文件流与 输出输入重载.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
第14章 输入输出与文件 输入输出是指程序与外部设备交换信息 C++把输入输出看成是一个数据流 输入流:外围设备流向内存的数据
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
程式結構&語法.
輸入&輸出 函數 P20~P21.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
撰寫MATLAB基礎財務程式 柯婷瑱.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
C++的檔案處理 綠園.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
C qsort.
C++程式設計入門 變數與運算子 作者:黃建庭.
第三章 程序的控制结构 第一节 概述 第二节 if选择结构 第三节 switch语句.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第十一章 IO流与文件系统 丘志杰 电子科技大学 计算机学院 软件学院.
挑戰C++程式語言 ──第7章 輸入與輸出.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第十三章 名稱空間(Namespace) 與 轉換函數與其他主題
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第2章 文件操作 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
變數與資料型態  綠園.
InputStreamReader Console Scanner
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第八﹑九章 I/O系統 檔案I/O的基本概念 格式化I/O 建立自訂的嵌入子 建立自訂的擷取子 自訂I/O與檔案

檔案I/O的基本概念 C++對I/O的支援是放在<iostream>中, 而Class ios包括有許多成員函數與變數可以用來控制和監督串流的運作. 要處理檔案I/O,心必須#include<fstream>,它包含了ifstream,ofstream and fstream,而這些class是衍生自istream,ostream而此兩個class是衍生自ios

檔案I/O的基本概念 在C++中,開啟一個File就是鏈結到一個stream;而stream有三種型態: ifstream in; // input ofstream out; // output fstream io; // input and output 一旦建立stream後,利用open()便可以將stream與file 鏈結在一起.

OPEN()函數 void ifstream::open(const char *filename,openmode mode=ios::in); void ofstream::open(const char *filename,openmode mode=ios::in | ios::trunc); void fstream::open(const char *filename,openmode mode=ios::in |ios::out);

Openmode ios::app //所有的輸出附加到檔案結尾 ios::ate //將檔案指標移到檔案結尾 ios::binary //以二進位模式開啟檔案 ios::in //開啟檔案作為輸入使用 ios::out //開啟檔案作為輸出使用 ios::trunc //會覆寫之前同名的檔案

使用Open函數開啟檔案 Ofstream mystream; Mystream.open(“test”); 判斷開啟與否 If(!mystream){cout<<“cannot open file\n”;} 或可利用is_open()判斷開啟與否 Bool is_open();如果開啟file則傳回true;否則則傳回false; If(!mystream.is_open()){{cout<<“cannot open file\n”;}

Stream的建構函數 儘管可以使用open()開檔,但更方便的方法則是使用 ifstream mystream(“myfile”);//open file 因為在ifstream,ofstream,fstream中的建構函數會自動開啟檔案. 判斷是否到檔案結尾則是用bool eof(); 關閉檔案則是用close();

檔案內容的讀寫 當file己開啟時,不在使用cin與cout來讀寫檔案,而是改成“>>”與“<<”,就像是c中的fprintf()與fscan().

開關檔範例1 #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("c:\\test.dat"); if(!fout){ cout<<"cannot open file\n";return 1; } fout<<"Hello\n"; fout<<100<<' '<<hex<<100<<endl; fout.close(); ifstream fin("c:\\test.dat"); if(!fin){ cout<<"cannot open file\n";return 1; } char str[80]; int i; fin>>str>>i; cout<<str<<' '<<i<<endl; fin.close(); return 0;}

課後練習 寫一程式來計算檔案中的字元個數.

格式化的I/O 在每個stream中都有一格式化flag的集合,可以用來控制資料的格式;在class ios中就宣告了一列舉型別fmtflags它定義了 skipws //忽略空白字元 left //輸出向左靠攏 oct //八進位輸出表示 hex //十六進位輸出表示 uppercase //字元輸出變大寫

格式化的I/O showpos //顯示正數前加‘+’符號 showpoint //在float時顯示小數點和其 後的零 scientific //以科學符號顯示 fixed //以一般方式顯示 要設定一格式旗標使用ios的成員函數 setf() // fmtflags setf(fmtflags flags) ex: stream.setf(ios::showpos);

格式化的I/O 而unseft()函數可用來清除flag設定值 void unseft(fmtflags flags); 要了解目前flag的設定則使用flag()函數 fmtflags flag(); fmtflags flag(fmtflags f);

設定多種旗標格式範例 #include<iostream> using namespace std; int main(){ // show using default setting cout<<123.23<<"hello“ <<100<<'\n'; cout<<10<<' '<<-10<<'\n'; cout<<100.0<<"\n\n"; //now, change formats cout.unsetf(ios::dec); cout.setf(ios::hex|ios::scientific); cout<<123.23 <<"hello" <<100<<'\n'; cout.setf(ios::showpos); cout<<10<<' '<<-10<<'\n'; cout.setf(ios::showpoint|ios::fixed); cout<<100.0<<"\n\n"; return 0; }

改變大小寫範例 #include<iostream> using namespace std; int main(){ cout.unsetf(ios::dec); cout.setf(ios::uppercase|ios::showbase|ios::hex); cout<<88<<"\n\n"; cout.unsetf(ios::uppercase); return 0; }

練習 寫一程式來設定cout flag.在show float 時可以show出小數點;另外以科學技號再加上大寫E來show出所有的float.

建立自訂的嵌入子 在C++中,輸出的動作被叫作嵌入,而“<<”則被稱為嵌入運算子(insertion operator) ostream& operator<<(ostream& out, class-name ob) { // body or inserter return stream;}

建立自訂的嵌入子 第一個參數是對ostream的參考型態,這代表stream必須要是一個output stream 第二個參數則代表要輸出的物件(也可以是一參考參數) 嵌入函數傳回stream的參考,這是為了讓“<<”能在一連串的I/O運算中使用 Ex:cout<<ob1<<ob2<<ob3;

建立自訂的嵌入子 由於嵌入子左運算元是一stream;而右運算元是要輸出的物件,如果將嵌入子函數放進class變成成員函數,它的左運算元會自動由this指標被設為產生這個呼叫的物件.因此嵌入子不能放入class中. 為了讓嵌入子函數可存取class中的成員則嵌入子要變為該class中的friend.

嵌入子範例-成為friend #include<iostream> using namespace std; class coord{ int x,y; public: coord(){x=0;y=0;} coord(int a,int b){x=a;y=b;} friend ostream &operator<<(ostream &stream,const coord& ob); };

嵌入子範例-成為friend ostream &operator<<(ostream &stream, const coord& ob) {stream<<ob.x<<" , "<<ob.y<<'\n'; return stream;} int main() { coord a(1,1),b(2,3); cout<< a<< b; return 0;}

嵌入子範例-不成為friend #include<iostream> using namespace std; class coord{ public: int x,y; coord(){x=0;y=0;} coord(int a,int b){x=a;y=b;} // friend ostream &operator<<(ostream &stream, const coord ob); };

嵌入子範例-不成為friend ostream &operator<<(ostream &stream,const coord ob) { stream<<ob.x<<" , "<<ob.y<<'\n'; return stream;} int main() { coord a(1,1),b(2,3); cout<<a<<b; return 0; }

建立自訂的擷取子 在C++中,輸入的動作被叫作擷取運算子(extraction operator), istream& operator>>(istream& stream, class-name ob) { // body or inserter return stream;}

擷取子範例 #include<iostream.h> //using namespace std; class coord{ int x,y; public: coord(){x=0;y=0;} coord(int a,int b){x=a;y=b;} friend istream &operator>>(istream &stream,coord& ob); friend ostream &operator<<(ostream &stream,coord& ob); };

擷取子範例 istream &operator>>(istream &stream, coord& ob) { cout<<"Enter coordinates\n"; stream>>ob.x>>ob.y; return stream; } ostream &operator<<(ostream &stream, coord& ob) stream<<ob.x<<" , "<<ob.y<<'\n';

擷取子範例 int main() { coord a(1,1),b(2,3); cout<<a<<b; cin>>a; cout<<a; return 0; }

自訂I/O與檔案 結合開檔與“>>”和“<<”兩個運算子 #include<iostream> #include<fstream> using namespace std; class coord{ int x,y; public: coord(){x=0;y=0;} coord(int a,int b){x=a;y=b;} friend ostream &operator<<(ostream &stream, coord &ob); friend istream &operator>>(istream &stream,coord &ob); };

自訂I/O與檔案 ostream &operator<<(ostream &stream,coord& ob) { stream<<ob.x <<'\n'; stream<<ob.y<<'\n'; return stream;} istream &operator>>(istream &stream,coord &ob) { stream>>ob.x>>ob.y; int main() {

自訂I/O與檔案 coord a(1,1),b(2,3); ofstream out("c:\\test.dat"); if(!out){cout<<"cannot open output file\n"; return 1; } out<<a<<b; out.close(); ifstream in("c:\\test.dat"); if(!in){cout<<"cannot open input file\n"; return 1;}

自訂I/O與檔案 coord c(0,0),d(0,0); in>>c>>d; cout<<c<<d; in.close(); return 0; }

練習 請撰寫一class,它可以儲存一整數值和它最小的因數(factor),請加入嵌入子與擷取子.