c++教程(六:Basic Input/Output)

来源:互联网 发布:数据分析师自学可以吗 编辑:程序博客网 时间:2024/05/16 07:07

————————————————————————

该系列教程为翻译c++官方教程,点击参考英文原版,水平有限,翻译不通之处敬请谅解!

————————————————————————

基本输入/输出

在前面章节的实例中很少提供用户交互,如果有,也只是在屏幕上显示简单的值。但标准库通过其输入/输出功能提供了很多附加的用户交互方式。本节将简要介绍一些最有用的。

C ++在执行输入和输出操作时使用一种称为流的方法方便与屏幕、键盘等交互。流是一个实体,程序可以通过流输入或输出内容。我们没有必要知道关于流内部规定的信息。我们需要知道的是,流只是字符能交互的源头,而这些字符也是可以单独提供/接受的(即一个接一个)。

标准库定义了一些可用于访问被认为是标准的源和目标程序运行所在的环境流对象:

stream description cin standard input stream cout standard output stream cerr standard error (output) stream clog standard logging (output) stream

我们将看到更详细的cout和cin(标准输出和输入流);cerr和clog也输出流,他们基本上像cout,所不同的是,他们只为错误消息和日志制定的特定目的流;在许多情况下,在大多数的环境设置中,他们做同样的事情,即打印在屏幕上,虽然也可以单独重定向。

标准输出流(cout)

在大多数程序中,默认情况下,标准输出的对象是屏幕,对应于C++流对象是cout。

格式化输出操作,cout和插入运算符一起使用,写作<<(即两个“小于”号)。

cout << "Output sentence"; // prints Output sentence on screencout << 120;               // prints number 120 on screencout << x;                 // prints the value of x on screen  

<< 操作符流用于输出其后的数据,将其插入到前面的输出流中。在上面的例子中,它插入字符串“output sentence”输出,数字120以及变量X的值到标准输出流cout中。注意,在第一个语句中的语句需要用双引号(”“)包含,因为它是一个字符串,而在最后一个不是(是一个变量)。双重引用使得这两者之间存在着区别;当文本存在双引号中时,这只是当作文本输出;而不用双引号包含时,文本就被认为一个变量,这样输出的是它的值。例如,下面这两个语句有非常不同的结果:

cout << "Hello";  // prints Hellocout << Hello;    // prints the content of variable Hello 

多个输出流可以以一个链输出:

cout << "This " << " is a " << "single C++ statement"

上述输出为“This is a single C++ statement”

链接插入在混合文本和变量输入特别有用;

cout << "I am " << age << " years old and my zipcode is " << zipcode;

假设age变量的值是24,zipcode变量的值是90064,那么上述的输出就是:

I am 24 years old and my zipcode is 90064 

上述文本输出不会在末尾自动换行,除非结构上需要换行。例如使用两个cout流输出:

cout << "First sentence.\n";cout << "Second sentence.\nThird sentence."

输出将会在一行上,中间不会中断,输出像下面这样:

This is a sentence.This is another sentence. 

为了插入一个换行符,使得换行符被插入的位置要间断 。在C++中,一个新的标识符可以用\n(即反斜杠字符后跟一个小写字母n)。例如:

cout << "First sentence.\n";cout << "Second sentence.\nThird sentence.";

那么输出为:

First sentence.Second sentence.Third sentence.

另一种方式是在输出末尾使用endl结束符,例如:

cout << "First sentence." << endl;cout << "Second sentence." << endl;

将会输出:

First sentence.Second sentence.

endl操作符和 \n 的效果一样会产生新的一行;但它也有一个额外的作用:输出流的缓冲区(如果有的话)被刷新。这意味着输出流需要物理上的重新写入。这主要影响全缓冲流,cout(一般)没有全部缓冲流。所以,缓冲流将是一个特征时使用endl通常是一个好的方法,而’\n’不好。注意的是,缓冲流会带来一定的开销,并且可能产生延迟。

标准输入流(cin)

在大多数编程环境下,标准输入一般是键盘,c++的输入操作通过cin实现:

对于一个输入操作,cin通过和操作符>>(两个大于号)一起实现输入,这个擦平佐夫就实现了对于一个输入变量的储存。例如:

