从控制台I/O(键盘和屏幕)到文件IO记录明白C++输入和输出)

  • 输入和输出概述
  • 1、CPP输入输出的管理:
  • 2、流类库
  • 3、流对象的建立和使用及输入输出的实现
  • 4、Ostream对象cout及其部分类方法
    • 4.1 左移(“<<”)、右移(“>>”)操作符的重载
    • 4.2 Ostream包含的常用方法(供cout流对象调用):
  • 5、 istream对象cin及其部分类方法
  • 6、与while()循环相关的判定句
  • 7. 命令行处理技术

输入和输出概述

多数计算机语言的输入和输出是以语言本身为基础实现的,C和C++都没有将输入和输出建立在语言中,他们的关键字不包括I/O有关的内容。那么问题来了,他们是如何实现输入和输出的呢?
C语言:通过自带的标准函数库又称作标准输入输出软件包来实现(包含在头文件stdio.h中)。
C++语言:通过自带的标准类库来实现(包含在头文件iostream和fstream中)。

1、CPP输入输出的管理:

(1)数据的传递
流 :CPP将输入输出数据的传输看作是字节流,通过建立输入、输出流类库,使用流对象完成数据传递,类可以把流看成是水管(或者说里面的水更形象)。流与程序和文件相关联,从流对象中取数据称为提取,向流对象中放数据称为插入。
数据的来源位置有:文件、程序、键盘(也是文件)。
数据的去向位置有:文件、程序、显示器和打印机(也是文件)。
《图示》

Tips: 实际上,文件输出流对象 一端连接内存程序,另一端只用到与文件关联,如果需要与显示器关联则使用cout,需要与本程序其他变量关联,直接赋值就可以。关联方法Open(“参数”)的参数目前只知道是文件名字。文件输入流一端关联程序,另一端同上也只是用到文件。
数据在来源位置和去向位置间的传输需要借助流来完成,流是传输的桥梁。输入(输出类似)的管理都包括两个过程:1-将流(看成是水管)的一端与内存程序连接。2-将流的另一端与文件(磁盘文件或键盘)或其他程序连接。CPP程序仅检查字节流,不关心其来去向,因此可以使用相同的方式方法处理来自文件或者键盘的数据。
(2)数据的缓冲
缓冲的目的:匹配不同的信息传输速率,提高效率
程序每次只能处理一个字节的信息,而磁盘通常以512或更多的块为单位传输信息,所以数据传递时,通常是在内存开辟一段缓冲区,从磁盘向缓冲区传输较多数据,程序再逐一和缓冲区之间进行传输。这样不仅解决了传输速率不一致的问题,更提高了传输效率,因为程序每次从外部磁盘读取数据会有较多的硬件活动,开销较大。

2、流类库

管理流和缓冲区比较复杂,CPP的流类库包含了一些专门实现、管理流和缓冲区的类,这样很多实现不需要使用者处理,简化流对象的使用。流类库中部分类间继承关系如下图:
Istream、ostream、iostream是标准输入输出设备有关的输入流类,输出流类和输入输出流类,Ifstream、ofstream、fstream类是文件有关的流类,图中箭头表示向下派生,iostream类继承了istream和ostream的类方法,fstream又继承了iostream类方法,且同时包含了ifstream和ofstream中的函数方法。因此,头文件中只需要#intclude,或者#include即可,同时注意,文件流对象可以使用标准IO流对象的输入输出方法。
以下是部分类的功能:
Streambuf类:为缓冲区提供内存,提供用于填充缓冲区、访问缓冲区、刷新缓冲区和管理缓冲区内存的类方法。Tips;建立流对象时自动创建缓冲区并与流关联起来,不需要我们处理。
Ios_base类:表示流的一般特征,包括是否可以读是二进制还是文本流等。
Ios类:基于ios_base类,其中包括一个指向streambuf对象的指针成员。

3、流对象的建立和使用及输入输出的实现

