C++ STL——输入输出流

时间:2021-08-03 01:55:06


注:原创不易,转载请务必注明原作者和出处,感谢支持!

注:内容来自某培训课程,不一定完全正确!

一 缓冲区

(1)标准输入:从键盘输入数据到程序(input)

(2)标准输出:程序数据输出到显示器(output)

(3)标准输入 + 标准输出 = 标准I/O

(4)文件I/O = 文件的输入和输出

缓冲区是位于内存当中的一小块内存用于缓冲输入(输入缓冲区)内容或者输出(输出缓冲区)内容。

二 标准输入流cin

标准输入流cin的成员方法有:

方法 描述
cin.get() 返回缓冲区的第一个字符
cin.get(ch) 返回缓冲区的第一个字符并存入char类型变量ch中
cin.get(buf, 256) 从缓冲区中读取一个字符串存入buf中
cin.getline(buf, 256) 从缓冲区中读取一行数据(不包括换行符)
cin.ignore() 忽略当前的字符
cin.peek() 偷瞄一眼(返回)缓冲区的第一个字符,不将该字符从缓冲区取走
cin.putback() 将字符重新放入缓冲区首部

下面是一个有关cin的应用案例。

// cin
void Test1()
{
// 从缓冲区中一次读取一个字符,然后输出
char ch1;
while ((ch1 = cin.get()) != EOF)
{
cout << ch1 << endl;
} char ch2;
cin.get(ch2); // 读取一个字符 char buf[1024];
cin.get(buf, 1024); // 从缓冲区读取一个字符串,存入buf中 cin.getline(buf, 1024); // 读取一行数据(不包括换行符) cin.ignore(); // 忽略一个字符
cin.ignore(2); // 忽略两个字符
cin.ignore(10, '\n'); // 忽略前10个字符,直到遇到'\n' cin.peek(); // 偷瞄一眼(返回)缓冲区的第一个字符,不将该字符从缓冲区开头取走! // 从缓冲区取走一个字符然后将其重新放入缓冲区首部
char ch = cin.get();
cin.putback(ch);
}

三 标准输出流cout

标准输出流cout的成员方法有:

方法 描述
cout.flush() 刷新缓冲区
cout.put() 向缓冲区写字符
cout.write() 二进制流的输出
cout.width() 输出格式控制符
cout.fill() 设定填充符号
cout.setf(flag) 设置标志

下面是一个cout的应用实例。

// cout
void Test2()
{
cout << "Hello World!"; // 不会立马输出,而是将"Hello World!"送入输出缓冲区
cout.flush(); // 刷新缓冲区,"Hello World!"才会显示在屏幕上 // 往缓冲区插入字符
cout.put('I').put(' ').put('L').put('O').put('V').put('E');
cout << endl; // 二进制流输出
cout.write("I LOVE CHINA", strlen("I LOVE CHINA"));
cout << endl; // 格式化输出
int number = 10;
cout << "十进制:" << number << endl;
cout.unsetf(ios::dec); // 卸载默认的十进制输出方式
cout.setf(ios::oct); // 设置为八进制输出方式
cout.setf(ios::showbase); // 显示八进制前导0
cout << "八进制:" << number << endl;
cout.unsetf(ios::oct); // 卸载八进制输出方式
cout.setf(ios::hex); // 设置为十六进制输出方式
cout << "十六进制:" << number << endl; // 设定显示位宽
cout.width(10); // 10位的显示位宽
cout.fill('*'); // 其余部分用*填充
cout.setf(ios::left); // 左对齐
cout << number << endl; // 以上是通过成员方法实现输出控制的
// 下面通过输出控制符来进行输出控制
// 需要引入头文件iomapip
cout << hex // 十六进制输出
<< setiosflags(ios::showbase) // 显示十六进制前导0x
<< setw(10) // 设定位宽为10
<< setfill('~') // 其余部分用~填充
<< setiosflags(ios::left) // 左对齐
<< number
<< endl; }

四 文件输入输出

文件输入流ifstream

文件输出流ofstream

文件输入输出流fstream

文件的打开方式

文件流的状态

文件流的定位:文件指针(输入指针,输出指针)

文本文件和二进制文件

文件流和文件流对象

输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件为对象,即从磁盘文件读取数据,将数据输出到磁盘文件。和文件有关的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要定义了三个类,由这三个类控制对文件的各种输入输出操作,它们分别是ifstreamofstreamfstream。其中fstream类是由iostream类派生而来,它们之间的继承关系如下。

graph TD;
istream-->ifstream;
istream-->iostream;
ostream-->ofstream;
ostream-->iostream;
iostream-->fstream;

由于文件设备并不像显示器屏幕和键盘一样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个类的对象。

ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。

ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。

fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

下面是一个文本文件读写的应用案例。

