基本输入/输出

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

C ++使用一种称为方便抽象 在顺序介质执行输入和输出操作,如屏幕,键盘或一个文件。一个 是一个实体,其中程序可以插入或提取字符/从。没有必要知道相关联的流或任何其内部规格的媒体的信息。所有我们需要知道的是,流是字符的源/目的,而这些角色提供/接受顺序(即一个接一个)。

标准库定义了可以被用来访问该程序运行,其中什么被认为是由环境的字符的标准源和目的地流对象的少数:

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

我们将详细只能看到 coutcin(标准输出和输入流);  cerr并且 clog也输出流,所以他们的工作原理实质上一样 cout,唯一的不同是它们识别流为特定目的:错误消息和记录; 其中,在许多情况下,在大多数环境设置,实际上他们做同样的事情:他们在屏幕上打印,虽然他们也可以单独重定向。

标准输出(COUT)

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

对于格式化输出操作, cout与一起使用 插入运算符,这是写为 <<(即两个“小于”的标志)。

1
2
3
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是不是。双引号是什么使的区别;当文本在它们之间封闭,文本打印字面上; 当它们不是,文本被解释为一个可变的识别符,并且它的值被打印代替。例如,这两个句子有很不同的结果:

1
2
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;
 


假定 年龄变量包含值24和 邮政编码变量包含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)。例如:

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


这将产生以下输出: 可替代地,操纵器还可以用于换行。例如:

First sentence.
Second sentence.
Third sentence.

endl

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


这将打印: 该机器人产生一个换行符,完全一样的插入做的事情; 但它也有一个附加的问题:流的缓冲液(如果有的话)被刷新,这意味着被请求的输出进行物理写入设备,如果不是已经。这主要影响 全缓冲流,和(通常)不是 全缓冲流。尽管如此,它通常是用一个好主意刷新流将是一个功能只有在和当它不会。请记住,冲洗操作会带来一定的开销,而且在某些设备可能会产生延迟。

First sentence.
Second sentence.

endl '\n' cout endl '\n'

标准输入(CIN)

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

对于格式化的输入操作, cin与提取运算符,这是写为一起使用 >>(即两个“大于”标志)。然后,该操作者后面,其中所提取的数据存储在变量中。例如:

1
2
int age;
cin >> age;
 


第一语句声明类型的变量 int称为 age,并且从第二提取物 cin的值将被存储在其中。这个操作使得该程序等待来自输入 cin; 通常,这意味着程序将等待用户输入用键盘一些序列。在这种情况下,请注意,使用键盘引入的字符时仅传输到节目 ENTER(或 RETURN按压)键。一旦与萃取操作语句 cin到达时,程序将等待,只要需要直到有输入被引入。

在提取操作 cin使用变量的类型的后 >>操作者,以确定它如何解释从输入读出的字符; 如果它是一个整数,所预期的格式是一个序列的数字,如果字符串中的字符的序列,等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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;
 


这等同于:

1
2
cin >> a;
cin >> b;
 


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

CIN和字符串

提取运算符可用于在 cin获得的字符的字符串以相同的方式,与基本数据类型:

1
2
string mystring;
cin >> mystring;
 


然而, cin提取始终把空格(空格,制表符,换行符...)作为终止值被提取,从而提取字符串意味着随时提取一个字,不是一个短语或整个句子。

为了从整条生产线 cin,存在一个函数,称为 getline,即取流( cin)作为第一个参数,并且该字符串变量第二。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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;
}
你叫什么名字?辛普森
您好辛普森。
你最喜欢哪个队伍?同位素
我喜欢同位素呢!


请注意,在这两个调用 getline,我们使用相同的字符串标识( mystr)。什么程序会在第二个电话是简单地取代了以前的内容与引入新的。

该标准的行为,大多数用户从一个控制台程序想到的是,每次程序查询用户输入时,用户介绍了现场,然后按下 ENTER(或 RETURN)。这就是说,输入普遍预期在控制台程序线方面的情况发生,并且这可以通过使用来实现 getline,以获得来自用户的输入。因此,除非你有很强的理由,否则你应该总是使用 getline在你的控制台程序获得的输入,而不是从提取 cin

字符串流

标准头 <sstream>定义了一个名为类型 stringstream,它允许,因为它们是在执行的字符串被处理为一个流,并因此允许提取或插入操作从/向以相同的方式串 cincout。此功能是最有用的字符串转换为数值,反之亦然。例如,为了提取从我们可以写一个字符串的整数

1
2
3
string mystr ("1204");
int myint;
stringstream(mystr) >> myint;
 


声明一个 string与初始化为一个值 "1204",和类型的变量 int。然后,第三行使用该变量以从提取 stringstream从字符串构成。这段代码存储的数值 1204称为变量 myint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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;
}
输入价格:22.25
输入数量:7
总价:155.75


在这个例子中,我们获得的数值从 标准输入间接:不要直接从提取数值 cin,我们从它那里得到线到一个字符串对象( mystr),然后我们从该字符串中的变量提取值 pricequantity。一旦这些数值,算术运算可以对它们进行,如将它们相乘,以获得总价格。

与得到整个行,并提取其内容的这种方法,我们分离得到从它作为数据解释用户输入,从而允许输入处理是用户期望什么的过程中,并在同一时间获得更多控制的变换其内容转换成由程序有用的数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值