第14章 标准库和输入输出流 14.1 标准库概述 14.2 流 14.3 输入输出流 14.4 格式化I/O 14.5 文件处理

Slides:



Advertisements
Similar presentations
1 第二讲 C++ 编程基础. 2 主要内容 C++ 语言概述 C++ 编程基础 数据的简单输入输出 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境.
Advertisements

第 2 章 初探 C++.
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
第11章 输入输出流类.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
流类库与输入/输出 输入/输出标准流类 文件流类 串流类 输入/输出成员函数 用户自定义类型的输入/输出.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
C++程序设计 王希 图书馆三楼办公室.
目标 运用File类进行文件操作 理解流,标准输入/输出流的概念
C++的檔案處理 綠園.
Using C++ The Weird Way Something about c++11 & OOP tricks
C++程序设计 第二讲 清华大学软件学院.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
第七章 I/O流.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
前處理指令可以要求前處理器 (preprocessor) 在程式編譯之前,先進行加入其它檔案的內容、文字取代以及選擇性編譯等工作。
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
第9章 C++的文件操作 “文件”,一般是指内存以外的存储介质上一批数据的集合。C++在语言层次上提供了文件操作的一系列函数用于完成文件的操作,打开、关闭文件,读取、写入文件数据等操作。 1。字符文件与二进制文件 字符文件:又称ASCII文件或文本TEXT文件,它是以一个字节存放一个ASCII码,代表一个字符。例如,32767需要使用5个字节表示,即:
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
第13章 输入输出流 王雪晶.
C++语言程序设计 第二章 C++简单程序设计.
第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
3 數學運算 3.1 鍵盤輸入 輸入函數cin 多重輸入cin 輸出格式化 3-3
C++语言程序设计 第十一章 流类库与输入/输出.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第七章 操作符重载 胡昊 南京大学计算机系软件所.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
第 14 章 輸出與輸入.
第十三讲 文件流与 输出输入重载.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第14章 输入输出与文件 输入输出是指程序与外部设备交换信息 C++把输入输出看成是一个数据流 输入流:外围设备流向内存的数据
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
手机移动设备嵌入式C++ 第七章 C++的I/O流库.
Vision for 2007 相片: 南寧德天大瀑布- 靖西通靈大峽谷 – 明仕田園 文字: 阿虫 音樂: 幽蘭逢春 (笛子)
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第 11 章 输入/输出流 11.1 输入/输出流概述 11.2 标准输入/输出流 11.3 输入/输出格式控制 11.4 文件输入/输出
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
物件導向程式設計 CH2.
C++的檔案處理 綠園.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++程式設計入門 變數與運算子 作者:黃建庭.
第十一章 IO流与文件系统 丘志杰 电子科技大学 计算机学院 软件学院.
第2章 基本数据及其运算 本章学习的目标: 1、掌握基本数据的各种表示,基本数据常数的书写方法;
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第2章 文件操作 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
變數與資料型態  綠園.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第十四讲 文件流与 输出输入重载.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

国家级精品课程网站 (本书配套教学网站) http://programming.xjtu.edu.cn

第14章 标准库和输入输出流 14.1 标准库概述 14.2 流 14.3 输入输出流 14.4 格式化I/O 14.5 文件处理 14.6 对象的输入/输出

14.1 标准库概述 一、标准库概念 用C++语言编写的类和函数库 由编译器厂商提供,与平台、厂商和编译器版本无关

二、标准库构成 1、标准函数库 2、标准类库 从C语言中继承下来 标准C++的I/O流类、字符串类、数字类、异常处理和杂项类以及STL容器类

三、标准库的使用 1、包含相应的头文件 2、C++的头文件来源: 标准C语言库函数的头文件,带有.h后缀; 由标准C语言库函数头文件变成的标准C++的头文件,把原有标准C语言库函数头文件去掉.h后缀而加上c前缀。

14.2 流 1、在C++中,输入输出通过流来完成 2、流类 输出操作将一个对象的状态转换成字符序列,输出到某个地方。 输入操作从某个地方接收到一个字符序列,然后将其转换成一个对象的状态所要求的格式。 接收输出数据的地方叫做目标 输入数据来自的地方叫做源 输入和输出操作看成字符序列在源、目标以及对象之间的流动。 2、流类 C++将与输入和输出有关的操作定义为一个类体系,放在一个系统库里,以备用户调用。这个执行输入和输出操作的类体系就叫做流类,提供这个流类实现的系统库就叫做流类库

输入/输出流类的继承层次结构 iostream流类库的层次结构

14.3 输入输出流 头文件iostream中含有4个对象: 格式化I/O :包含头文件iomanip cin:标准输入流 cout :标准输出流 cerr :非缓冲标准错误流 clog :经缓冲标准错误流 格式化I/O :包含头文件iomanip 文件处理操作 :包含头文件fstream

