C++:输入与输出

7、输入与输出

1、从C到C++
2、第一个C++程序
3、C++程序的编译与运行
4、改进的细节

1、输入和输出

1、程序的输入指的是从输入文件将数据传送给程序,
程序的输出指的是从程序将数据传送给输出文件。

2、C++输入和输出包含以下三个方面的内容:
1、对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。

2、以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。

3、对内存中指定的空间进行输入和输出,通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称I/O。

------C++采取不同的方法来实现以上3种输入输出。为了实现数据的有效流动,C++系统提供了庞大的I/O类库,调用不同的类去实现不同的功能。

2、相关类和对象

1、输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存;在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以使ASCLL字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。

C++:输入与输出_第1张图片

C++:输入与输出_第2张图片


3、标准输出流 cout
1、cout不是C++预定义的关键字,它是ostream流类的对象,cout流中的数据是用流插入运算符“<<”顺序加入的。cout流是容纳数据的载体,它并不是一个运算符。人们关心的是cout流中的内容,也就是向显示器输出什么。

2、用“cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型,并根据其类型选择调用与之匹配的运算符重载函数。C++的I/O机制对用户来说,显然是方便而安全的。

3、cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符, 并刷新流(清空缓冲区)。注意如果插人一个换行符”\n“(如cout<

4、在iostream中只对"<<"和">>"运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。

4、cerr
1、cerr流对象是标准错误流,cerr流已被指定为与显示器关联。

2、与cout不同的是,cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。

5、clog
clog对象也是标准错误流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。区别:cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或endl时向显示器输出。

6、 用控制符控制输出格式

C++:输入与输出_第3张图片

7、用流对象的成员函数控制输出格式
C++:输入与输出_第4张图片

除了可以用控制符来控制输出格式外,还 可以通过流对象cout中用于控制输出格式的成员函数来控制输出格式。 C++:输入与输出_第5张图片,还

实例代码:

C++:输入与输出_第6张图片

代码分析:
1、
成员函数 width(n)和控制符 setw(n)只对其后的第一个输出项有效。如:
cout.width(6);
cout << 20 << 3.14 <
输出结果是 203.14
说明:
1、在输出第一个输出项20时,域宽为6,因此在20前面有4哥空格,在输出3.14时,width(6)已经不起作用,此时按系统默认deep域宽输出(按数据实际长度输出)。如果要求在输出数据时都按指定的同一域宽n输出,不能只调用一次width(),必须在输出每一项之前都要调用一次width(n)。
2、代码中的输出格式状态分为5组,每一组中同时只能选用一种,(例如dec、hex和oct中只能选一,它们是互相排斥的)。在用成员函数setf和setiosflags设置输出格式状态后,如果想改设置为同组的另一状态,应当调用成员函数unsetf(对应于成员函数self)或resetiosflags(对应于控制符setiosflags),先终止原来设置的状态,然后再设置其他状态,可以从本程序中看到这点。
3、cout.setf(ios::internal I ios::showpos); //包含两个状态标志,用“|”组合。
4、可以看到:对输出格式的控制,既可以用控制符,也可以用cout流的有关成员函数,二者的作用是相同的。
控制符在头文件iomanip中定义的,因此用控制符时,必须包含iomanip头文件。
cout流成员函数在iostream中定义,只需包含头文件iostream。
许多程序人员感到使用控制符方便简单,可以在一个cout输出语句中连续使用多种控制符。

8、函数put()-----专用于输出单个字符的成员函数put
1、cout.put( 'a' );-----------------------屏幕上显示一个字符a。
2、put函数的参数可以是字符或字符的ASCALL代码(也可以使一个整数表达式):
cout.put(65+32);--------------------也显示 a
3、也可以在一个语句中连续调用put函数:
cout.put(71).put(79).put(79). put(68).put('\n');
在屏幕上显示:GOOD.
应用:可以逆序输出字符串。

9、 cin输入流
1、cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。
2、流提取符“>>”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。
注意:只有在输入完数据再按回车键后,改行数据才被送到键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。需要注意保证从流中读取数据能正常进行。
例如:
int a,b;
cin>>a>>b;
若从键盘上输入:
21 abc
变量a从输入流中提取整数21(因为后面是空格,不是int型,所以只有21),提取操作成功,此时cin流处于正常状态。但在变量b准备提取一个整数时,遇到了字母a,显然提取操作失败了,此时,cin流被置为出错状态。只有在正常状态时,才能从输入流中提取数据。
3、当遇到无效字符或遇到文件结束符(不是换行符,是文件中的数据已读完)时,输入流cin就处于出错状态,即无法正常提取数据。此时对cin流的所有提取操作将终止。-----Ctrl + Z
while(cin>>grade) //能从cin流读取数据
{
}

10、get()函数读入一个字符:

三种形式:

C++:输入与输出_第7张图片

注意第三种,它是读取n-1个字符。如果在读取n-1个字符之前遇到指定的终止字符,则会提前结束,不会读取那个终止字符。

11、getline()函数-----作用是从输入流中读取一行字符,其用法与带三个参数的get函数类似。即:
cin.getline(字符数组(或字符指针),字符个数n,终止标志字符)
这里,输入nihao/nanjing,会直接跳过输入的第三阶段,直接输出nanjing(不包括终止字符),因为都在缓冲区内,nanjing还没有被提取。如果把cin.getline(ch,20)换成cin.getline(ch,20,‘/’),那么就会执行第三个阶段,此时“\n”不是结束标志,而是被作为一个字符被读入。

getline函数和get函数不同之处:

用getline函数从输入流读字符时,遇到终止标志字符时结束,指针移到该终止标志字符之后,下一个getline函数将从该终止标志的下一个字符开始接着读入,如本程序运行结果所示那样。如果用cin.get函数从输入流读字符时,遇终止标志字符时停止读取,指针不向后移动,仍然停留在原位置。下一次读取时仍从该终止标志字符开始。

请比较用“cin<<”和用成员函数cin.getline()读数据的区别:
用“cin<<”读数据时,以空白字符(包括空格、tab键、回车键)作为终止标志,而用cin.getline()读数据时连续读取一系列字符,可以包括空格。
用“cin<<”可以读取C++的标准类型的各类型数据(如果经过重载,还可以用于输入自定义类型的数据),而用cin.getline()只能输入字符型数据。

12、 istream类成员函数
1、eof函数
eof函数是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(真),否则为0(假)。

C++:输入与输出_第8张图片

?它能做到一句话。

2、peek函数---------“观察”,peek函数的作用是观测下一个字符。其调用形式为:
c = cin.peek();
函数的返回值是指针指向的当前字符,但它知识观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。

3、putback函数--------将前面用get或者getline函数从输入流中读取的字符h返回到输入流,插入到当前指针位置,以供后面读取。其调用形式为:
cin.putback(ch);

4、ignore函数-------跳过输入流中n个字符,或在遇到指定的终止字符时提前结束。(此时跳过包括终止字符在内的若干字符)。其调用形式为:
ignore(n,终止字符)
例如:ignore(5,'A') //跳过输入流中5个字符,遇到‘A’后就不再跳类,也可以不带参数或只带一个参数。如:
ignore(); //n默认值是1,终止字符默认为EOF
相当于
ignore(1,EOF);
C++:输入与输出_第9张图片

你可能感兴趣的:(C++:输入与输出)