要实现数据在内存和文件之间流动,(1)首先要建立流对象这个桥梁,(2)再将流对象的“两端”分别与文件和程序关联起来,(3)随后便可以使用流对象对应的类成员函数(包括哪些呢,后文介绍)进行数据处理了。
使用标准输入和输出不需步骤(1)和步骤(2),程序include后将自动创建8个流对象cin、cout、cerr、clog(4个用于窄字符流,4个用于宽字符流)。Cin的数据来源位置自动与键盘关联,去向位置就是程序。Cout的数据去向位置自动和显示器关联,来源位置与程序关联。
使用文件输入输出时,步骤(1)-(3)都需要我们自己来完成,不够步骤(1)和步骤(2)可以分别完成也可以合并成一步来完成。(文件通常是存储在某种设备磁带、光盘、软盘、硬盘上的一些列字节)具体见如下程序示例:

#include<iostream>
#include<fstream>
using namespace std;
int main()
{char c;int testint=101;ofstream file("test.txt");//将步骤(1)(2)合并,并指定文件打开模式//ofstream file;         //步骤(1):创建文件输出流对象。//file.open("test.txt");//  步骤(2):将流对象与文件关联,文件不存在就创建。file << "成功写入文件,";// 步骤(3)调用ostream成员函数ostream& operator<<(const char*)file.close(); //断开流对象与文件的关联,该流对象后面还可和其它文件关联。file.open("test.txt", ios::app); //指定文件打开模式模式:不清除数据,继续追加。。file << "接着上一句,又写入一句!";file.close();ifstream file2("test.txt");////ifstream file2;//file2.open("test.txt");while (file2.get(c)) //知:点get(void) 和get(char*)返回值的区别及作为bool时的返回值。cout << c;cout << endl;//  file<<testint<<endl; //不报错,显示其也不现实,流一端没有与显示器关联。return 0;
}// read(reinterpret_<cast>(char*), int)和write(reinterpret_<cast>(char*), int)的使用。
//非格式化输入输出,按照内存存储形式直接读写。
//文件—>程序, read():(1)创建流,(2)流与文件关联(3)使用read()以程序变量为参数
将数据读入。
//程序—>文件,write():(1)创建流,(2)流与文件关联(3)使用write()以程序变量为参数
写数据。
#include<iostream>
#include<fstream>
using namespace std;
class dog//write和read是非格式化输入输出,不对数据进行处理,按内存存储状态直接复制出来,一般用哪种模式写的,就要用哪种模式读,纯文本类可以写入,带指针的就不能原样读不出来了。
{private:int weight;int age;
public:dog(){}dog(int w, int a) :weight(w), age(a){}int getage(){ return age; }int getweight(){ return weight; }~dog(){}
};
// write()和read()函数。
int main()
{dog d1(5, 10);ofstream file1("test.txt");file1.write((char*)&d1, sizeof(d1));// reinterpret_cast<char*>都是从程序写入,只不过一个使用<<直接操作字符串,一个相当于把字符串放进变量后再使用write向文件写。file1.close();ifstream file2("test.txt");if (!file2) {cout << "unable to open the file" << endl;return (1);}dog d2;file2.read((char*)&d2, sizeof(d2));cout << "weight:" << d2.getage() << "\t age:" << d2.getweight() << endl;return 0;
}

4、Ostream对象cout及其部分类方法

cout用于向显示器传送数据,数据在内存中的组织形式是多样的,可以是16进制或2进制值表示,相同类型数据在不同系统的存储位数也不同。但程序将字节流发送给屏幕的方式是固定的,一个字节表示一个字符值,显示-1.2需要3个字符,而不是这个值的64位内存表示。
因此:ostream类的重要作用:将数值类型(int/float等,内存2进制表示)转换为以文本形式(字符字节)表示的字符流。(通过多个“<<””>>”操作符重载类方法实现)。
istream类的重要作用: 根据其接收值的变量类型,通过类方法将字符序列转换为对应的类型。

4.1 左移(“<<”)、右移(“>>”)操作符的重载

