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、缓冲型的标准出错流对象clog
cin是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函数在读入数据时可以包括空白字符,而后者不可以。
get函数的用于读入一个字符,调用形式:cin.get()
(3)getline函数
getline函数用于从输入流读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),然后插入一个字符串结束志"\n"。("\n"可以用其他字符代替)
getline函数格式:
cin.getline(字符数组,字符个数n,终止标志字符)
或
cin.getline(字符指针,字符个数n,终止标志字符)
(4)ignore函数
ignore函数的功能是跳过输入流的n个字符(默认的个数为1),或在遇到指定的终止符时 提前结束。
调用格式:cin.ignore(n,终止字符)或cin.ignore()===cin.ignore(1,EOF)
*/
//例子1:put和get函数
#include<iostream>
using namespace std;
int main()
{
char ch;
cout<<"Input:";
while(cin.get(ch)) //读取输入的字符,直到结束为止
{
cout.put(ch); //输出字符
}
return ;
}
/*
程序运行结果是:
input:123 abc xyz
123 abc xyz
*/
//例子2:getline函数
#include<iostream>
using namespace std;
int main()
{
char ch[];
cout<<"输入一行字符:"<<endl;
cin.getline(ch,,'t');
cout<<ch<<endl;;
return ;
}
/*
程序运行结果是:
输入一行字符:
shdfjsfefrsdfjt
shdfjsfefrsdfj
*/
7.3.3 输入输出的格式控制
1.用流成员函数进行输入输出格式控制。
cppreference.com -> C++ I/O
C++ I/O
<iostream>库自动定义了一些标准对象:
cout, ostream类的一个对象,可以将数据显示在标准输出设备上.
cerr, ostream类的另一个对象,它无缓冲地向标准错误输出设备输出数据.
clog, 类似cerr,但是它使用缓冲输出.
cin, istream类的一个对象,它用于从标准输入设备读取数据.
<fstream>库允许编程人员利用ifstream和ofstream类进行文件输入和输出.
一些C++ I/O流(精度,判断等)的行为可以通过操作不同的标志来修改。
Constructors 构造器
bad() 如果出现错误则返回true
clear() 清除状态标志
close() 关闭一个流
eof() 如果处于文件结尾处则返回true
fail() 如果出现错误则返回true
fill(char ch) 控制默认填充字符 //格式:char ios::fill(char ch) 调用格式:流对象.fill(ch)
flags() 操作flags
flush() 清空缓冲区
gcount() 返回读取的最后一次输入的字符数
get(char ch) 读取字符
getline() 读取一行字符
good() 如果没有出现过错误则返回true
ignore() 读取字符并忽略指定字符
open() 创建一个输入流
peek() 检查下一个输入的字符
precision(int n) 设置精度 //格式:int ios::percision(int n) 调用格式:流对象.precision(n)
put(char ch) 写字符
putback() 返回字符给一个流
rdstate() 返回流的状态
read() 读取字条符
seekg() 在一个输入流中进行随机访问
seekp() 在一个输出流中进行随机访问
setf() 设置格式标志 //格式:long ios::setf(long flags) 调用格式:流对象.setf(ios::状态标志)
sync_with_stdio() 同标准I/O同步
tellg() 使用输入流读取流指针
tellp() 使用输出流读取流指针
unsetf() 清除格式标志 //格式:long ios::unsetf(long flags) 调用格式:流对象.unsetf(ios::状态标志)
width(int n) 操作域宽度 //格式:int ios::width(int n) 调用格式:流对象.width(n)
write() 写字符
//流成员函数使用方法举例
#include<iostream>
using namespace std;
int main()
{
cout<<"------------1----------\n";
cout.width(); //设置域宽为10
cout<<<<endl; //输出整数123,占10位,默认为右对齐
cout<<"------------2----------\n";
cout<<<<endl; //输出整数123,上面的width(10)已经不起作用,此时按系统默认的域宽输出
//按数据实际长度输出
cout<<"------------3----------\n";
cout.fill('&'); //设置填充字符为'&'
cout.width(); //设置域宽为10
cout<<<<endl; //输出整数123,占10位,默认为右对齐,填充字符为'&'
cout<<"------------4----------\n";
cout.setf(ios::left); //设置左对齐
cout<<<<endl; //输出整数123,上面的width(10)已经不起作用,此时按系统默认的域宽输出
//按数据实际长度输出
cout<<"------------5----------\n";
cout.precision(); //设置实际的精度为4
cout<<123.45678<<endl; //以一般10进制形式输出,有效数字为4
cout<<"------------6----------\n";
cout.setf(ios::fixed); //用固定点格式(固定小数位数)显示浮点数
cout<<123.45678<<endl; //以fixed形式输出,小数位数为4
cout<<"------------7----------\n";
cout.width(); //设置域宽是15
cout.unsetf(ios::fixed); //消除固定点格式(固定小数位数)显示浮点数
cout.setf(ios::scientific); //用科学表示法格式(指数)显示浮点数
cout<<123.45678<<endl; //用科学表示法格式(指数)显示浮点数,小数点占4位
cout<<"------------8----------\n";
int a=;
cout.setf(ios::showbase); //输出整数时显示基数符号
cout.unsetf(ios::dec); //终止10进制的格式设置
cout.setf(ios::hex); //设置以16进制输出格式
cout<<a<<endl; //以16进制输出a
return ;
}
/*
程序运行结果是:
------------1----------
123 (域宽为10,默认为右对齐)
------------2----------
123 (按照数据实际长度输出)
------------3----------
&&&&&&&123 (域宽为10,默认为右对齐,空白处用'&'填充)
------------4----------
123 (按照数据实际长度输出,左对齐)
------------5----------
123.5 (以一般十进制形式输出时,有效数字为4)
------------6----------
123.4568 (以fixed形式输出时,小数点占4位)
------------7----------
1.2346e+02&&&&& (用指数格式输出,域宽位10,小数占4位,用‘&’填充)
------------8----------
0x15 (十六进制形式,以0x开头)
*/
2.使用预定义的操纵符进行输入输出格式控制
使用ios类中的成员函数进行输入输出格式控制时,每个函数的调用需要写一条语句,而且
不能将它们直接嵌入到输入输出语句中去,显然使用起来不方便。C++提供了一种进行输入
输出格式控制的方法,这一方法使用了一种称之为操纵符(也称之为操作和控制符)的特殊函
数。在很多情况下,使用操纵符进行格式化控制比用ios状态标志和成员函数更方便。
所有不带形参的操纵符都定义在头文件iostream.h中,而带形参的操纵符则定义在头文件
iomanip.h,因而使用相应的操作符就必须包含相应的头文件。
表7.4 C++预定义的操作符
//在头文件iostream中:
dec 设置整数的基数为10 用于输入/输出
hex 设置整数的基数为16 用于输入/输出
oct 设置整数的基数为8 用于输入/输出
ws 跳过开头的空白部分 用于输入
endl 输出一个换行符并刷新输出流 用于输出
ends 插入一个空字符null,通常结束字符串 用于输出
flush 刷新一个输出流 用于输出
//在头文件iomanip中:
setbase(n) 设置整数的基数(0、8、10、16(0默认为十进制)) 用于输入/输出
setfill(c) 设置c为填充字节,默认为空格 用于输出
setprecision(n) 设置精度(一般十进制时,n为有效数字;有fixed时,n为小数位数) 用于输出
setw(n) 设置域宽为n 用于输出
setiosflags(f)设置由参数f指定的状态标志 用于输入/输出
resetiosflags(f) 终止由参数f指定的状态标志 用于输入/输出
操纵符setiosflags和resetiosflags要带上状态标志才能用。
表7.5 部分带有状态标志的操纵符setiosflags和resetiosflags
setiosflags(ios::left) 数据按域宽左对齐输出
setiosflags(ios::right) 数据按域宽有对齐输出
setiosflags(ios::fixed) 固定的小数点位数显示
setiosflags(ios::scientific) 设置浮点数以科学表示法(即指数形式)显示
setiosflags(ios::showbase) 在整数前加一个"+"号输出
setiosflags(ios::uppercase) 在以科学表示法格式E和十六进制输出字母时以大写字母显示
resetiosflags(f) 终止已经设置的状态标志,在括号应指定f的内容。
//例7.5 预定义的操纵符的使用方法举例
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout<<setw()<<<<<<endl;
cout<<<<setiosflags(ios::scientific)<<setiosflags(ios::uppercase)<<setw()<<123.456789<<endl;
cout<<<<setw()<<hex<<<<endl;
cout<<<<setw()<<oct<<<<endl;
cout<<<<setw()<<hex<<<<endl;
cout<<resetiosflags(ios::scientific)<<setprecision()<<123.456789<<endl;
cout<<setiosflags(ios::left)<<setfill('#')<<setw()<<<<endl;
cout<<resetiosflags(ios::left)<<setfill('$')<<setw()<<<<endl;
return ;
}
/*
程序运行结果是:
123567
123 1.234568E+02
123 7B
7B 173
173 7B
123.5
7B######
$$$$$1C8
*/
3. 使用用户自定义的操纵符进行输入输出格式控制
若为输出流定义操纵符函数,则定义格式如下:
ostream &操纵符名(ostream &stream)
{
自定义代码
return stream;
}
若为输入流定义操纵符函数,则定义格式如下:
istream &操纵符名(istream &stream)
{
自定义代码
return stream;
}
stream可以用其它的标识符。
//例7.6 用户自定义操纵符的使用办法1
#include<iostream>
#include<iomanip>
using namespace std;
ostream &output(ostream &stream)
{
stream.setf(ios::left);
stream<<setw()<<hex<<setfill('&');
return stream;
}
int main()
{
cout<<<<endl;
cout<<output<<<<endl;
return ;
}
/*
程序运行结果是:
123
7b&&&&&&&&
*/
//例7.7 用户自定义操纵符的使用办法2
#include<iostream>
#include<iomanip>
using namespace std;
istream &input(istream &in)
{
in>>hex;
cout<<"Enter number using hex formar:";
return in;
}
int main()
{
int i;
cin>>input>>i;
cout<<"hex:"<<hex<<i<<"------dec:"<<dec<<i<<endl;
return ;
}
/*
程序运行结果是:
Enter number using hex formar:23ae
hex:23ae------dec:9134
*/
7.3.1 插入运算符和提取运算符
cin>>变量; //输入
cout<<常量或变量; //输出
其实,在头文件iostream中有两组运算符函数分别对运算符">>"、"<<" 进行函数的重载。
也即: istream& operator>>(istream &类型名);
ostream& operator>>(ostream &类型名); 例如:
当系统执行 cout<<"this a oby" 的操作时,就调用了插入运算符重载函数
ostream& operator<<(ostream char*)
cout.operator<<("this a oby")
7.3.2 用户自定义类的输入输出
1、重载(输出运算符)插入运算符 <<
格式: ostream& operator<<(ostream &out, user_name &obj)
{
out<<obj.item1;
out<<obj.item2;
out<<obj.item3;
......
out<<obj.itemn;
return out;
} user_name:用户自定义的类名;
out:ostream类对象的引用,即out是输出流对象,out可以改变
item:用户自定义类型中的数据成员。
2、重载(输出运算符)插入运算符 >>
格式: istream& operator<<(istream &cin, user_name &obj)
{
cin<<obj.item1;
cin<<obj.item2;
cin<<obj.item3;
......
cin<<obj.itemn;
return cin;
} user_name:用户自定义的类名;
cin:ostream类对象的引用,即cin是输出流对象,cin可以改变
item:用户自定义类型中的数据成员。
//举例
#include<iostream>
using namespace std;
class Coord{
public:
Coord(int i=,int j=)
{
x = i;
y = j;
}
friend istream& operator>>(istream &input,Coord &ob); //声明提取运算符">>"的友元重载函数
friend ostream& operator<<(ostream &ouput,Coord &ob); //声明插入运算符"<<"的友元重载函数
private:
int x,y;
};
istream& operator>>(istream &input,Coord &ob)
{
cout<<"输入x、y的值:";
input>>ob.x;
input>>ob.y;
return input;
}
ostream& operator<<(ostream &ouput,Coord &ob)
{
cout<<"输出x、y的值:";
ouput<<ob.x<<","<<ob.y<<endl;
return ouput;
}
int main()
{
Coord a(,);
cout<<a<<endl; //operator<<(cout,a) cin>>a; //operator>>(cin,a)
cout<<a<<endl; return ;
}
C++:流类库与输入输出的更多相关文章
- C++学习笔记55:流类库与输入输出
I/O流的概念及流类库的结构 程序与外界环境的信息交换 当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象,文件对象. 流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据 ...
- 【C++ 流类库与输入输出 】实验七
1. 基础练习 (1)教材习题 11-7 (2)教材习题 11-3 (3)教材习题 11-4 2. 应用练习 (1)已知有班级名单文件 list.txt(见实验 7 附件包).编写一个应用程序实现随机 ...
- C++流类库(11)
C++的流类库由几个进行I/O操作的基础类和几个支持特定种类的源和目标的I/O操作的类组成. 流类库的基础类 ios类是isrream类和ostream类的虚基类,用来提供对流进行格式化I/O操作和错 ...
- 流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作
一.IO.流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空 ...
- C++——流类库和输入/输出
前言 数据是怎么写道磁盘的? 代码里面我们一个读写调用似乎就能将数据从磁盘读写.仿佛代码是直接和磁盘打交道.以我们最常见的笔记本.或台式机的磁盘SATA盘为例,其受南桥上ATA控制器支配,这里面传输的 ...
- ca76a_c++_流文件打开输入输出文件模式p773
/*ca76a_c++_流文件打开输入输出文件模式利用文件流打开文件进行输入与输出时的选项in.out.app(附加模式).ate((end)文件打开后,定于文件结尾).trunc(裁剪).binar ...
- I/O流的概念和流类库的结构
概念: 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 1.对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到 ...
- C++:I/O流的概念和流类库的结构
一.C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标准的输入输出,简称标准I/O. 以外存磁盘文件为对象进行输入和输出, ...
- 04737_C++程序设计_第9章_运算符重载及流类库
例9.1 完整实现str类的例子. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
随机推荐
- ORA-12154:TNS:无法解析指定的连接标识符
ORA-12154:TNS:无法解析指定的连接标识符 1问题的描述 Oracle11g server 64bit服务器端安装在Windows Server2008 Enterprise上,安装Orac ...
- c++中的virtual函数,即虚函数
c++中的虚函数主要是用来实现多态的,虽然都同时指向父类的实例.但调用的确实子类的函数,这个有点像java的接口和实现的关系了.一个接口有多种实现,一个接口对象调用的是哪个实现的方法,这个就是多态了 ...
- 设置浮点数的显示精度&precision(0)
/* 设置浮点数的显示精度 cout.precision(int)可以设置浮点数的显示精度(不包括小数点) 注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...
- SQL Server Reporting Services – Insufficient Rights Error
http://www.sql-server-performance.com/2011/security-ssrs-reporting-error/ SQL Server Reporting Servi ...
- CentOS7下通过rpm方式安装MySQL及插入中文问题解决 [原创]
一 CentOS下通过rpm方式安装MySQL CentOS版本:CentOS-7 MySQL版本:MySQL-5.6.22 在网上搜了一下,Linux下安装MYSQL有三种方式: 1) 通过yum命 ...
- 20145103 《Java程序设计》第3周学习总结
20145103 <Java程序设计>第3周学习总结 教材学习内容总结 第四章我首先了解了CPU与内存的关系,栈与堆的关系.要产生对象必须先定义类,类是对象的设计图,对象是累的实例.以类名 ...
- android 开发 socket发送会有部分乱码,串码,伴随着数据接收不完整
场景: 客户端A.B,A向B发送json字符串后紧接着发送文件,B接收到文件后才返回消息. 环境:android.使用的是原始的write 和read (若使用的是writeUTF不会出现此问题.)需 ...
- 05.Hibernate多对多关联
前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teac ...
- bzoj 3295 树套树
比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理 出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多 /******************** ...
- 【BZOJ】【3207】花神的嘲讽计划 I
字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首 ...