初入c++ (八) c++输入和输出

1.基础知识

C++输入输出包含以下三个方面的内容:
1.对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
2.以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
3.对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。

输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(Stream)。
在C++中,输入输出流被定义为类。C++的I/O库中的类称为流类(stream class)。 用流类定义的对象称为流对象。
用流类定义的对象称为流对象。其实,cout和cin并不是C++语言中提供的语句,它们是iostream类的对象。

表13.1 I/O类库中的常用流类
类名 作用 在哪个头文件中声明
ios抽象基类iostream
istream
ostream
iostream
通用输入流和其他输入流的基类
通用输出流和其他输出流的基类
通用输入输出流和其他输入输出流的基类
iostream
iostream
iostream
ifstream
ofstream
fstream
输入文件流类
输出文件流类
输入输出文件流类
fstream
fstream
fstream
istrstream
ostrstream
strstream
输入字符串流类
输出字符串流类
输入输出字符串流类
strstream
strstream
strstream
各个类有以下的 这总关系


图 13.2

说明:
ostream operator << (char * );  //用于向输出流插入一个字符串数据等。
如果在程序中有下面的表达式:   cout<<"C++“;(最常用到的语句)     实际上相当于:  cout.operator <<("C++"


 与iostream类库有关的头文件

iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。
可以换 —种说法:头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。
常用的有:
1.iostream  包含了对输入输出流进行操作所需的基本信息。
2.fstream  用于用户管理的文件的I/O操作。
3.strstream  用于字符串流I/O。
4.stdiostream  用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序。
5.iomanip  在使用格式化I/O时应包含此头文件

iostream.h包含了对输入输出流进行操作所需的基本信息。因此大多数C++程序都包括iostream.h。在iostream.h头文件中不仅定义了有关的类,还定义了4种流对象, 见表13.2。

表13.2 文件中定义的4种流对象
对象 含义 对应设备 对应的类 c语言中相应的标准文件
cin标准输入流键盘istream_withassignstdin
cout标准输出流屏幕ostream_withassignstdout
cerr标准错误流屏幕ostream_withassignstderr
clog标准错误流屏幕ostream_withassignstderr
在iostream头文件中定义以上4个流对象用以下的形式(以cout为例):
    ostream cout ( stdout);
在定义cout为ostream流类对象时,把标准输出设备stdout作为参数,这样它就与标准输出设备(显示器)联系起来,如果有
    cout <<3;
就会在显示器的屏幕上输出3

2.C++标准输出流

1.cout流对象:
cout是console output的缩写,意为在控制台(终端显示器)的输出
2.cerr流对象:
cerr流对象是标准错误流,cerr流已被指定为与显示器关联。cerr的作用是向标准错误设备(standard error device)输出有关出错信息。
cerr与标准输出流cout的作用和用法差不多。
但有一点不同:cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出
3.clog流对象:
clog流对象也是标准错误流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。
区别:cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。

3.C++格式化输出,C++输出格式控制

先看一个代码
#include <iostream>
#include <iomanip>//不要忘记包含此头文件
using namespace std;
int main()
{
   int a;
   cout<<"input a:";
   cin>>a;
   cout<<"dec:"<<dec<<a<<endl;  //以十进制形式输出整数
   cout<<"hex:"<<hex<<a<<endl;  //以十六进制形式输出整数a
   cout<<"oct:"<<setbase(8)<<a<<endl;  //以八进制形式输出整数a
   char *pt="China";  //pt指向字符串"China"
   cout<<setw(10)<<pt<<endl;  //指定域宽为,输出字符串
   cout<<setfill('*')<<setw(10)<<pt<<endl;  //指定域宽,输出字符串,空白处以'*'填充
   double pi=22.0/7.0;  //计算pi值
   //按指数形式输出,8位小数
   cout<<setiosflags(ios::scientific)<<setprecision(8);
   cout<<"pi="<<pi<<endl;  //输出pi值
   cout<<"pi="<<setprecision(4)<<pi<<endl;  //改为位小数
   cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;  //改为小数形式输出
   return 0;
}

用流对象的成员函数控制输出格式

除了可以用控制符来控制输出格式外,还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数见表13.4。

表13.4 用于控输出格式的流成员函数
流成员函数 与之作用相同的控制符 作用
precision(n)setprecision(n)设置实数的精度为n位
width(n)setw(n)设置字段宽度为n位
fill(c)setfill(c)设置填充宇符c
setf()setiosflags()设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中的内容相同,如表13.5所示
unsetf()resetioflags()终止已设置的输出格式状态,在括号中应指定内容