cout<<variable;可以使用这样的形式对变量进行输出是因为ostream类对左移操作符进行了重载。函数原型:ostream& operator<<(各种type, 包括char*)重载函数的返回类型是类的引用,这样可以实现连续(拼接)输出。
使用”<<”对字符串进行输出时要记得:C++使用字符串存储位置的地址表示字符串,指针形式包括数组名、指向字符串的显示指针、或引号括起来的字符串。因此可以使用cout<<采用以上三种形式输出字符串,输出根据字符串终止符停止显示。其他类型的指针C++将其对应于void*,并打印地址的数值表示,要打印字符串指针变量的地址,可以将其强制转换为void类型再输出。Char point=”abc”;cout<<(void*)point;。

4.2 Ostream包含的常用方法(供cout流对象调用):

1) ostream& operator<<(各种内置类型,包括指针): 输出各种标准数据类型。
2) ostream& put(char ):用于输出字符。
3) basic_ostream<char T, traits>&write(const char_type* s, streamsize n):用于显示字符串。使用cout调用时将调用char具体化,因此返回类型为ostream&,即cout对象。
使用write()输出字符型数据是可以的,因为一个字符对应一个ASCII码,在内存中就是一个个独立存在的,数值型就不可以,因为write()就是将内存中指定的字节数一个一个的复制到文件中不做任何转换(所以有reinterprete_cast<char*>( )),数值的进位机制等不被考虑,会将进位后的内存二进制排列直接复制出去,此时使用如下:

所以说write()一般只用于向文件输出。
用文件流对象调用write()时,可以指定文件打开模式为二进制存储,即open时候添加ios_base::binary参数,二进制存储数字无转换和舍入误差。不管是用默认的文本模式还是显式参数的二进制模式写文件,都要用相同的模式来读该文件,这样数据不会出现错误和混乱。

5、 istream对象cin及其部分类方法

1)istream &operator>>(type &); 格式化输入函数,因它们可以将输入数据转换为目标指定格式而得名。不同于输出,参数也是引用。输入时自动跳过空白(空格、回车、tap)。
2)int get(void); 单字符输入,
3) istream& get(char&): 单字符输入,可拼接:char c1,c2,c3; cin.get(c1)>>get(c2).>>c3;不跳过空白。
4) istream& getline(char*, int ); 默认将换行符用作分节符。
5) istream& getline(char*, int, char );参数定义:(用于放字符串的内存单元地址,要读取最大字符数量+1【\0占一个】,指定用作分节符的字符)
6) istream& get(char*, int );
7) istream& get(char*, int, char );
读取整行时,get()和getline()的主要区别是:get()将换行符留在输入流中,而getline()将提取并丢弃输入流中的换行符。
8)istream& read():读取指定数目字节,并存储在指定位置中。char a[20],b[30];cin.read(a,20).read(b,30);
这些Get()和getline()函数被称为非格式化输入函数,因为他们只是读取字符输入,而不会跳过空白,也不进行数据转换。

6、与while()循环相关的判定句

(1)While(Cin.get(ch))或While(fin.get(ch))语句:
正常输入时,返回值是cin对象,此时循环判定结果为true,到达文件尾时返回值判定值为false。Fin为文件流对象。
(2)Int ch; While(ch=cin.get()!=EOF)或While(ch=fin.get()!=EOF)语句:
到达真正或者模拟文件尾时,函数都将返回EOF,EOF是iostream都文件提供的一个符号常量。
(3)fin.open(“test”),if(!fin)…
Ifstream和istream对象在放在需要bool类型的地方时,被转换为bool值。这是因为Fin文件流用于测试条件时,可以通过检查流状态来判断最后一个流操作是否成功,流状态是一些值为0或者1的数据成员,相应数据在测试判定时作为false和true来判定。最新C++推荐使用更完备的is_open()函数,即if(!fin.is_open())。

7. 命令行处理技术

