c++tutorial(六)

基本输入/输出

前面部分的示例程序提供了与用户的很少交互,如果有的话。它们只是在屏幕上打印简单值,但标准库提供了许多通过其输入/输出功能与用户交互的其他方法。本节将简要介绍一些最有用的内容。

C ++使用一种称为流的方便抽象来在顺序媒体(如屏幕,键盘或文件)中执行输入和输出操作。流是一个程序可以插入或提取字符的实体。无需了解与流相关的媒体或其任何内部规范的详细信息。我们需要知道的是,流是字符的源/目的地,并且这些字符是顺序提供/接受的(即,一个接一个地)。

标准库定义了一些流对象,可用于访问程序运行环境中被视为字符的标准源和目标的内容:

流	描述
cin	标准输入流
cout	标准输出流
cerr	标准错误(输出)流
clog	标准日志记录(输出)流

我们将详细只看到cout和cin(标准输出和输入流); cerr并且clog也是输出流,因此它们基本上是一样的cout,唯一的区别是它们为特定目的识别流:错误消息和记录; 在许多情况下,在大多数环境设置中,它们实际上完全相同:它们在屏幕上打印,尽管它们也可以单独重定向。

标准输出(cout)
在大多数程序环境中,默认情况下标准输出是屏幕,并且定义为访问它的C ++流对象是cout。

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

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

所述<<操作者将它后面到它前面的流的数据。在上面的示例中,它将文字字符串Output sentence,数字120和变量值x插入到标准输出流中cout。请注意,第一个语句中的句子用双引号(")括起来,因为它是一个字符串文字,而在最后一个中x则不是。双引号是造成差异的原因; 当文本被包含在它们之间时,文本按字面打印; 当它们不是时,文本被解释为变量的标识符,而是打印其值。例如,这两个句子的结果非常不同:

cout << "Hello";  // prints Hello
cout << 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:
cout <<“这是一个句子。”;
cout <<“这是另一句话。”;

输出将在一行中,两者之间没有任何换行符。类似于:

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’coutendl’\n’

标准输入(cin)
在大多数程序环境中,默认情况下标准输入是键盘,而定义为访问它的C ++流对象是cin。

对于格式化的输入操作,cin与提取操作符一起使用,该操作符被写为>>(即,两个“大于”符号)。然后,该运算符后跟存储提取数据的变量。例如:

int age;
cin >> age;

第一个语句声明一个int被调用类型的变量,第二个语句age从cin一个值中提取要存储在其中。此操作使程序等待输入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;
}

请输入一个整数值:702
您输入的值为702,其双精度值为1404。
编辑并运行

正如您所看到的,从中提取cin似乎使得从标准输入获取输入的任务变得非常简单和直接。但这种方法也有很大的缺点。如果用户输入了无法解释为整数的其他内容,上面的示例会发生什么?那么,在这种情况下,提取操作失败。默认情况下,这使程序继续运行而不设置变量i值,如果i稍后使用该值,则会产生未确定的结果。

这是非常糟糕的程序行为。无论用户类型如何,大多数程序都应以预期的方式运行,并适当地处理无效值。只有非常简单的程序才能依赖直接提取的值cin而无需进一步检查。过了一会儿,我们会看到如何stringstreams可用于更好地控制用户输入。
提取cin也可以链接在一个语句中请求多个数据:

cin >> a >> b;

这相当于:

cin >> a;
cin >> b;

在这两种情况下,用户都需要引入两个值,一个用于变量a,另一个用于变量b。任何类型的空间用于分隔两个连续的输入操作; 这可以是空格,制表符或换行符。

cin和字符串
提取运算符可用于cin获取与基本数据类型相同的字符串:

string mystring;
cin >> mystring;

但是,cin提取总是将空格(空格,制表符,换行符…)视为终止要提取的值,因此提取字符串意味着始终提取单个单词,而不是短语或整个句子。

为了获得整行cin,有一个函数,称为getline,将stream(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;
}

你叫什么名字?荷马辛普森
你好荷马辛普森。
你最喜爱的队伍是什么?同位素
我也喜欢The Isotopes!
编辑并运行

请注意,在两次调用中getline,我们使用相同的字符串标识符(mystr)。程序在第二次调用中所做的只是将之前的内容替换为引入的新内容。

大多数用户期望从控制台程序获得的标准行为是,每次程序向用户查询输入时,用户都会引入该字段,然后按ENTER(或RETURN)。也就是说,通常期望输入根据控制台程序上的行发生,并且这可以通过使用getline来获得来自用户的输入来实现。因此,除非你有充分的理由不这样做,否则你应该总是使用getline在控制台程序中获取输入而不是从中提取cin。

字符串流
标准头定义了一种类型,称为stringstream允许将字符串视为流,从而允许从/向字符串提取或插入操作的方式与执行cin和执行相同cout。此功能对于将字符串转换为数字值非常有用,反之亦然。例如,为了从字符串中提取整数,我们可以写:

string mystr (“1204”);
int myint;
stringstream(mystr) >> myint;

这声明了一个string初始化为值的值"1204"和一个类型的变量int。然后,第三行使用此变量stringstream从字符串构造中提取。这段代码将数值存储在1204名为的变量中myint。

// stringstreams
#include
#include
#include
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;
}

输入价格:22.25
输入数量:7
总价:155.75
编辑并运行

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

通过这种获取整行和提取内容的方法,我们将获取用户输入的过程与其作为数据的解释分开,允许输入过程成为用户期望的过程,同时获得对其转换的更多控制。通过程序将内容转换为有用的数据。

猜你喜欢

转载自blog.csdn.net/qit1314/article/details/85033825