流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“::”。格式标志见表13.5。

表13.5 设置格式状态的格式标志
格式标志 作用
ios::left输出数据在本域宽范围内向左对齐
ios::right输出数据在本域宽范围内向右对齐
ios::internal数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充
ios::dec设置整数的基数为10
ios::oct设置整数的基数为8
ios::hex设置整数的基数为16
ios::showbase强制输出整数的基数(八进制数以0打头,十六进制数以0x打头)
ios::showpoint强制输出浮点数的小点和尾数0
ios::uppercase在以科学记数法格式E和以十六进制输出字母时以大写表示
ios::showpos对正数显示“+”号
ios::scientific浮点数以科学记数法格式输出
ios::fixed浮点数以定点格式(小数形式)输出
ios::unitbuf每次输出之后刷新所有的流
ios::stdio每次输出之后清除stdout, stderr


控制符是在头文件iomanip中定义的,因此用控制符时,必须包含iomanip头文件。

4.用C++流成员函数put输出单个字符

#include <iostream>
using namespace std;
int main( )
{
   char *a="BASIC";//字符指针指向'B'
   for(int i=4;i>=0;i--)
      cout.put(*(a+i));                  //从最后一个字符开始输出
   cout.put('\n');
   return 0;
}

5.C++ get()函数读入一个字符

1) 不带参数的get函数
其调用形式为
    cin.get()
用来从指定的输入流中提取一个字符(包括空白字符),函数的返回值就是读入的字符。 
若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考虑到不与字符的ASCII代码混淆,
但不同的C ++系统所用的EOF值有可能不同。
#include <iostream>
using namespace std;
int main( )
{
   int c;
   cout<<"enter a sentence:"<<endl;
   while((c=cin.get())!=EOF)
      cout.put(c);
   return 0;
}
2) 有一个参数的get函数
其调用形式为
    cin.get(ch)
其作用是从输入流中读取一个字符,赋给字符变量ch。如果读取成功则函数返回true(真),如失败(遇文件结束符) 则函数返回false(假)。

#include <iostream>
using namespace std;
int main( )
{
   char c;
   cout<<"enter a sentence:"<<endl;
   while(cin.get(c))  //读取一个字符赋给字符变量c,如果读取成功,cin.get(c)为真
   {cout.put(c);}
   cout<<"end"<<endl;
   return 0;
}
3) 有3个参数的get函数
其调用形式为
    cin.get(字符数组, 字符个数n, 终止字符)

    cin.get(字符指针, 字符个数n, 终止字符)
其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),
如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回true(真),如失败(遇文件结束符) 则函数返回false(假)
#include <iostream>
using namespace std;
int main( )
{
   char ch[20];
   cout<<"enter a sentence:"<<endl;
   cin.get(ch,10,'\\n');//指定换行符为终止字符
  cout<<ch<<endl;
   return 0;
}

6.C++ getline()函数读入一行字符

#include <iostream>
using namespace std;
int main( )
{
   char ch[20];
   cout<<"enter a sentence:"<<endl;
   cin>>ch;
   cout<<"The string read with cin is:"<<ch<<endl;
   cin.getline(ch,20,'/');  //读个字符或遇'/'结束
   cout<<"The second part is:"<<ch<<endl;
   cin.getline(ch,20);  //读个字符或遇'/n'结束
   cout<<"The third part is:"<<ch<<endl;
   return 0;
}
程序运行情况如下:
enter a sentence: I like C++./I study C++./I am happy.↙
The string read with cin is:I
The second part is: like C++.
The third part is:I study C++./I am h
请思考为什么会这么输出?

7.一些与输入有关的istream类成员函数

peek函数
peek是“观察”的意思,peek函数的作用是观测下一个字符。其调用形式为:
    c=cin.peek( );
函数的返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。


putback函数
其调用形式为
    cin.putback(ch);
其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。


ignore函数
其调用形式为
    cin.ignore(n, 终止字符)
函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。如
    ighore(5, 'A')  //跳过输入流中个字符,遇'A'后就不再跳了
也可以不带参数或只带一个参数。如
    ignore( )  // n默认值为,终止字符默认为EOF
相当于
    ignore(1, EOF)
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值