我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件。

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

C++输入输出包含以下三个方面的内容:

  1. 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
  2. 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
  3. 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。

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

在C语言中,用printf和scanf进行输入输出,往往不能保证所输入输出的数据是可靠的安全的。在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全(type safe)的。C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C++对标准类型的数据和对用户声明类型数据的输入输出,采用同样的方法处理。C++通过I/O类库来实现丰富的I/O功能。C++的输入输出优于C语言中的printf和scanf,但是比较复杂,要掌握许多细节。

C++的I/O对C的发展--类型安全和可扩展性

在C语言中,用primf和scanf进行输人输出,往往不能保证所输入输出的数据是可靠的、安全的。学过C语言的读者可以分析下面的用法,想用格式符%d输出一个整数, 但不小心用它输出了单精度变量和字符串,会出现什么情况?假定所用的系统int型占两个字节。
    printf("%d", i);  // i为整型变量,正确,输出i的值
    printf("%d", f);  // f为单精度变量,输出f变量中前两个字节的内容
    printf("%d", "C++");  //输出宇符串"C++"的地址

编译系统认为以上语句都是合法的,而不对数据类型的合法性进行检查,显然所得到的结果不是人们所期望的,在用scanf 输入时,有时出现的问题是很隐蔽的。如:
    scanf("%d", &i);  //正确,输入一个整数,赋给整型变量i
    scanf("%d", i);  //漏写&

假如已有声明语句“int i = 1; ”,定义i为整型变量,其初值为1。编译系统不认为上面的scanf语句出错,而是将输人的值存放到地址为000001的内存单元中,这个错误可能产生严重的后果。

C++为了与C兼容,保留了用printf和scanf进行输出和输人的方法,以便使过去所编写的大量的C程序仍然可以在C ++的环境下运行,但是希望读者在编写新的C ++程 序时不要用C的输入输出机制,而要用C++自己特有的输人输出方法。在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全(type safe)的。

此外,用printf和scanf可以输出和输入标准类型的数据(如int、float、double、char), 但无法输出用户自己声明的类型(如数组、结构体、类)的数据。在C++中,会经常遇到对类对象的输人输出,显然无法使用printf和scanf来处理。C++的I/O操作是可扩展 的,不仅可以用来输人输出标准类型的数据,也可以用于用户自定义类型的数据。C++对标准类型的数据和对用户声明类型数据的输人输出,采用同样的方法处理。显然,在用户声明了一个新类后,是无法用printf和scanf 函数直接输出和输人这个类的对象的。

可扩展性是C++输人输出的重要特点之一,它能提高软件的重用性,加快软件的开 发过程。

C++通过I/O类库来实现丰富的I/O功能。这样使C++的输人输出明显地优于C 语言中的printf和scanf,但是也为之付出了代价,C++的I/O系统变得比较复杂,要掌握许多细节。在本章中只能介绍其基本的概念和基本的操作,有些具体的细节可在日后实际深入应用时再进一步掌握。

C++学习42 输入和输出的概念的更多相关文章

  1. 了解一下C++输入和输出的概念

    我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...

  2. 从0开始的Python学习015输入与输出

    简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...

  3. perl学习笔记——输入与输出

    读取标准输入 用<STDIN>进行标准输入:chomp($line=<STDIN>); 如果读到文件尾,行输入操作符就会返回undef.便可利用这一性质跳出循环. while( ...

  4. Erlang学习记录:输入和输出

    输入和输出 输入和输出功能都被定义在io模块 输出功能非常常用,由于erlang项目没有可断点调试的IDE(或者说根本不需要),所以所有的调试操作都是由io输出 来调试的 io:get_line/1. ...

  5. Python学习--02输入和输出

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

  6. perl学习(5) 输入和输出

    1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp: while (defined($line = &l ...

  7. python语言学习5——输入和输出

    输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 注意点: 字符串用的是单引号 碰到逗号输出时就会输出一个空格 输入 python提供了一个input(),可以让用户输入一个字 ...

  8. Python学习笔记-输入与输出

    一.Python提供了raw_input()和input()两个函数实现数据输入. 1.raw_input() 接收字符串类型的输入数据. str1=raw_input("请输入字符串:&q ...

  9. Python学习--02输入和输出、运算符

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

随机推荐

  1. C#→关于System.Data.Linq下的Table<TEntity> 泛型类 的问题

    Table<TEntity>表示表格记录,它是一个泛型集合类,它的元素就是表格实体对象.它提供一组方法,对元素进行添加删除操作,并可以通过DataContext将这些操作保存到数据库. 表 ...

  2. tagName和nodeName的区别

      首先介绍DOM里常见的三种节点类型(总共有12种,如docment):元素节点,属性节点以及文本节点,例如<h2 class="title">head</h2 ...

  3. MySQL中Group By,distinct使用注意事项

    mysql> select * from test; +----+-------+------+-------+ | id | name | age | class | +----+------ ...

  4. Format可能存在的坑

    import java.text.MessageFormat; public class TestFormat { public static void main(String[] args) { / ...

  5. Innodb 存储引擎(转)

    第一部分:线程 Innodb是一个多线程的,各个线程负责不同的任务.主要的线程有:Master Thread.IO Thread.Purge Thread.Page Cleaner Thread. 一 ...

  6. [mysql] mysql主从复制(基于日志点)

    怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:  1.1.版本一致  1.2.初始化表,并在后台启动mysql  1.3.修改root的密码 2.修 ...

  7. mongodb不同版本之间有很大的差异

    今天主要说下我为了给mongodb数据库添加authorization,大家应该知道,mongo默认是无auth运行的.这可能是方便小伙伴学习命令吧. 由于之前发布的一个项目,在亚马逊的云上,处于内部 ...

  8. Math.Round函數

    Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...

  9. 【linux】bash常用快捷键

    Ctrl + r:逆向搜索命令历史 Ctrl + l:清屏 Ctrl + c:终止命令 Ctrl + u:删除光标前的指令 Ctrl + k:删除光标后的指令 Ctrl + d:退出登陆

  10. JS和C# 互相调用与数据绑定问题

    <asp:GridView ID="GridView1" runat="server" onselectedindexchanged="Grid ...