C++回顾day03---<输入输出流>
一:C++输入输出包含下面3个方面
(一)标准I/O
对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出。
(二)文件I/O
以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出
(三)串I/O
对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出
二:I/O类库中常用流类
(一)类名及作用

(二)类关系

ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。 istream类支持输入操作,
ostream类支持输出操作,
iostream类支持输入输出操作。
iostream类是istream类和ostream类通过多重继承而派生的类。
C++对文件的输入输出需要用ifstrcam和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件 (file)。
ifstream支持对文件的输入操作,
ofstream支持对文件的输出操作。
类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream。
三:标准I/O流:cin,cout,cerr,clog
|
对象 |
含义 |
对应设备 |
对应的类 |
c语言中相应的标准文件 |
|
cin |
标准输入流 |
键盘 |
istream_withassign |
stdin |
|
cout |
标准输出流 |
屏幕 |
ostream_withassign |
stdout |
|
cerr |
标准错误流 |
屏幕 |
ostream_withassign |
stderr |
|
clog |
标准错误流 |
屏幕 |
ostream_withassign |
stderr |
(一)标准输入流
1:常见函数
cin.get() //获取字符,指定个数字符(字符串),按照字符截取字符串
cin.getline() //获取一行字符串(允许空格)
cin.ignore()
cin.peek()
cin.putback()
cin.get()的使用
1:cin.get() 读取一个字符
char a;
a = cin.get();
cout << a << endl;
或者
char a;
cin.get(a);
cout << a << endl;
2:cin.get()读取指定个数字符(字符串)
char a[];
cin.get(a,); //虽然我们获取5个,但是当我们输入5个及以上,内部函数只会获取4个字符,最后加上'\n'
cout << a << endl;


3:cin.get()获取字符串(根据指定字符截止)
char a[];
cin.get(a,10,'a'); //遇到字符'a'则结束
cout << a << endl;

4:cin.get()更多用法可以查看源码定义和声明
cin.getline()的使用 :同get()方法的后面两种一致
1.方法一:获取指定个数字符
char a[];
cin.getline(a,);
cout << a << endl;

2.方法二:按照指定字符截取获取字符串
char a[];
cin.getline(a,,'z');
cout << a << endl;

注意:getline两种用法区别《重点》
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline
会将一行数据到'\n'之前全部取出处理,会处理更多的缓冲区数据
return (getline(_Str, _Count, _Myios::widen('\n')));
} _Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim
只会按照指定字符截取字符串,所以不会获取所有缓冲区数据
cin.ignore()的使用
1.缓冲区引入《重点》
键盘输入和应用程序处理之间存在输入缓冲区
应用程序和设备磁盘文件之间存在输出缓冲区

例如图中输入字符串先是放入缓冲区中,只取走其中部分字符串。
其余字符串依旧存在缓冲区中,若是继续获取字符,则会先将之前剩余的字符串取出(而这一部分可能是我们不需要的)
char a[];
cin.getline(a,,'z');
cout << a << endl;
cin.getline(a, , 'f');
cout << a << endl;
system("pause");

注意:若是想取走缓冲区剩余字符。可以使用cin.getline()取走所有剩余数据就可以了
2.cin.ignore()可以用于清除(忽略)缓冲区剩余内容指定个数
char a[];
cin.getline(a,,'z');
cout << a << endl;
cin.ignore(); //默认是忽略一个字符
cin.getline(a, , 'f');
cout << a << endl;

cin.ignore(); //忽略5个字符
cin.peek()的使用:读缓冲区中下一个字符,但是不将其取走
char a[];
char ch;
ch = cin.peek();
cout << ch << endl;
cin.getline(a, );
cout << a << endl;

cin.putback()的使用:在缓冲区前面插入一个字符
char a[];
cin.get(a, );
cout << a << endl;
cin.putback('A');
cin.getline(a, );
cout << a << endl;

更多方法查看手册或者看源码即可
(二)标准输出流
1.输出流控制符

2.用于控制输出格式的流成员函数

3.设置格式状态的格式标志

4.案例使用一 (double浮点型)
double a = 123.45678910;
cout << a << endl; //默认6位有效数 123.456
cout << setprecision() <<a<< endl; //9位有效数 123.456789
/***********浮点数******************/
cout << setprecision();
//浮点数以定点形式输出,精度变为小数点保留位数
cout << setiosflags(ios::fixed) << a << endl; //123.4567891
cout << setiosflags(ios::fixed) << setprecision() << a << endl; //123.45678910
cout << setprecision();
cout << setiosflags(ios::scientific) << a; //设置浮点数以科学计数法形式显示 0x1.edd4p+6

5.案例使用二(int整型):注意setw域宽只对后面一个输出有效
int a = ;
cout << a << endl;
cout << hex <<a<< endl; //16进制显示
cout << setiosflags(ios::uppercase) << a << endl; //16进制字母大写
cout << setw() << endl; //设置域宽 右对齐
cout << setfill('*') << a << endl; //右对齐,域宽10,空白填充*
cout << setw() << setfill('^'); //设置域宽--->注意setw域宽只对后面一个输出有效
cout << setiosflags(ios::left) << a << endl; //左对齐
//想显示+号,需要在10进制下
cout << dec<<setw()<<setfill('%');
cout << setiosflags(ios::showpos) << a << endl; //设置显示+号