// 文本文件读写
void TestText()
{
char *source = "C:\\src.txt";
char *destination = "C:\\dst.txt"; // 以只读方式打开文件
ifstream is(source, ios::in);
if (!is)
{
cerr << "打开文件失败!" << endl;
return;
} // 等价写法
// ifstream ism;
// ism.open(source, ios::in); // 开始读文件
// char ch;
// while (is.get(ch))
// {
// cout << ch;
// }
// cout << endl; // 文件关闭
// is.close(); // 以追加写入的方式打开文件,ios::app表示append追加
ofstream os(destination, ios::out | ios::app);
if (!os)
{
cerr << "打开文件失败!" << endl;
return;
} // 从source读取往destination写入
char ch;
while (is.get(ch))
{
cout << ch;
os.put(ch);
}
cout << endl; // 关闭文件
is.close();
os.close();
}

下面是一个使用二进制文件读写进行对象序列化的案例。

// Person类
class Person
{
public:
Person() = default;
Person(int age, int id) : age(age), id(id) {}
void Show()
{
cout << "age = " << age << endl;
cout << "id = " << id << endl;
} private:
int age;
int id;
}; // 二进制文件读写
void TestBinary()
{
// Windows下的每行结束标志是\r\n,而Linux下每行结束标志就是\n
// 所以在Linux下,用文本模式或者二进制模式去读文本文件没有任何区别
// 但Windows下却存在着不小的差别,具体如下:
// 如果你用文本模式读取文本文件,则Windows会将\r\n转换成\n
// 如果你用文本模式写入文本文件,则Windows会将\n转换成\r\n
// 如果你用二进制模式读写文件,则不存在转换,如论读写都保留\r\n // 将p1,p2写入文件里
Person p1(10, 1001);
Person p2(11, 1002); char *destination = "C:\\dst.txt";
// 以二进制方式ios::binary打开文件
ofstream os(destination, ios::out | ios::binary);
if (!os)
{
cerr << "打开文件失败!" << endl;
return;
}
// 以二进制方式写文件
os.write((char *)&p1, sizeof(p1));
os.write((char *)&p2, sizeof(p2));
// 关闭文件
os.close(); // 读取二进制文件
ifstream is(destination, ios::in | ios::binary);
if (!is)
{
cerr << "打开文件失败!" << endl;
return;
}
Person p;
is.read((char *)&p, sizeof(Person));
p.Show();
is.read((char *)&p, sizeof(Person));
p.Show(); // 关闭文件
is.close();
}

C++ STL——输入输出流的更多相关文章

  1. java&period;IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  2. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  3. 第27章 java I&sol;O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  4. java 对象输入输出流

    对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息.              ObjectInputStream   : 对象输入流            ...

  5. 【转】输入&sol;输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  6. 输入输出流(IO)

    输入输出流(IO)文件(File)java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等), ...

  7. Java输入&sol;输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  8. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

  9. C&plus;&plus;输入输出流

    一.C++输入输出流的含义 以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.程序的输入指的 ...

随机推荐

  1. Android提升篇系列:adb无法识别MX5等特殊机型

    发现自己Ubuntu系统adb无法识别魅族 mx5机型.操作具体如下(其他机型依然适用): 一.Ubuntu环境 1.查看自己当前设备的idVendor lsusb命令直接查看当前usb设别列表,找到 ...

  2. Mysql逻辑模块组成

    总的来说,MySQL可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query c ...

  3. 《Linux&sol;Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  4. Sql Server通过BCP数据导出Excel

    1.1. bcp的主要参数介绍 bcp共有四个动作可以选择. (1) 导入. 这个动作使用in命令完成,后面跟需要导入的文件名. (2) 导出. 这个动作使用out命令完成,后面跟需要导出的文件名. ...

  5. oracle&colon;变长数组varray&comma;嵌套表&comma;集合

    创建变长数组类型 ) );  这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...

  6. iOS面试题02-数据存储

    1.如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 回答:编写SQL语句来操作原来表中的字段 1>增加表字段 ALETER TABLE 表名 ADD COLUMN 字段名 ...

  7. Monit &colon; 开源监控工具介绍

    · Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具.部署简单,并且不依赖任何第三方程序.插件或者库. Monit可以监控服务器进程.文件.文件 ...

  8. React native 无法弹出调试控件的问题

    React Native 在debug模式下,可以通过摇动手机,弹出调试选项.但是今天利用了cocoapods 把react native 文件整理后,调试界面就弹不出了,其他功能正常.查了好久,发现 ...

  9. VMWare给macos虚拟机扩容方法

    一开始在VMWareWorkStation上创建macos虚拟机时,我考虑到物理硬盘大小有限,只分配了34G,随着不断的使用,虚拟机消耗的虚拟磁盘逐渐增长,因磁盘空间不足而导致无法在虚拟机中使用xco ...

  10. qq空间爬取

    QQ_spider github传送门 QQ空间spider总结 花了将近3天吧,完成了低配版qq空间的爬虫,终于能上线刚一波了,还是蛮期待的. 流程很简单,模拟登录 ==>采集==>保存 ...