输入输出流的成员函数 屏幕输出(写操作) 1. 使用预定义的插入符(<<) 2. 使用成员函数put( )写一个字符。 1. 使用预定义的插入符(<<) 2. 使用成员函数put( )写一个字符。 3. 使用成员函数write( )写一个字符串。

键盘输入(读操作) 1. 使用预定义的提取符(>>)。 2. 使用成员函数get( )读一个字符。 1. 使用预定义的提取符(>>)。 2. 使用成员函数get( )读一个字符。 3. 使用成员函数getline( )读一行字符。 4. 使用成员函数read( )读若干个字符。

输入输出流的成员函数 get():可读取输入的空格; getline():读取一行信息到字符数组中; put():输出一个字符; ignore():跳过制定数量的字符; putback() peek() :返回输入流中的下一个字符,但不将其从输入流中删除; read()/write():无格式输入、输出; gcount():统计输入个数;

例14-1 比较cin和cin.get的输入 #include <iostream> using namespace std; int main() { const int SIZE = 80; char ch1,ch2,ch3,buffer1[SIZE],buffer2[SIZE]; cout << "Enter a sentence:\n"; cin >> buffer1; cout << "The string read with cin is:\n" << buffer1; ch1 = cin.get(); ch2 = cin.get();

cout << "\nThe result of cin cout << "\nThe result of cin.get() is:\n" << ch1 << ch2; cin.get(ch3); cout << "\nThe result of cin.get(ch3) is:\n" << ch3; cin.get(buffer2,SIZE); cout << "\nThe string read with cin.get(buffer2,SIZE) is:\n" << buffer2 << endl; return 0; }

14.4 格式化I/O 1. 使用状态标志和成员函数进行格式化输出 (1) 控制格式的标志位。 定义标志位的组合(静态变量): 1. 使用状态标志和成员函数进行格式化输出 (1) 控制格式的标志位。 定义标志位的组合(静态变量): basefield del|oct|hex adjustfield left|right|internal floatfield seientific|fixed

例:cout.flags(ios::scientific|ios::showpos); (2) 设置标志字的成员函数 long flags( ):返回流格式标志的当前设置; 例:cout.flags(ios::scientific|ios::showpos); long setf():设置流格式标志 例:cout.setf(ios::uppercase|ios::scientific); long unsetf(long):清除流格式标志

(3) 控制输出格式和成员函数 设置域宽:int width( ) 填充字符:int fill( ) 设置精度:int precision( )

例题 #include <iostream> using namespace std; int main() { cout.precision (4); cout.width(10); cout<<10.12345<<endl; cout.fill ('*'); cout.width (10); cout<<"Hi"<<endl; cout.setf(ios::left); return 0; }

二. 流操纵符 系统I/O流类库中所定义的操作符被放在iomanip.h文件中。 常量名 含 义 skipws 跳过输入中的空白 常量名 含 义 skipws 跳过输入中的空白 left 输出数据按输出域左边对齐输出 right 输出数据按输出域右边对齐输出 internal 在指定任何引导标志或基之后填充字符 dec 转换基数为十进制形式 oct 转换基数为八进制形式 hex 转换基数为十六进制形式 showbase 输出带有一个表示制式的字符 showpoint 浮点输出时必须带有一个小数点和尾部的0

常量名 含 义 uppercase 十六进制数值输出使用大写A~F,科学计数 显示使用大写字母E showpos 在正数前添加一个“+”号 fixed 使用定点形式表示浮点数 scientific 使用科学计数法表示浮点数 untibuf 每次插入之后, ostream∷osfx刷新该 流的缓冲区。默认缓冲单元为cerr setbase(base) 将基数设置为base

例14-2 设置整数流的基数 #include <iostream> #include <iomanip> using namespace std; int main() { int n; cout << "Enter a decimal number: "; cin >> n; cout << n << " in hexadecimal is: " << hex << n << '\n' << dec << n << " in octal is: " << oct << n << '\n' << setbase( 10 ) << n << " in decimal is: " << n << endl; return 0; }

例14-3 设置浮点数精度 #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { double root2 = sqrt( 2.0 ); int places; cout << setiosflags( ios::fixed) << "Precision set by the precision member function:" << endl;

for ( places = 0; places <= 4; places++ ) { cout.precision( places ); cout << root2 << '\n';} cout << "Precision set by the " << "setprecision manipulator:\n"; cout << setprecision( places ) << root2 << '\n'; return 0; }

14.5 文件处理 基本概念 打开和关闭文件 读 写 文件指针 缓冲区

一、文件和流