Int main(int argc, char *argv[])
Argc:参数个数,包括命令。 Argv[]:指向指针的指针,即指向一个指向char的指针。Argv[0]指向存储第一个命令行参数的字符串的第一个字符。

C++输入和输出:控制台I/O(键盘和屏幕)及文件I/O详细笔记相关推荐

  1. 文件的输入和输出:流和缓冲区的概念和文件操作函数总结

    流和缓冲区的概念理解 流(stream) A stream is a source or destination of data that may be associated with a disk ...

  2. python输入123输出321_编程从键盘输入一个三位数,将它们逆序输出。如输入123,输出321.谢谢...

    展开全部 这个简单啊!下边的是2113我以前写的,你看看吧?希5261望对你有4102帮助!不完善的地方在1653于没有判断第一位是不是0的,你可以加上去 #include void main() { ...

  3. Java的知识点6—— 强制类型转换、基本类型转化时常见错误和问题、 简单的键盘输入和输出

     强制类型转换 强制类型转换,又被称为造型,用于显式的转换一个数值的类型.在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出. public class Test2 {pu ...

  4. 初入c++ (八) c++输入和输出

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

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

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

  6. C语言程序——字符的输入和输出

    文章目录 前言 一.字符的输入和输出 二.程序实例 1.程序代码 2.运行结果 3.结果分析 三.拓展应用 总结 前言 使用stdio库中提供的字符输入输出函数的时候,需要在程序中包含stdio.h的 ...

  7. C++_IO与文件5-文件的输入与输出

    大多数计算机程序都使用了文件.文件本身是存储在某种设备上的一系列字节. 通常,操作系统管理文件,跟踪它们的位置.大小.创建时间等. 除非在操作系统级别上编程,否则通常不必担心这些事情. 真正需要的是将 ...

  8. 文件格式化输入和输出

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 在控制台操作时,使用的格式化输入和输出为scanf和printf,那么对文件的IO操作也可以使用fscanf和 ...

  9. Python 基础--输入与输出

    有些时候你的程序会与用户产生交互.举个例子,你会希望获取用户的输入内容,并向用户打印出一些返回的结果.我们可以分别通过 input() 函数与 print 函数来实现这一需求. 对于输入,我们还可以使 ...

最新文章

  1. JavaScript运算符:递增递减运算符前置和后置的区别
  2. 使用struts 2 获取服务器数据 ongl表达式 标签
  3. 说说JSON和JSONP,也许你会豁然开朗,含jQuery使用jsonp用例
  4. java 储存过程_Java储存过程
  5. macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新
  6. 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
  7. c语言程序设计电子图书 汉诺塔,用C写的汉诺塔(hanoi)程序
  8. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(2)
  9. 漫画丨让你专心干技术,没让你干到35岁啊…
  10. 《长城保护总体规划》出台 为长城保护提供遵循依据
  11. GitHub上最励志的计算机自学教程,绝对牛B
  12. Rabin-Karp算法详解和实现(python)
  13. KMP算法------字符串匹配问题
  14. 计算阶乘的两种实现方式(Java)
  15. excel当前时间增加几天或者几小时
  16. 计算机网络图片大全,说说心情图片大全唯美
  17. 【Linux基础编程】tr命令
  18. 好物推荐 | 小明医声家庭健康初体验
  19. Praat脚本-028 | 批量合并目录内的音频文件
  20. 铁路计算机联锁应用,Profisafe在铁路车站计算机联锁控制系统中的应用

热门文章

  1. 2020年中山大学CS夏令营
  2. “金三银四“,敢不敢“试”?
  3. 国家,省/州,城市下拉框
  4. C语言实现矩阵的秩求解分析
  5. 教你玩转QQ的10大绝招
  6. 逆势获投1亿,火眼金睛下的云适配BRaaS新模式引关注
  7. 【官方文档】Fluent Bit 安装在 Linux
  8. 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
  9. IOS设备恢复模式和DFU模式 区别、进入方法
  10. 背景扣除matlab_基于背景减法的目标检测在Matlab中的实现方法