数据输入输出

C++的输入输出功能是由函数来实现的,例如putchar(输出字符),getchar(输入字符),cin(输入流),cout(输出流)等。

putchar函数(字符输出函数)的作用是向终端输出一个字符。例如:

    putchar(c);       //输出字符变量C的值

请看下例:

1 //putchar函数的使用
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  char a='A',b='B',c='C';
8  putchar(a);
9  putchar(b);
10  putchar(c);
11  system("pause");
12  return 0;
13 }

运行结果为ABC。

我们可以用putchar()函数输出控制字符,如putchar('\n')输出一个换行符。

还可以输出其他转义字符,如:

    putchar (' \101 ');      //输出字符'A'
    putchar (' \\ ');    //输出斜杠
    putchar (' \015 ');   //输出回车,不换行,使输出的当前位置移到本行开头

getchar函数(字符输入函数)的作用是从终端输入一个字符,其一般形式为getchar()。例如:

1 //使用getchar函数输入单个字符
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  char c;
8  c=getchar();
9  putchar(c);
10  system("pause");
11  return 0;
12 }

在运行时,如果从键盘输入字符'a'并按回车键,就会在屏幕上看到输出的字符'a'。

请注意:getchar()只能接收一个字符,接收的字符可以赋给字符变量或整型变量也可以不赋给任何变量。如:

    putchar(getchar());

puts()

向屏幕输出字符串并换行。

gets()

从键盘获得字符串,回车不算字符串。

某些情况下,程序需要以八进制或十六进制数的形式输出结果。C++提供了简单的实现方法:只要在输出流中输出操作符dec(十进制)、oct(八进制)或hex(十六进制)即可,下面的程序分别以十进制、八进制、十六进制输出n的值。

1 //进制转换
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  int n=314;
8  cout<<"十进制: "<<dec<<n<<endl;
9  cout<<"八进制: "<<oct<<n<<endl;
10  cout<<"十六进制:"<<hex<<n<<endl;
11  system("pause");
12  return 0;
13 }

表1.6是常用的I/O流类库操作符,注意,设置一些特殊的格式时,我们还需使用I/O流类库提供的操纵符。使用操纵符时,首先必须在源程序的开头包含iomanip。

表1.6

一旦使用了这些进制操作符,它们的作用域将一直持续到程序结束,或者遇到另一个进制操作符为止。

C++提供的setw操作符可以指定每个数值占用的宽度。为了使用setw,程序必须包括头文件iomanip,setw操作符只对紧跟着它的数值有效。如果要为多个数值设定宽度,必须多次使用setw操作符。

分析以下程序的执行结果。

1 //setw操作符的使用
2 #include <iostream>
3 #include <iomanip>
4 using namespace std;
5
6 int main()
7 {
8  double a=234.34;
9  cout<<setw(10)<<1234567890<<endl;
10  cout<<setw(4)<<a<<endl;
11  cout<<setw(6)<<a<<endl;
12  cout<<setw(8)<<a<<endl;
13  cout<<setw(10)<<a<<endl;
14  system("pause");
15  return 0;
16 }

使用right或left可以控制字符串向左靠齐还是向右靠齐。例如:

    cout<<left;

C++提供的setprecision操作符可以控制浮点数的输出精度,其中的参数代表输出的浮点数的个数。为了使用该操作符,程序必须包括头文件iomanip。

分析以下程序的执行结果。

1 //setprecision用法
2 #include <iostream>
3 #include <iomanip>
4 using namespace std;
5 
6 int main()
7 {
8  double a=234.1234567890;
9  cout<<a<<endl;
10  cout<<setprecision(4)<<a<<endl;
11  cout<<setprecision(5)<<a<<endl;
12  cout<<setprecision(6)<<a<<endl;
13  cout<<setprecision(7)<<a<<endl;
14  cout<<setprecision(8)<<a<<endl;
15  cout<<setprecision(9)<<a<<endl;
16  cout<<setprecision(15)<<a<<endl;
17  system("pause");
18  return 0;
19 }