6.注意点
.成员函数width-->cout.width()
setw--->cout<<setw()
只对其后的第一个输出项有效
.格式状态分5组,每组只有一个有效(互斥)例如:dec,oct,hex设置多个只有后面那个有效
.可以使用'|'一次设置多个状态
四:文件I/O

ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。
fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。
(一)状态模式
文件输入输出设置方式

注意:有些属性是互斥的,使用时注意
例如:app和trunc--->app是在文件末尾加入,而trunc是清空文件查询写入。功能互斥,用于打开文件会打开失败。
注意:打开文件时,所有打开方式,基本都是:若是文件不存在则自动创建
文件属性
| 属性 | 含义 |
| 0 | 普通文件,打开访问 |
| 1 | 只读文件 |
| 2 | 隐含文件 |
| 3 | 系统文件 |
(二)案例使用:写入文件并读取数据
#include <iostream>
#include <fstream> void main()
{
char info[];
cin.getline(info, ); //写入数据
ofstream ofile;
ofile.open("D:\\1\\io2.txt", ios::app|ios::trunc); //以追加和创建方式打开 默认是普通文件
if (!ofile)
{
cout << "ofile open failure" << endl;
}
else
{
ofile << info; //写入普通数据
ofile.close(); //关闭文件
} memset(info, , ); //初始化空 //读取数据
ifstream ifile;
ifile.open("D:\\1\\io2.txt", ios::in); //读取文件 0是默认普通文件,可以像上面一样不写
if (!ifile.is_open())
{
cout << "open failure" << endl;
}
else
{
ifile.getline(info, );
ifile.close();
cout << info << endl;
} system("pause");
}

(三)案例使用:二进制文件操作read,write
对二进制文件的读写主要使用istream中的write和read方法来实现
istream& read(char* buf,int len)
ostream& write(char* buf,int len)
typedef struct
{
char name[];
bool sex;
int age;
}Stu; void main()
{
//结构体操作
Stu s,s2;
strcpy(s.name, "fagfwa");
s.sex = true;
s.age = ; //写入二进制文件
ofstream ofile;
ofile.open("D:\\1\\stu.bin", ios::binary|ios::out);
if (!ofile.is_open())
return ;
ofile.write((char*)&s,sizeof(s));
ofile.close(); //读取二进制文件
ifstream ifile;
ifile.open("D:\\1\\stu.bin", ios::binary | ios::in);
if (!ifile)
return;
ifile.read((char*)&s2, sizeof(s2));
cout << s2.name << endl << s2.age << endl << s2.sex << endl;
ifile.close(); system("pause");
}

C++回顾day03---<输入输出流>的更多相关文章
- Java I/O(二)其他常用的输入输出流PrintStream等、标准流重定向
四.FilterOutputStream.PrintStream PrintStream是继承自FilterStream类的,例如标准输出流System.out就是著名的PrintStream类对象. ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- 第27章 java I/O输入输出流
java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...
- java 对象输入输出流
对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息. ObjectInputStream : 对象输入流 ...
- 【转】输入/输出流 - 全面掌握IO
File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...
- 输入输出流(IO)
输入输出流(IO)文件(File)java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等), ...
- Java输入/输出流体系
在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...
- JAVA Io 缓冲输入输出流
java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...
- C++输入输出流
一.C++输入输出流的含义 以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.程序的输入指的 ...
随机推荐
- WebRtc编译好的vs2015源码
一直想看webrtc的源码,苦于FQ能力有限且整个编译过程耗时巨大,故求助于互联网.在互联网寻找许久编译好的Webrtc源码,好多版本下载下来总是报各种错误,很是失落. 皇天不负有心人,终于寻得一版可 ...
- (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- 设置TextBlock默认样式后,其他控件的Text相关属性设置失效问题
问题: 定义了默认TextBlock样式后,再次自定义下拉框 or 其他控件 ,当内部含有TextBlock时,设置控件的字体相关样式无效,系统始终使用TextBlock设置默认样式 解决方案: 为相 ...
- Ubuntu18.04 安装jdk1.8
1.oracle官网下载压缩包,点击链接. 2.解压 1 tar -zxvf jdk-8u171-linux-x64.tar.gz 3.移动到制定目录 ##将文件从下载目录 挪到/usr/local下 ...
- Node+express实现后台服务接口
一.准备工作 创建代码目录,依次执行以下操作 1.(若没有安装过)安装node 2.npm init(package.json) 3.安装express(请求)npm install express ...
- SpringBoot四大核心
auto-configuration.starters.cli.actuator
- 如何用php实现分页效果
分页效果在网页中是常见的,可是怎样才能实现分页呢,今天做了两种方法来实现一下分页的效果 首先,我们需要准备在数据库里面准备一个表,并且插入数据,这些都是必需的前提工作了,不多说,如图所示(库名为jer ...
- 采用ADM2483磁隔离器让RS485接口更简单更安全
采用ADM2483磁隔离器让RS485接口更简单更安全 摘要:本文介绍RS485的特点及应用,指出了普通RS485接口易损坏的问题,针对存在的问题介绍了以ADM2483为核心的磁隔离解决方案. 关键词 ...
- Docker启动Get Permission Denied
https://www.cnblogs.com/informatics/p/8276172.html 以下问题及解决方法都在Ubuntu16.04下,其他环境类似 问题描述 安装完docker后,执行 ...
- Dubbo-Zookeeper安装
安装zookeeper: 1.拖入tar.gz包,解压 2.建立/usr/zookeeper路径,该路径创建logs文件夹和data文件夹 3.进入conf目录,复制一份zoo_sample.cfg为 ...