输出流
C++的类ostream提供了格式化输出和无格式输出的功能
输出功能包括
- 用流插入运算符输出标准类型的数据;
- 用成员函数put输出字符;
- 成员函数write的无格式化输出;
- 输出特定形式数值
1.标准类型的数据用流插入运算符<<输出
格式:
cout << 数据项 ;
C++能自动判别数据类型,并根据数据类型解释内存单元的信息,把它转换成字符显示在显示器上。
注意:
1.c++中地址用十六进制输出。
2.如果输出的指针变量是一个指向字符的指针时,C++并不输出该指针中保存的地址,而是输出该指针指向的字符串。如果确实想输出这个指向字符的指针变量中保存的地址值,可以用强制类型转换,将它转换成void*类型。
#include <iostream>
using namespace std;
int main()
{ char *ptr = "abcdef";
cout << "ptr指向的内容为: " << ptr << endl;//会输出字符串
cout << "ptr中保存的地址为:" << (void*)ptr //是一个通配的指针类型,可以输出字符串地址
<< endl;
return 0;
}
2.用成员函数put输出字符
cout.put(‘A’); // 将一个字符A显示在屏幕上,并返回当前对象。
用成员函连续调用put函数: cout.put(‘A’).put(‘\n’);// 该语句在输出字符A后输出一个换行符。圆点运算符(.)从左向右结合。
cout.put(65); //用ASCII码值表达式调用put函数,语句也输出字符A。
3.write的无格式输出
basic_ostream<charT,traits>& write(const char_type* s,streamsize n);//模板原型
调用成员函数write可实现无格式输出。不管数据类型,传给它的是字节流,看成字符数组,把每个字节解释成字符。它有两个参数。第一个参数提供了要显示的字符串的地址,第二个参数指出要显示多少个字节,是一个整型值。这个函数把一定量的字节从字符数组中输出。这些字节都是未经任何格式化的,仅仅是以原始数据形式输出。
char buffer[] =“HAPPY BIRTHDAY”;
cout.write(buffer, 10 );// 输出buffer的10个字节
cout.write(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”, 10);// 显示了字母表中的前10个字母。
输入流
1.流读取运算符 >>
输入流最常用的操作是流读取运算符。
- 流读取运算符通常会跳过输入流中的空格、tab键、换行符等空白字符
- 当遇到输入流中的文件结束符时,流读取运算符返回0(false);否则,流读取运算符返回对调用该运算符的对象的引用
- 流读取运算符在读入EOF时返回0的特性使得它经常被用作为循环的判别条件,以避免选择特定的表示输入结束的值
- EOF在各个系统中有不同的表示。在windows中是Ctrl+z
2.成员函数read()
read函数和ostream中的write函数相对应,write可以实现无格式输出,这里read函数可以实现无格式输入,把输入看出是字符的形式不管你输入流的每个字符是什么含义包括空格字符,都统统将每个输入看出是一个字符,如输入“0 1 2”是输入了三个字符,放在一个字符数组里边。
read函数它有两个参数。第一个参数是一个指向字符的指针,第二个参数是一个整型值。这个函数把一定量的字节从输入缓冲区读入字符数组,不管这些字节包含的是什么内容
char buffer[80] ;
cin.read(buffer, 10 );//读入10个字节,放入buffer
注:如果还没有读到指定的字符数,遇到了EOF,则读操作结束。此时可以用成员函数gcount统计输入的字符个数。
例子:
#include <iostream>
using namespace std;
int main()
{char buffer[ 80 ];
cout << "Enter a sentence:\n";
cin.read( buffer, 20 );
cout << "\nThe sentence entered was:\n";
cout.write( buffer, cin.gcount() );//gcount()函数可以统计输入了多少个有效字符
cout << endl;
cout << "一共输入了" << cin.gcount() << "个字符\n";
return 0;
}
//输出结果
输出结果:Enter a sentence:
Using the read, write, and gcount member functions
The sentence entered was:
Using the read,write
一共输入了 20个字符
3.get函数和getline函数
使用>>没办法读入空白字符、换行等特殊字符,而get函数和getline函数能够读取任意的字符
get函数用于读入字符或字符串、getline函数用于读取字符串
3.1get函数
有三种格式:不带参数、带一个参数、带三个参数
- 不带参数的get函数
不带参数的get函数从当前输入对象流中读入一个字符,包括空白字符以及表示文件结束的EOF字符,并将读入值作为函数的返回值返回。
while((ch=cin.get())!=EOF)
cout<<ch; //将输入的字符回显在显示器上,直到输入EOF
- 带一个参数的get函数
带一个字符类型的引用参数,它将输入流中的下一字符(包括空白字符)存储在参数中,它的返回值是当前对象的引用。
- 带三个参数的get成员函数
参数分别是接收字符的字符数组、字符数组的大小和分隔符(默认值为‘\n’)。函数结束:(1)在读取比指定的最大字符数少一个字符后结束,(2)在遇到分隔符时结束。
为使字符数组(被程序用作缓冲区)中的输入字符串能够结束,空字符会被插入到字符数组中。函数不把分隔符放到字符数组中,但是分隔符仍然会保留在输入流中。
//1.要输入一行字符,可用下列语句:
cin.get(ch, 80, ’\n’);
//或
cin.get(ch, 80);
//2.要输入一个以句号结尾的句子,可用下面的语句:
cin.get(ch, 80, ’.’);
当遇到输入结束符时,程序插入一个’\0’作为输入字符串的结束标记,输入结束符没有放在字符数组中,而是保留在输入流中,下一个和输入相关的语句会读入这个输入结束符。如下面句子:
cin.get(ch, 80, ’.’);
// 用户输入
abcdef.↙
则ch中保存的是字符串“abcdef”,而“.”仍保留在输入缓冲区中。如果继续调用 cin.get(ch1); 或 cin >> ch1 ; 则字符变量ch1中保存的是“.”
3.2getline函数
与带三个参数的get函数类似,它读取一行信息到字符数组中,然后插入一个空字符。所不同的是,getline要去除输入流中的分隔符(即读取字符并删除它),但是不把它存放在字符数组中。
设置整型数的基数
输入输出流中的整型数默认为十进制表示。为了使流中的整型数不局限于十进制,可以插入hex操纵符将基数设为十六进制,插入oct操纵符将基数设为八进制,也可以插入dec操纵符将基数重新设为十进制
也可以通过流操纵符setbase来改变流的基数。该操纵符有一个整型参数,它的值可以是16,10或8,表示将整型数的基数设为十六进制,十进制或八进制
使用任何带参数的流操纵符,都必须包含头文件iomanip。
流的基数值只有被显式更改时才会变化,否则一直沿用原有的基数。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ int n;
cout << "Enter a octal number: ";
cin >> oct >> n;
cout << "octal " << oct << n
<< " in hexdecimal is:" << hex << n << '\n' ;
cout << "hexdecimal " << n
<< " in decimal is:" << dec << n << '\n' ;
cout << setbase(8) << "octal " << n
<<" in octal is:" << n << endl;
return 0;
}
//输出为
Enter a octal number: 30
Octal 30 in hexdecimal is: 18
Hexdecimal 18 in decimal is: 24
Octal 30 in octal is: 30
设置浮点数精度
设置浮点数的精度(即,实型数的有效位数)可以用(1)流操纵符setprecision、(2)基类ios的成员函数precision来实现。一旦调用了这两者之中的某一个,将影响所有输出的浮点数的精度,直到下一个设置精度的操作为止。这个操纵符和成员函数都有一个参数,表示有效位数的长度。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ double x = 123.456789, y = 9876.54321;
for (int i = 9; i > 0; --i)
{ cout.precision(i); //设置输出精度
cout << x << '\t' << y << endl; }
// 或 for (int i = 9; i > 0; --i)
// cout << setprecision(i) << x << '\t' << y << endl;
return 0;
}
//输出结果
执行结果:
123.456789 9876.54321
123.45679 9876.5432
123.4568 9876.543
123.457 9876.54
123.46 9876.5
123.5 9877
123 9.88e+003
1.2e+002 9.9e+003
1e+002 1e+004