第13章C的IO流类库
C面向对象程序第13章

整理ppt
7
【例13-1】读入一个整型数据和一个双精度数据并输出
• #include "stdafx.h" • #include "stdio.h" • #include "iostream.h" • void main() •{ • int i; • double d; • cin>>i; • cin>>d; • cout<<i<<","<<d<<endl; • getchar(); •}
整理ppt
9
【例13-2】Point类重载插入运算符示例
• #include "stdafx.h"
• #include "stdio.h"
• #include "iostream.h"
• class point
•{
•
int x,y;
• public:
•
point(int x,int y)
•
{
•
point::x=x;
• width成员函数与fill成员函数均在头文件 iostream.h中说明,因此要使用这两个函数,必 须在程序中包含iostream.h头文件。而预定义格 式控制函数setw在头文件iomanip.h中说明,要使 用setw必须在程序中包含iomanip.h头文件。
整理ppt
14
【例13-3】使用width成员函数控制输出宽度
整理ppt
4
C++语言在开始使用流类时,就预定义了如下4个常 用的输入/输出流对象
• cin:是istream类的对象,用于处理键盘输入。 • cout:是ostream类的对象,用于处理屏幕输出。 • cerr:是ostream类的对象。用于处理出错信息,
C#IO流详解

C#IO流详解分类:C# 2010-12-21 20:13 341人阅读评论(1) 收藏举报文件流和数据流不同的流可能有不同的存储介质,比如磁盘、内存等。
.NET类库中定义了一个抽象类Stream,表示对所有流的抽象,而每种具体的存储介质都可以通过Stream的派生类来实现自己的流操作。
FileStream是对文件流的具体实现。
通过它可以以字节方式对流进行读写,这种方式是面向结构的,控制能力较强,但使用起来稍显麻烦。
此外,System.IO命名空间中提供了不同的读写器来对流中的数据进行操作,这些类通常成对出现,一个用于读、另一个用于写。
例如,TextReader和TextWriter以文本方式(即ASCII方式)对流进行读写;而BinaryReader和BinaryWriter采用的则是二进制方式。
TextReader和TextWriter都是抽象类,它们各有两个派生类:StreamReader、StringReader以及StreamWriter、StringWriter。
17.3.1 抽象类StreamStream支持同步和异步的数据读写。
它和它的派生类共同组成了.NET Framework上IO操作的抽象视图,这使得开发人员不必去了解IO操作的细节,就能够以统一的方式处理不同介质上的流对象。
Stream类提供的公有属性见表17.4所示。
表17.4 Stream类的公有属性属性名类型含义CanRead bool 是否可以读取流中的数据CanWrite bool 是否可以修改流中的数据CanSeek bool 是否可以在流中进行定位CanTimeout bool 流是否支持超时机制Length long 流的长度Position long 流的当前位置ReadTimeout int 读超时限制WriteTimeout int 写超时限制其中前4个布尔类型的属性都是只读的。
也就是说,一旦建立了一个流对象之后,流的这些特性就不能被修改了。
C++程序设计教程7

例 7.7(1) 输出运算符 “<<”重载的例子 //例 7.7(1) 运算符 “<<”重载
例 7.7(2) 把重载输出运算符定义为类的友元函数,这样就可 以访问类的私有成员
//例 7.7(2) 运算符 “<<”重载
7.4.2 重载输入运算符 “>>” 只是要把ostream换成istream ,把”<<”用”>>”代替,第二个 参数是一个引用。 定义输入运算符”>>”重载函数的一般格式如下: istream &operator >>(istream &stream, class_name &obj ) { //操作代码 return stream; } 例 7.11重载输入运算符 “>>” //例 7.7(2) 运算符 “>>”重载
fstream
strstream ostream_withassign
iostream
iostream_withassign
7.4 用户自定义类型的输入输出
用户自定义的类型数据的输入或输出,可以通过重载运算符 “>>”和 “<<”来实现,使“>>”和 “<<”可以直接用来输入或 输出类的对象。
7.4.1 重载输出运算符 “<<” 定义输出运算符”<<”重载函数的一般格式如下: ostream &operator <<(ostream &stream, class_name obj ) { //操作代码 return stream; } 函数中的一个参数是对ostream 对象的引用,它可以是其它任 何合法的标示符,但必须与return后面的标示符相同。第二个 参数接受将被输出的对象,其中class_name是类名,obj为该类 的对象名。
C第12章-IO流类库PPT课件

void main()
{ cout.put('B').put('E').put('I').put('J').put('I').put('N').put('G').put('\n');
char *str="I love BEIJING!";
cout<<"The string is "<<str<<endl;
cout.write(const char *str,int n);
str是一个字符指针或字符数组名,用来存放 一个字符串,也可以是字符串常量; n用来指定输出字符串中字符的个数。
-
7
[例13.1]分析下列程序的输出结果,熟悉put()和write()函数的 用法。程序内容如下:
#include <iostream.h>
插入运算符可连续使用,但应注意计算顺序。 系统指定标准输出设备屏幕的对象为cout,将 输出流显示在屏幕上的格式如下: cout << <表达式1> << <表达式2> <<…… ;
使用中应注意<表达式>中运算符的优先级。
-
5
13.1.2 使用成员函数put()输出一个字符 成员函数put()的格式如下: ostream& cout.put(char c);
#include <string.h> void print(char *s) { cout.write(s,strlen(s)).put('\n');
C为何有自己的IO系统

6.4.1 用ios类成员函数格式化
一、格式由状态标志确定,状态标志在状态量中各占一位; 二、详细的格式控制枚举量(表6-1); 三、使用ios成员函数对流的输入输出操作进行格式控制: 1、设置状态标志:setf
6.3.2 ostream
一、ostream提供主要的输出操作,是用户使用流库 的主要界面之一。
二、ostream的简要介绍 1、输出操作 2、随机移动文件指针6.33 输出运算符“<<”
一、又称为插入运算符,包含两个操作数: 1、左操作数:ostream类类型的对象; 2、右操作数:一个预定义类型的变量,也可为重载了该运
算符的类的对象。 3、可以识别预定义类型,也可以识别重载后的类的对象。 二、运算: 1、采用左结合的方式 2、输入语句将跳过空白,从标准输入读取数字。 三、实例6-2 四、”>>”的重载:第二个参数必须是一个引用,目的在于
obj的值能在函数外被修改。
6.4 格式控制
C++中可以用C的printf和scanf进行格式化 I/O(缺点在哪里?)。
6.4.2 用操纵函数控制格式
一、操纵函数: 特殊的,类似于函数的运算符--操纵符。以一个流引
用作为参数,并返回同一流的引用,因此,可以嵌入到输 入或输出操作链中。 1、实例: 2、操纵符函数仅改变流的状态标志; 3、标准操纵符函数(表6-2); 4、在任何时候刷新流ostream:
ostream<<flush; 5、用户可自定义操纵符函数。
一个指向streambuf的指针 格式化标志:format flags io_state:对I/O错误进行处理
C的IO流库

}
使用成员函数get()获取一个字符
get()函数可以从输入流获取一个字 符,并把它放置到指定变量中。该函数 的使用格式:
cin.get(char &ch) &ch是一个字符变量的地址值。
}
#include "iostream.h“\\Ex9_2 void main() {
int a=100; int *pa=&a; cout<<"a="<<a<<endl<<"&a="<<long(&a)<<endl; cout<<"*pa="<<*pa<<endl<<"&pa="<<&pa<<endl; }
#include "iostream.h" #include "string.h" void PrintString(char *s) {
cout.write(s,strlen(s)).put('\n'); cout.write(s,6)<<"\n"; } void main() { char str[]="I love C++"; cout<<"The string is : "<<str<<endl; PrintString(str); PrintString("This is a string"); }
#include "iostream.h“\\Ex9_8
C++的I-O流类库

void main ()
{ Point pt1(0,0),pt2(0,0);
cin >> pt1;
cin >> pt2;
k==ox4d2 输出后将标志恢复。
输出的宽度缺省值为插入符右边的操作数输出所需的最小字符 数。宽度函数可改变缺省值。例如:
int i=123;
cout.width(10);
cout<<i<<‘\n’;
cout<<i; 这段程序的输出为:
123
123
使用width()函数设置宽度后,如果所需的字 符数不小于指定的宽度,则将忽略指定的宽度 值。
重载运算符的返回值类型为ostream &, 在实现时返回输出流参数本身。重载运 算符<<后,可以象输出C++内部类型对 象那样使用 <<来输出Point类型的对象了。 假设P是一个Point类型对象,其X和Y成 负的值为10和20,则下面的语句:
cout <<P;
将在标准输出设备输出如下的内容:
friend ostream & operator << (ostream & ,point &);
};// 重载运算符 >>
istream & operator >> (istream & in, point & pt)
{ char ch; in >> ch; if (ch == ‘c’) { in >> pt.x; in >> ch; in >> pt.y; in >> ch; } return in; }
第13章 C++输入输出流《C++程序设计基础教程》课件

cout.unseft(ios::oct);
char *pt="China"; //pt指向字符串"China"
cout.width(10);
//指定域宽为10
cout<<pt<<endl;
//输出字符串
cout.width(10);
//指定域宽为10
cout.fill('*');
//指定空白处以'*'填充
27
13.4.3 文件的打开与关闭
28
பைடு நூலகம்
若open函数调用失败,返回值为0(假);若构造 函数打开失败,则流对象的值为0。 2. 关闭磁盘文件 成员函数close。
outfile.close( ); 关闭:解除磁盘文件与文件流的关联。
28
13.4.4 对ASCII文件的操作
29
ASCII文件的读写操作
(1) 用文件流对象和流插入运算符"<<"和流提 取运算符">>"输出输入标准类型的数据。
(2) 用文件流的put,get,getline等成员函数进 行字符的输入输出。
29
例13.11从键盘输入10个整数到文件 30
① #include <fstream> void main( ) {
int a[10]; ② ofstream outfile("f1.dat",ios::out);
cout.setf(ios::internal); //数符出现在左侧
cout.precision(6);
//保留6位小数
cout<<pi<<endl; //输出pi,注意数符"+"的位置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这四个标准流对象是程序中进行标准输入输出要
用到的。
cin对象是从标准输入设备(键盘)输入到内存的数据流,称 为cin流或标准输入流。
cout对象是从内存输入到标准输出设备(显示器)的数据流, 称为cout流或标准输出流。
第13章C的IO流类库
1) 输入流
在输入操作时,字节流从输入设备(如键盘、 磁盘)流向内存,称为输入流。
2) 输出流
在输出操作时,字节流从内存流向输出设备 (如显示器、打印机、磁盘等),称为输出流。
流中的内容可以是ASCII字符、二进制形式 的数据、图形图像、数字音频视频或其它形式 的信息。
3) 输入输出流的本质
常用iso流类的简要说明和类声明所在的头文 件名见书第373页表13.1。
ios
istream
fstreambase
strstreambase
ostream
ifstream
istrstream
ofstream
ostrstream
iostream
fstream
strstream
ios流类层次图
[说明]
实际上,在内存中为每一个数据流开辟一 个内存缓冲区,用来存放流中的数据。
当用cout和插入运算符“<<”向显示器输出数据时, 先将这些数据送到程序中的输出缓冲区保存,直到 缓冲区满了或遇到endl,就将缓冲区中的全部数据 送到显示器显示出来。
在输入时,从键盘输入的数据先放在键盘的缓冲区 中,当按回车键时,键盘缓冲区中的数据输入到程 序中的输入缓冲区,形成cin流,然后用提取运算符 “>>”从输入缓冲区中提取数据送给程序中的有关 变量。
1.格式状态字 C++可以给每个流对象的输入输出进行格式控制,以满足
程序员对输入输出格式的需求。 输入输出格式由一个long int类型的格式状态字确定,状
态字的各位都控制一定的输入输出特征。 在ios类的public部分定义了一个枚举,它的每个成员可以
分别定义格式状态字的一个位,每一个位称为一个状态标志位。 这个枚举的定义如下:
cerr和clog均为向输出设备(显示器)输出出错信息。
13.2 格式化I/O
在很多情况下,程序员需要控制输入输出格式。 C++提供了两种格式控制方法: 使用ios类中有关格式控制的成员函数; 使用称为控制符的特殊类型的函数。
13.2.1 用ios类的成员函数进行格式控制
ios类中有几个成员函数可以用来对输入输出进行格 式控制。进行格式控制主要是通过对格式状态字、域宽、 填充字符以及输出精度的操作来完成的。
4) 流类
在C++中,输入输出流被定义为类。C++的IO 库中的类称为流类(stream class)。用流类 定义的对象称为流对象。
[例如]
cin和cout就是iostream_withassign类的对 象。
13.1. 2 流类库
C++流库是C++语言为完成输入/输出工作而 预定义的类的集合。
streambuf类提供对缓冲区的低级操作,如设置缓 冲区、对缓冲字符。
streambuf有三个派生类,即filebuf、 strstreambuf和conbuf,其成员函数大多采用内置 函数方式定义,以提高效率。
下图为它们之间的层次关系。
streambuf
在头文件iostream.h中,提供了4个预定义的标 准流对象:
extern istream_withassign cin; // 预定义代表标准输入设备键盘
extern ostream_withassign cout; // 预定义代表标准输出设备显示器
extern istream_withassign cerr; // 预定义代表标准出错输出设备显示器
enum { skipws = 0x0001, left = 0x0002, right = 0x0004, internal = 0x0008, dec = 0x0010, oct = 0x0020, hex = 0x0040,
showbase = 0x0080, showpoint = 0x0100, uppercase = 0x0200, showpos = 0x0400, scientific = 0x0800, fixed = 0x1000, unitbuf = 0x2000, stdio = 0x4000 };
2.ios类中用于控制输入输出格式的成员函数 在ios类的说明中,定义了几个用于格式控制的公有成员
函数,列举如下:
long ios::flags(); // 返回当前格式状态字 long ios::flags(long): // 设置格式状态字并返回 long ios::setf(long); // 设置指定的标志位 long ios::unsetf(long); // 清除指定的标志位 int ios::width(); // 返回当前显示数据的域宽 int ios::width(int); // 设置当前显示数据域宽并返回原域宽 char ios::fill(); // 返回当前填充字符 char ios::fill(char); // 设置填充字符并返回原填充字符 int ios::precision(); // 返回当前浮点数的精度 int ios::precision(int); // 设置浮点数精度并返回原精度
strstreambuf
filebuf
conbuf
2. ios类
ios类是一个虚基类,它主要定义了用于格式 化输入输出及出错的成员函数。
在ios类和它的各级派生类中,均含有一个指 向流缓冲类streambuf的对象的指针。Ios类(及其 派生类)使用streanbuf类以及它派生的文件缓冲 类filebuf和字符缓冲类strstreambuf进行输入输 出。
C++的I/O流类库是用继承方法建立起来的 一个输入输出类库,这些类构成一个层次结构 的系统。
它具有两个平行类:即streambuf类和ios 类,这两个类是基本类,所有的流类都可以由 它们派生出来。
1. streambuf类
streambuf类提供物理设备的接口,它提供缓冲或 处理流的通用方法,几乎不需要任何格式。缓冲区由 一个字符序列和两个指针组成,这两个指针是输入缓 冲区指针和输出缓冲区指针,它们分别指向字符要被 插入或取出的位置。