一旦使用了这些setprecision操作符,它的作用域将一直持续到程序结束,或者遇到另一个setprecision操作符为止。

单纯使用setprecision()函数,并不能精确控制小数点后保留多少位,而是将整数与小数加起来的位数,如果仅仅控制小数点后的位数,需加fixed函数。见下例:

1 //fixed函数的使用
2 #include <iostream>
3 #include <iomanip>
4 using namespace std;
5
6 int main()
7 {
8  float a=111.223333;
9  cout<<setprecision(6)<<fixed<<a<<endl;
10  system("pause");
11  return 0;
12 }

C++提供的setfill操作符可以填充字符。为了使用该操作符,程序必须包括头文件iomanip。

分析以下程序的执行结果。

1 //setfill用法
2 #include <iostream>
3 #include <iomanip>
4 using namespace std;
5
6 int main()
7 {
8  double a=234.123;
9  cout<<a<<endl;
10  cout<<setw(10)<<setfill('*')<<setprecision(4)<<a<<endl;
11  cout<<setw(10)<<setprecision(10)<<a<<endl;
12  system("pause");
13  return 0;
14 }

也可以直接使用cout的相关函数如precision、width、fill和put等函数。

分析以下程序的运行结果。

1 //输出控制
2 #include <iostream>
3 #include <iomanip>
4 using namespace std;
5 
6 int main()
7 {
8  double a=234.123456;
9  cout<<a<<endl;
10  cout.precision(7);
11  cout<<a<<endl;
12  cout.width(8);
13  cout<<a<<endl;
14  cout.fill('*');
15  cout.width(10);
16  cout.precision(5);
17  cout<<a<<endl;
18  system("pause");
19  return 0;
20 }

put函数用于输出字符,put可以级联,如put('a').put('b')。

请看下面的程序:

1 //put级联
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  cout.put('C').put('+').put('+').put('\n');
8  system("pause");
9  return 0;
10 }

C++提供了输入流cin,可以利用输入流cin读取键盘输入的字符和数字等。我们可以使用I/O操作符控制输入的格式。

请看下面的程序:

1 //输入格式控制
2 #include <iostream>
3 using namespace std;
4 
5 int main()
6 {
7  int a,b,c;
8  cout<<"a:";cin>>dec>>a;
9  cout<<"b:";cin>>oct>>b;
10  cout<<"c:";cin>>hex>>c;
11  cout<<"a="<<a<<endl;
12  cout<<"b="<<b<<endl;
13  cout<<"c="<<c<<endl;
14  system("pause");
15  return 0;
16 }

cin提供了get成员函数从指定的数据流中输入一个字符,并返回这个字符作为函数调用的值。

请看下面的程序:

1 //get成员函数的使用
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  char c;
8  c=cin.get();
9  cout<<"c:"<<c<<endl;
10  cout<<"ASCII:"<<(int)c<<endl;
11  system("pause");
12  return 0;
13 }

cin提供了getline函数,其格式为:getline(字符串首地址,最大长度);用于将用户输入的字符串存放在“字符串首地址”指定的内存中,其最大长度不能超过“最大长度”指定的值。该函数的一个用处是可以读入一行带空格的字符串,当然gets()函数也能达到同样效果。

下面的程序是输入一个字符序列(最大长度不超过80)并输出:

1 //getline的使用
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  char a[80];
8  cin.getline(a,80);
9  cout<<a<<endl;
10  system("pause");
11  return 0;
12 }

我看附录中C语言的输入输出语句,即scanf和printf也完全可以完成以上的格式控制,而且还特别好用,速度也非常快。

建议在大批量读写数据时,使用C语言的输入输出语句。

【上机实践】 格式练习

编写一个程序,按以下格式输出数据,其中姓名部分宽度为8,左靠齐,第2列数据宽度为10,左靠齐,第3列数据格式宽度为10,右靠齐:

张三 345.5—— ***34345.4

李四 342.2—— *****123.5

刘强 556.6—— *343434.55