C++课件第10章:流类库和输入输出

合集下载

《C++程序设计》电子教案第10章 流类库与输入输出

《C++程序设计》电子教案第10章  流类库与输入输出

C++中所有流都是相同的 , 但文件可以不同 。 中所有流都是相同的, 但文件可以不同。 中所有流都是相同的 使用流以后, 使用流以后 , 程序用流统一对各种计算机设备 和文件进行操作,使程序与设备、 和文件进行操作 , 使程序与设备 、 程序与文件 无关,从而提高了程序设计的通用性和灵活性。 无关 , 从而提高了程序设计的通用性和灵活性 。 也就是说, 也就是说 , 无论与流相联系的实际物理设备差 别有多大,流都采用相同的方式运行。 别有多大 , 流都采用相同的方式运行 。 这种机 制使得流可以跨越物理设备平台, 制使得流可以跨越物理设备平台 , 实现流的透 明运作,而与实际的物理设备无关。例如, 明运作 , 而与实际的物理设备无关 。 例如 , 往 显示器上输出字符和向磁盘文件或打印机输出 字符,尽管接受输出的物理设备不同, 字符 , 尽管接受输出的物理设备不同 , 但具体 操作过程是相同的。 操作过程是相同的。
返回本节
10.2 格式化 格式化I/O
10.2.1 10.2.2 10.2.3 10.2.4 ios类中的枚举常量 类中的枚举常量 使用ios成员函数 使用 成员函数 使用I/O操作符 使用 操作符 检测流操作的错误
返回首页
10.2.1 ios类中的枚举常量 类中的枚举常量
在根基类ios中定义有三个用户需要使用的枚举类型, 在根基类 中定义有三个用户需要使用的枚举类型,由 中定义有三个用户需要使用的枚举类型 于它们是在公用成员部分定义的, 于它们是在公用成员部分定义的,所以其中的每个枚举类 型常量在加上ios::前缀后都可以为本类成员函数和所有外 型常量在加上 前缀后都可以为本类成员函数和所有外 部函数访问。 部函数访问。 在三个枚举类型中有一个无名枚举类型, 在三个枚举类型中有一个无名枚举类型,其中定义的每个 枚举常量都是用于设置控制输入输出格式的标志使用的。 枚举常量都是用于设置控制输入输出格式的标志使用的。 该枚举类型定义如下: 该枚举类型定义如下: enum { skipws,left,right,internal,dec,oct,hex,sh owbase,showpoint, uppercase,showpos,scientific,fixed,unitbuf, stdio };

流类库和输入输出C程序设计第2版课件

流类库和输入输出C程序设计第2版课件
ifstream ifile("test"); //打开test文件用于读,即输入
if (!ifile)
{ cout << "test文件不能打开" << endl;
return 0; } char str[80]; ifile >> str; // 与get不同, >>遇到空格时结束 ifile.close();
int=filebuf::openprot);
ofstream::ofstream(const char*,int=ios::out, int=filebuf::openprot);
fstream::fstream(const char*,int, int=filebuf::operprot);
所以1,2两步可合成: fstream iofile(”myfile.txt”,ios::in|ios::out);
int=filebuf::opernprot); void fstream::open(const char*,int,
int=filebuf::openprot); 第一个参数为要打开的磁盘文件名。第二个参数为打开方式, 有输入(in),输出(out)等,打开方式在ios基类中定义为 枚举类型。第三个参数为指定打开文件的保护方式,一般取默 认。所以第二步可如下进行: iofile.open(“myfile.txt”,ios::in|ios::out);
指针
streambuf
istream
ostream
ifstream
iostream
fstream
主要输入/输出流模板层次
ofstream
第2页,共21页。

C语言程序设计课件第10章 输入输出流

C语言程序设计课件第10章 输入输出流