int age;cin >> age;

第一句声明一个int型的变量age,第二句输入一个数值存放在变量age中。cin这个操作使得程序等待着输入。一般来说这就意味着程序需要用户从键盘上输入一些内容。在这种情况下需要注意的是,只有在键盘按下enter(或者return)时键盘输入。一旦cin输入的操作声明,那么程序等待着输入直到被输入数据为止。

使用cin对变量进行提取操作,使用>>操作符以确定它如何解释从输入读取的字符;如果它是一个整数,输入的格式则是一个序列的数字,如果是字符的序列,则为字符串等,比如:

// i/o example#include <iostream>using namespace std;int main (){  int i;  cout << "Please enter an integer value: ";  cin >> i;  cout << "The value you entered is " << i;  cout << " and its double is " << i*2 << ".\n";  return 0;}

可以看到,从标准输入cin可以完成非常简单明了的获取输入任务。但这种方法也有一个很大的缺点。如果用户输入其他不能被解释的东西,上面的例子会发生什么?在这种情况下,提取操作失败。例如如果不设置变量i的值,默认情况下程序会继续执行,如果使用该值i后,会产生不确定的结果。

这样的程序结果很不好。不管用户输入类型是什么,大多数程序处理无效的值都会以预期的方式表现。只有非常简单的程序会直接提取cin而没有进一步的检查。稍后我们将看到如何使用stringstream可以更好地控制用户输入。

cin也可以以链状形式允许不止输入一个单独的表述。

cin >> a >> b;

这等价于:

cin >> a;cin >> b;

在这两种情况下,用户将输入2个值,一个变量a,另一个变量b。任何类型的空间都可以用来分隔两个连续的输入操作,这可以是一个空格键,一个tab键,或新的一行。

cin 和 strings

可以用cin输入一系列字符串操作,可以使用基本数据类型string;

string mystring;cin >> mystring;

然而,cin输入总是需要考虑空格(tab键,新的一行)作为终止一个字符的操作,因此也就意味着这样只能输入单个单词,而不是一个句子或者段语。

为了将整行输入到cin中,可以使用这样一个函数:getline。这时将cin作为第一个参数输入,字符串变量作为第二个变量。例如:

// cin with strings#include <iostream>#include <string>using namespace std;int main (){  string mystr;  cout << "What's your name? ";  getline (cin, mystr);  cout << "Hello " << mystr << ".\n";  cout << "What is your favorite team? ";  getline (cin, mystr);  cout << "I like " << mystr << " too!\n";  return 0;}

注意,在调用的时候,我们使用相同的字符串标识符(mystr)。在二次调用中所做的程序只是简单地替换了以前的内容,引入了新的内容。

Stringstream

标准头文件< sstream >定义了一个被称为stringstream的类型符,允许字符串被视为流操作进行字符的提取或插入操作,这种方式就好比是cin和cout操作一样。这个方式最有用的特征是字符串转换为数值或者相反。例如,我们为了从字符串中提取整数:

string mystr ("1204");int myint;stringstream(mystr) >> myint;

这里声明和初始化一个字符串的值“1204”,和一个int类型的变量。然后第三行使用这个变量提取stringstream的字符串。这段代码使得变量存储数值1204。

// stringstreams#include <iostream>#include <string>#include <sstream>using namespace std;int main (){  string mystr;  float price=0;  int quantity=0;  cout << "Enter price: ";  getline (cin,mystr);  stringstream(mystr) >> price;  cout << "Enter quantity: ";  getline (cin,mystr);  stringstream(mystr) >> quantity;  cout << "Total price: " << price*quantity << endl;  return 0;}

在这个例子中,我们间接从标准输入获得数值,而不是直接从cin提取数值。我们从中获得成一个字符串对象(mystr)。然后从这个字符串中提取值变量价格和数量。一旦获得这些数值,可以执行算术运算,如将它们相乘获得一个总价格。

使用这种方法的整个思路和提取它们的内容,我们分开的过程从其解释用户输入数据,允许用户输入过程预计,同时获得更多的控制其内容转换成有用的数据的程序。

0 0
原创粉丝点击