二. 打开和关闭文件 (1) 打开文件的两种方法 方法一: 或者 fstream 〈流对象名〉; 流对象名.open("文件名″,方式);

方法二: ① 打开写文件 或者 ofstream 〈流对象名〉; 〈流对象名〉.open(″〈文件名〉″);

〈流对象名〉.open(″〈文件名〉″); 或者 ② 打开读文件 ifstream〈流对象名〉; 〈流对象名〉.open(″〈文件名〉″); 或者 ifstream 〈流对象名〉.open(″〈文件名〉″);

(2) 关闭文件方法 流对象名.close( );

打开方式 说明 ios∷in 打开文件进行读操作,这种方式可避免删除现存文件的内容 ios∷out 打开文件进行写操作,这是默认模式 ios∷ate 打开一个已有输入或输出文件并查找到文件尾 ios∷app 打开文件以便在文件的尾部添加数据 ios∷nocreate 如果文件不存在,则打开操作失败 ios∷noreplace 如果设置了ios ∷ ate或ios∷app,则可打开已有文件,否则不能打开 ios∷binary 指定文件以二进制方式打开,默认为文本方式 ios∷trunc 如文件存在,将其长度截断为零并清除原有内容

创建一个名为“grade”的文本文件,并写入3门课程的名字和成绩。 三. 文件的读写 创建一个名为“grade”的文本文件,并写入3门课程的名字和成绩。 #include <iostream> #include <fstream> using namespace std;

int main() { ofstream out("grade"); if(!out) { cout << "Cannot open the grade file." << endl; return 1; } out << "C++" << " " <<89.5 << endl; out << "English" << " " << 93.5 << endl; out << "Maths" << " " << 87 << endl; out.close(); return 0;

例14-5 读文件 int main() { ifstream in("grade"); if(!in){ cout << "Cannot open grade file.\n"; return 1; }

char course[20]; float grade; in >> course >> grade; cout << course << " " << grade << "\n"; in >> course >> grade; in.close(); return 0; }

四. 二进制文件 下面以将内存中存放数组a的内容写入data.dat文件为例。a占20个字节,用len表示。 四. 二进制文件 下面以将内存中存放数组a的内容写入data.dat文件为例。a占20个字节,用len表示。 ① 使用ofstream构造函数中的模式参量指定二进制输出模式: ofstream wf(″data.dat″,ios∷binary); wf.write((char *)a, len);

wf.open(″data.dat″,ios∷binary); wf.write((char *)a, sizeof a); ② 使用ofstream构造一个输出流,然后使用open函数指定写入方式: ofstream wf; wf.open(″data.dat″,ios∷binary); wf.write((char *)a, sizeof a);

③ 构造一个流之后,再使用setmode成员函数改变模式: ofstream wf(″data.dat″); wf.setmode(filebuf∷binary); wf.write((char *)a, len);

④ 使用二进制操作符代替setmode成员函数: ofstream wf(″data.dat″); wf<<binary; wf.write((char *)a, len);

例14-6 文件显示 #include <iostream> #include <fstream> 例14-6 文件显示 #include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { char ch; if(argc!=2) { cout << "Usage: ProgramName <filename>\n"; return 1;} ifstream in(argv[1], ios::in | ios::binary);

if(!in) { cout << "Cannot open the file."; return 1;} while(in) { // in will be false when eof is reached in.get(ch); if(in) cout << ch; } return 0;

例 14-7 读写二进制的形式文件 将3门课程的名字和成绩以二进制的形式存放在磁盘中,然后读出该文件,并将内容显示在屏幕上。 例 14-7 读写二进制的形式文件 将3门课程的名字和成绩以二进制的形式存放在磁盘中,然后读出该文件,并将内容显示在屏幕上。 #include <iostream> #include <fstream> using namespace std; struct list { char course[10]; int score; };

int main() { list st1[3], st2[3]; int i; ofstream out("grade", ios::binary); if(!out) { cout << "Cannot open the grade file.\n"; return 1; }

for (i=0; i<3; i++) { cin >> st1[i].course >> st1[i].score; out.write((char *)&st1[i], sizeof(st1[i]));} out.close(); ifstream in("grade", ios::binary); if(!in) { cout << "Cannot open the grade file.\n"; return 1; }

cout << "File grade:" << endl; for (i=0; i<3; i++) { in.read((char *)&st2[i], sizeof(st2[i])); cout << st2[i].course << " " << st2[i].score << endl;} in.close(); return 0; }

五、随机文件操作 随机访问文件。使用I/O流类库中提供的定位读指针和定位写指针的成员函数。

(1) 定位读指针的成员函数 istream & istream ∷seekg(流中位置); long istream ∷tellg( ); 其中,〈流中位置〉和〈偏移量〉都是long型量,用字节数表示。〈参照位置〉有如下几种: cur=1相对于当前指针位置 beg=0相对于流的开始位置 end=2相对于流的结尾位置

(2) 定位写指针的成员函数 ostream & ostream ∷seekp(流中位置); long ostream ∷tellp( );

例 14-8 模拟电视频道的存储 模拟电视频道的存储和选择。创建一个文件,通过键盘输入电视频道序号和名称,并写入文件;文件中的内容可以输出到屏幕上。 #include <iostream> #include <fstream> #include <iomanip> #include <cstdlib> using namespace std; struct TVChannel { int channelNum; char channelName[20]; }; void outputLine( ostream &output, const TVChannel &c );

int main() { ofstream outTV( "tv.dat", ios::ate | ios::binary); if ( !outTV ) { cerr << "File could not be opened." << endl; return 1; } cout << "Enter channel number " << "(1 to 100, 0 to end input)\n? "; TVChannel tv; cin >> tv.channelNum;

while ( tv.channelNum > 0 && tv.channelNum <= 100 ) { cout << "Enter Channel Name\n? "; cin >> tv.channelName; outTV.seekp( ( tv.channelNum - 1 ) * sizeof( TVChannel ) ); outTV.write( (char *)( &tv ), sizeof( TVChannel ) ); cout << "Enter channel number\n? "; cin >> tv.channelNum; }

outTV.close(); ifstream inTV( "tv.dat", ios::in ); if ( !inTV ) { cerr << "File could not be opened." << endl; return 1; }

cout << setiosflags( ios::left ) << setw( 10 ) << "ChannelNum" << setw( 20 ) << "Channel Name" << endl; inTV.read( (char *)( &tv ), sizeof( TVChannel ) ); while ( inTV&& !inTV.eof() ) { if ( tv.channelNum != 0 ) outputLine( cout, tv ); inTV.read( (char *)( &tv ), sizeof( TVChannel ) ); } return 0;

void outputLine( ostream &output, const TVChannel &tv ) { output << setiosflags( ios::left ) << setw( 10 ) << tv.channelNum << setw( 20 ) << tv.channelName << '\n'; }

程序设计举例 修改第12章实例编程的Date类,重载<<运算符,输出Date对象。 class Date { friend ostream &operator<<( ostream &, const Date & ); int day, month, year; 在Date.cpp文件中添加如下代码: ostream &operator<<( ostream &output, const Date &d ) { static char *monthName[ 12 ] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; output << monthName[ d.month-1 ] << ' ' << d.day << ", " << d.year; return output; }

// Example14-9.cpp演示完整的日期类 #include <iostream > #include "date.h" using namespace std; int main() { Date today, Olympicday(2004,8,13); cout << "Today (the computer's day) is: " << today<< endl; today += 365; cout << "After 365 days, the date is: " << today << endl; Date testday(2,28);

cout << "the test date is: " << testday << endl; Date nextday = testday + 1; cout << "the next date is: " << testday << endl; today.SystemDate(); cout << "the Athens Olympic Games openday is: " << Olympicday << endl; cout << "And after " << Olympicday-today << " days, the Athens Olympic Games will open." <<endl; return 0; }

例14-10 名字空间的使用。 // Example 14-10:名字空间的使用 #include <iostream> namespace university { int grade=4; } namespace highschool { int grade=3;

int main() { std::cout<<"The university's grade is: "<<university::grade <<std::endl; std::cout<<"The highschool's grade is: "<<highschool::grade <<std::endl; return 0; }

例14-11 改写例14-6的程序 分别以十六进制的形式和ASCII码的形式显示文件的内容。 例14-11 改写例14-6的程序 分别以十六进制的形式和ASCII码的形式显示文件的内容。 #include <iostream> #include <fstream> #include <cctype> #include <iomanip> using namespace std; int main(int argc, char *argv[]) { if(argc!=2) { cout << "Usage: ProgramName <filename>\n"; return 1; }

ifstream in(argv[1], ios::in | ios::binary); if(!in) { cout << "Cannot open input file.\n"; return 1; }

int i, j; int count = 0; char c[16]; cout.setf(ios::uppercase); while(!in.eof()) { for(i=0; i<16 && !in.eof(); i++) in.get(c[i]); if(i<16) i--; // get rid of eof for(j=0; j<i; j++) cout << ' ' << setw(2) << setfill('0') << hex << (int) c[j]; for(; j<16; j++) cout << " "; cout << "\t";

for(j=0; j<i; j++) if(isprint(c[j])) cout << c[j]; else cout << "."; cout << endl; count++;

if(count==16) { count = 0; cout << "Press ENTER to continue: "; cin.get(); cout << endl; } in.close(); return 0;

结 束 语 学好计算机的唯一途径是 你的编程能力与你在计算机上投入的时间成 上机练习 正比