# include <iomanip.h>
void main(void)
{ char *name[]={"Zhou","Zhao","Liu","Chen","Li"};
double score[]={89,87.2,78.33,91.444,85.5555};
for (int i=0;i<5;i++) { cout.setf(ios::left);
如整数1025,以文本形式(31003236H)存储占用
四个字节,以二进制形式(0401H)存储则只占用
两个字节。
2021/7/13
23
2.文件的操作 文件操作分成4步: (1)定义文件流对象 ifstream 文件输入流对象; ofstream 文件输出流对象; fstream 文件输入/出流对象; (2)打开文件 文件流对象.open(磁盘文件名,输入输出模式)
14
2.其它格式控制
若要改变流的其它输出格式(如对齐方式), 可使用ios类中定义的成员函数setf来实现, 函数格式如下:
cout.setf(格式标志)
格式标志在类ios中被定义为枚举值,在引用这 些格式标志时要在前面加上类名ios和域运算 符“::”。
2021/7/13
15
【例10.3】 将学生姓名与比赛得分通过初始化 赋给数组name[5]、score[5],指定姓名域宽 为10个字符、左对齐,比赛得分为右对齐、 用定点方式、小数点后有2位有效数字。
2021/7/13
22
10.3 文件操作与文件流
10.3.1 文件的概念
1.文件

流类库与输入输出-精品.ppt

流类库与输入输出-精品.ppt

//指定域宽为10
cout<<pt<<endl;
//输出字符串
cout.width(10);
//指定域宽为10
return 0;
}
东南大学软件学院(苏州 ) C++程序设计
三、文件输入输出
ASCII文件与二进制文件
ASCII文件提供了高级的输入输出功能,把若干个字节转换为一个有意 义的单位,然后以ASCII字符形式输入输出
int main()控制符
作用
{int a; dec cout<<″input a:″; cin>>a; hex
以十进制输出 以十六进制输出
cout<<″deoc:c″t<<dec<<a<<endl;
//以十进以制八形进式制输出整数
ccoouutt<<<<s″″eohtcebtxa::″s″<<e<<(shnee)tbx<as<ea(<8<)<e<ndal<; <e以nnd进l; 制/形/以//式以十输八六出进进(制制n形形的式式取输输值出出,整整8数,数1a0a,16)
cout<<″x2=″<<(-b-sqrt(disc))/(2*a)<<endl;} return 0; }
东南大学软件学院(苏州 ) C++程序设计
二、标准输入输出(格式控制)
1.##使iinn用cclluu控ddee制<<ii符oosm控traen制aipm格>>//式不要忘记包含此头文件
using namespace std;

C++:流类库与输入输出

C++:流类库与输入输出

C++:流类库与输⼊输出7.2.1 C++的输⼊输出流ios:流基类(抽象类)istream:通⽤输⼊流类和其他输⼊流的基类ostream:通⽤输出流类和其他输出类的基类iostream:通⽤输⼊输出流类和其他输⼊输出流类的基类(以下的派⽣类对象有cin、cout、cerr、clog)ifstream:输⼊⽂件流类ofstream:输出⽂件流类fstream:输⼊输出⽂件流istrstream:输⼊字符串流类ostrstream:输出字符串流类strstream:输⼊输出字符串类iostream_withassign: 通⽤输⼊输出流类和其他输⼊输出流类iostream的的派⽣类7.2.2 预定义的流对象C++中包含⼏个预定义的流对象,它们是标准输⼊流对象cin、标准输出流对象cout、⾮缓冲型的标准出错流对象ceer、缓冲型的标准出错流对象clogcin是istream的派⽣类istream_withassign的对象,它与标准输⼊设备(通常是键盘)相联系。

cout是ostream的派⽣类ostream_withassign的对象,它与标准输出设备(通常是显⽰器)相联系。

ceer是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。

clog是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。

由于istream和ostream类都在头⽂件iostream中声明的,因此只要在程序中包含头⽂件iostream.h,C++程序开始时这四个标准流对象的构造函数都被⾃动调⽤。

7.2.3 输⼊输出流的成员函数(1)put函数put函数⽤于输出⼀个字符格式:cout.put(char ch)例如:cout.put('A')===cout.put(65)===cout.put(25+40)(2)get函数get函数的功能与提取运算符>>类似,主要不同之处是get函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。

10 文件流类

10 文件流类

10.2 标准I/O流
常用函数:
• 设置输入/输出宽度函数:setw(int)
• 设置输出填充字符函数:setfill(int)
• 设置输出精度函数:setprecision(int) • 设置输入/输出整型数数制函数:dec、hex和oct • 取消输入结束符函数:ws • 控制换行操作符:endl • 代表输出单字符‚\0”的操作符:ends
其实,所谓输入输出,是相对于内存而言的。 在C++程序中,数据可以从程序流向屏幕或磁盘文件,也可以从键盘或 磁盘文件流入到程序中。 换一种角度,简单说,I/O流就是一系列写到屏幕或从键盘读出的各种 字符。 从流中获取数据的操作称为提取(或抽取)操作。 向流中添加数据的操作称为插入操作。 如下图所示:
第10单元 输入输出流
基本概念 标准I/O流 文件I/O流
串I/O流
10.1 基本概念
一、为什么要有C++流类库
C语言中的输入输出系统不支持自定义的对象或数据类型。
如有下面的定义:
struct sample {
int i ;
float f; char *ch; }s1; 不能用下面的输出函数来输出以上结构变量s1: printf(“%sample”,s1);
10.2 标准I/O流
【例】 void main( )
{
char str[]="You will be the C++ master !"; cout.write(str,sizeof(str)-1); cout<<endl; cout.write(&str[4],4) <<endl; }

流类库与输入输出

流类库与输入输出

流类库与输入/输出。

本章主要内容:a)I/O流的概念b)预定义的标准流与提取和插入运算符c)使用I/O成员函数输入流d)文件流2.概述a)输入/输出( input/output ) 是指程序与计算机的外部设备之间进行信息交换。

b)输入操作指从指定设备收取一个字符序列。

c)输出操作将一个对象转换为一个字符序列,输出到某一个设备;d)输入输出操作可以看成是字符序列在源和目的之间的流动。

将执行这个输入/输出操作的类体系称为流类,提供这个流类实现的系统称为流类库。

e)在C++中,没有专门的输入/输出语句,为了方便用户灵活地完成输入/输出,C+提供了功能强大的输入/输出流类库。

f)C++的I/O系统为了向程序员提供一个统一的接口,使程序的设计尽可能地与所访问的具体设备无关,在程序员与被使用的设备之间提供了一个抽象的概念——流。

g)读操作在流数据抽象中被称为(从流中)提取>>,h)写操作被称为(向流中)插入<<。

i)C++语言支持的外部设备是各种各样的,它将各设备都转换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。

对程序员而言,所有流的行为是一样的,所以一个用来进行磁盘文件写入操作的函数,也可以用来向显示器写信息。

3.使用流的优点:(与printf,scanf比较)a)(1)可以用其严格的类型检查机制减少因使用不当引起的程序错误;b)(2)流是面向对象的,可以利用类的继承性和多态性,给用户提供统一的接口,实现更多的功能。

4.C++中的流类体系在头文件“iostream.h”中作了说明。

a)*类ios是类istream和类ostream的虚基类;b)*streambuf不是ios类的派生类,类ios中有一个指c)针成员指向类streambuf的一个对象。

d)*类streambuf是用来管理一个流的缓冲区。

e)*类iostream是类istream和类ostream的公有派生,f)从而通过#include “iostream.h”可以完成输入操作和输出操作。

C++语言程序设计(郑莉)课件11【流类库与输入输出】

C++语言程序设计(郑莉)课件11【流类库与输入输出】

} employee;
ifstream is("payroll",ios::binary|ios::nocreate);
if (is)
{ is.read((char *) &employee,sizeof(employee));
cout<<<<' '<<employee.salary<<endl;
流是一种抽象,它负责在数据的生产者和数据的 消费者之间建立联系,并管理数据的流动。
程序建立一个流对象,并指定这个流对象与某个 文件对象建立连接,程序操作流对象,流对象通 过文件系统对所连接的文件对象产生作用。
读操作在流数据抽象中被称为(从流中)提取, 写操作被称为(向流中)插入。
3
C++语言程序设计
cout << values[i] <<'\n'; } }
输出结果: 1.23
35.36 653.7 4358.24
8
C++语言程序设计
例:使用*填充
清华大学 郑莉
输 #include <iostream> 出 using namespace std;
流 void main() { double values[]={1.23,35.36,653.7,4358.24};
5
C++语言程序设计
输出流对象
清华大学 郑莉
输 ofstream类支持磁盘文件输出 出 如果在构造函数中指定一个文件名,当构造这个文件
时该文件是自动打开的
流 –ofstream myFile("filename",iosmode);

C 输入输出流.ppt

C  输入输出流.ppt
ios_base
streambuf
ios
streambuf
istream
ostream
stringbuf istringstream
filebuf ifstream
iostream filebuf ofstream
stringbuf ostringstream
filebuf
fstream
stringstream
long l = 1000;
unsigned short us = 234;
float f = 3.23;
double df = 1.55;
char str[] = "C++ IO is very easy!";
cout << ch << endl;
cout << s << endl;
cout << i << endl;
例 将姓名和成绩按照固定宽度对齐输出,并利用*填充空白部分。 #include <iostream> #include <iomanip> using namespace std; int main(){
double values[ ] = {89.5, 78, 92.5, 84}; char *names[ ] = {"Zoot", "Jimmy", "Allen", "Stan"};
14
(4) 控制输出宽度 有时在发票上,了使打印机输出的内容和发票的样式能够对应上,需要使输出 项的输出宽度不小于某个宽度,若输出项自身的宽度大于指定的宽度,则使用 输出项自身的宽度。输出宽度的设置可以通过操作符setw。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
do { cout<<"请输入您的分数:"; cin>>score; cin.clear(ios::goodbit); cin.getline(s,100); //char s[100]; }while(score<0||score>100);
提高程序健壮性:清空缓冲区
方法二、使用函数cin.ignore()提取缓冲区内容 do { cout<<"请输入您的分数:";
示器为标准输出设备。
标准输出流对象的区别
对象名 cout clog cerr 是否使用缓冲区 是 是 否 是否可以重定向 是 否 否
注:这里的区别与头文件、编译环境和运行环境 都有较大影响,具体细节非常复杂。
cerr对象的不缓冲特性(*)
#include <iostream.h> //传统头文件 int main() { int i=0,j;
第10章 流类库和输入输出
东南大学 生物科学与医学工程学院 夏小俊
本章要点
了解输入/输出流类库的相关概念 掌握文本文件和二进制文件读写 掌握提取和插入运算符的重载
10.1 C++的基本流类体系
basic_ ios
指针
basic_ streambuf
basic_ istream
basic_ ostream
cin>>score;
cin.clear(ios::goodbit);
cin.ignore(255 ,'\n');
}while(score<0||score>100);
提高程序健壮性:清空缓冲区
方法三、使用函数cin.sync()清空输入缓冲区 do { cout<<"请输入您的分数:";
cin>>score;
误处理的成员函数。basic_istream类模板提供完成提 取(输入)操作的成员函数,basic_ostream类模板 提供完成插入(输出)操作的成员函数。 basic_iostream类是前两者的聚合,并没有增加成员。 先定义了数据类型(如char或wchar_t等等)的模板实 例,所以可以继承。
提取运算符和插入运算符
• 提取运算符“>>”(stream_extraction
operator)和插入运算符“<<” (stream_insertion operator),执行输入 /输出操作。 “提取”的含义是指输入操作,可看作从流中 提取一个字符序列。


“插入”的含义是指输出操作,可看作向流中 插入一个字符序列。
10.2 文件的输入与输出
• C++根据文件(file)内容的数据格式,可分
为两类:二进制文件和文本文件。
• 文本文件由字符序列组成,也称ASCII码文件,
在文本文件中存取的最小信息单位为字符 (character),而二进制文件中存取的最小 信息单位为字节(Byte)。
率较高。
• 文本文件的读写容易理解,二进制文件读写效
提高标准输入/输出的稳健性
• cin为缓冲流。如果输入错了,回车键按下就
无法挽回了。只有把数据取完后,才能重来。
• 输入的数据类型必须与要提取的数据类型一致,
否则出错。出错只是在流的状态字state中对 应位置位,要重来必须重置状态。
但无法分隔字符和字符串。
• 空格、回车和制表符可以用来分隔数值数据,
basic_ ifstream
basic_ iostream
basic_ ofstream
basic_ fstream
C++的基本流类系说明(*)
• basic_streambuf不是basic_ios的派生类,而是一个
独立的类,只是basic_ios有一个保护访问限制的指针 指向它,其作用是管理一个流的缓冲区。
• 特别需要注意在输入字符和字符串之前的操作。
程序健壮性的示例:输入成绩
int score; do {
cout<<"请输入您的分数:";
cin>>score;
}while(score<0||score>100);
猜测:如果输入一个字符a,后果是?
提高程序健壮性:掌控流状态
状态字state为整型
enum ios_state{ goodbit=0x00, failbit=0x02, badbit=0x04, } //流正常 //最近的I/O操作失败,流可恢复 //最近的I/O操作非法,流可恢复
cerr<<“SEU”; //更换cout和clog对比
j=5/i;
return 0;
}
cout的重定向(*)
#include <iostream>
using namespace std;
int main() {
cout<<"SEU\n";
cerr<<"NJU\n"; clog<<"PKU\n"; return 0; } //命令行方式下运行 **.exe >>**.txt
//正常返回1,否则返回0
程序健壮性的示例:输入成绩
int score; do { cin.clear(); cout<<"请输入您的分数:"; cin>>score;
}while(score<0||score>100);
猜测:这样的改进有用吗?
提高程序健壮性:清空缓冲区
方法一、用cin.getline()等方式提走缓冲区内容
cin.clear(ios::goodbit);
cin.sync();
}while(score<0||score>100);
标准输入/输出成员函数
• int istream::get(); • istream&istream::get(char &); • istream&istream::get(char
cout<<endl;
}
插入运算符重载:复数类
ostream&operator<<(ostream&s,const Complex &z) { return s<<'('<<z.Real<<','<<z.Image<<')';
}
提取运算符重载:复数类
istream&operator>>(istream&s,Complex &a){
读写文件的四部曲
• 三个文件流类都重载了一个带默认参数的构造函数,
功能与open函数一样:
• ifstream::ifstream(const char*, int=ios::in,
int=filebuf::openprot);
• ofstream::ofstream(const char*,int=ios::out,
重载插入和提取运算符
• 插入和提取运算符只能重载为类的友元函数 • 提取运算符重载格式:friend
• 插入运算符重载格式:friend
istream&operator>>(istream&,classNa me&); ostream&operator<<(ostream&,classN ame&);
插入运算符重载: Orderedlist类
template <typename T,int size> void <T,size>::print(){ int i; for(i=0;i<=last;i++) { cout<<slist[i].key; //这句是关键 if(i%5==4) cout<<endl;}
state&(badbit|failbit);} //可用操作符!()代替fail()
• inline int ios::bad(){ return state & badbit;}
//返回非法操作位
提高程序健壮性:掌控流状态
• inline void ios::clear(int
_i){ lock();state=_i;unlock();} //人工设置状态,可用来清状态
eofbit=0x01, //输入流结束或文件结束已无数据可取
hardfail=0x08 // I/O出现致命错误,流不可恢复
提高程序健壮性:掌控流状态
读取状态的有关操作如下:
• inline int ios::rdstate() const {return state;}
//读取状态字
• inline int ios:operator!() const{return
int=filebuf::openprot);
• fstream::fstream(const char*,int,
int=filebuf::operprot);
读写文件的四部曲
• 打开文件也应该判断是否成功,若成功,文件流对象
值为非零值,不成功为0(NULL)。
• 因此打开一个文件完整的程序为:
• inline int ios::eof() const {return state&eofbit;}
//返回流(文件)结束位
• inline int ios::fail() const{return
相关文档
最新文档