C++开发基础——IO操作与文件流

一,基础概念

C++的IO操作是基于字节流,并且IO操作与设备无关,同一种IO操作可以在不同类型的设备上使用。

C++的流是指流入/流出程序的字节序列,在输入操作中数据从外部设备(键盘,文件,网络等)流入程序,在输出操作中数据从程序流向外部设备(控制台,文件,网络等)。

流充当了程序与外部设备之间的管道,使程序中的具体操作独立于各种外部设备。

常用的流:基础输入输出流,文件流,字符串流。

流的实例不仅包含普通的数据,还包含表示当前位置的数据。

在C++编程中,流的使用步骤如下:

1.实例化一个流对象。

2.将流对象关联到实际的外部设备(键盘,控制台,文件,网络等)。

3.调用流对象中提供的成员函数,完成数据的转换、传输等操作。

4.断开流对象与外部设备的关联,比如关闭文件。

5.释放流对象占用的内存资源。

流具有缓冲区,大部分时候,往流中写入数据后,流并不会马上把数据输出到指定目的地,为了提高性能,流先用缓冲区将数据存储起来,缓冲区达到一定大小后再输出到指定目的地。

刷新缓冲区的条件:

遇到触发的函数,如endl。

流对象离开作用域,被析构时。

流的缓冲区被写满。

显式调用flush()函数。

流对应的头文件有<ostream>, <fstream>等。

流支持的数据类型:数值类型,指针,char类型,std::string类,C风格字符串等。

std标准库包含预定义的流的实例,有cout,cin,cerr,clog等。

二,输出流

1.输出流的定义

对应运算符:operator<<            

含义:流中的数据输出到外部设备,"设备  <<  程序"。

<<运算符返回的是对一个流的引用,因此,可以连续调用多次<<运算符,来连续输出多段数据。

C++流遇到C风格的转义字符,比如“\n”,可以自动做解析。

“\n”和end都可以实现换行,但是“\n”只是换行,而end还会刷新缓存。

2.输出流的原始方法

(1).输出

put():写入单个字符。

write():写入字符数组。

代码样例,输出到控制台打印:

const char* test = "hello there";
cout.write(test, strlen(test));
cout.put('a');

(2).刷新缓冲区

flush()

代码样例,显式刷新流:

cout << "abc";
cout.flush();
cout << "de";
cout << "fgh";
cout << endl;

(3).判断流是否可用

good():可用时,返回true。

代码样例:

if (cout.good()){cout << "All good" << endl;
}

bad():发生致命错误时,返回true。

fail():最近一次操作失败时,返回true。

代码样例:

cout.flush();
if (cout.fail()){cerr << "Unable to flush to standard out" << endl;
}

3.输出流的操作算子

以下算子可以用来格式化输出流:

endl:输出一个行结束序列,并刷新缓存。

hex、oct、dec:以十六进制、八进制、十进制输出数字。

setw:设置输出数值型数据的字段宽度。

setfill:设置用于填充的字符。

setprecision:设置输出小数时的小数位数。

代码样例:

#include <chrono>
#include <iostream>
#include <iomanip>using namespace std;int main()
{int i = 123;cout << "The result is:" << setw(6) << i << endl;cout << "The result is:" << setfill('*') << setw(6) << i << endl;float j = 0.123456;cout << "The result is:" << setprecision(3) << j << endl;
}

运算结果:

The result is:   123
The result is:***123
The result is:0.123

三,输入流

1.输入流的定义

对应运算符:operator>>

含义:流中的数据从设备读入到程序中,"设备  >>  程序"。

2.输入流的原始方法

输入流也可以像输出流一样调用good()、bad()、fail()等方法,还可以调用eof()判断流的指针是否到达尾部。

(1).输入

get():读取单个字符。

read():读取字符数组。

(2).回退

unget():在读取的时候回退一个位置,将读取的前一个字符放回到流中。如果当前位置是流的起始位置,调用unget()会失败。

putback():和unget()一样支持回退,但是putback()可以指定放回的字符。

(3).预览

peek():预览调用get()后返回的下一个值。

(4).读取整行

getline():从输入流中获得一行数据,用法区别于C++中的std::getline()函数。

3.输入流的操作算子

以下算子可以用来格式化输入流:

hex、oct、dec:以十六进制、八进制、十进制读入数字。

skipws:输入时跳过空白字符,默认情况下为skipws。

noskipws:输入时读取空白字符作为标记。

代码样例:

#include <iostream>
#include <sstream>int main()
{char c1, c2, c3;std::istringstream("a b c") >> std::skipws >> c1 >> c2 >> c3;std::cout << "skipws behavior:"" c1 = " << c1 <<" c2 = " << c2 <<" c3 = " << c3 << '\n';std::istringstream("a b c") >> std::noskipws >> c1 >> c2 >> c3;std::cout << "noskipws behavior:"" c1 = " << c1 <<" c2 = " << c2 <<" c3 = " << c3 << '\n';return 0;
}

运行结果:

skipws behavior: c1 = a c2 = b c3 = c
noskipws behavior: c1 = a c2 =   c3 = b

四,字符串流

对应头文件:<sstream>

常用字符串流:

std::ostringstream:将数据写入字符串

std::istringstream:从字符串读取数据

std::stringstream:双向操作字符串

1.字符串流支持的模式

ios::in:进行输入操作。
ios::out:进行输出操作。
ios::app:在字符串流后面追加。
ios::trunc:截断字符串。
ios::binary:用于二进制(原始字节)IO 操作,而不是基于字符的操作。
ios::ate:将指针移动到流的末尾。

2.字符串流的常用方法

字符输入流的操作:

operator>>:格式化输入。

get:读取单个字符。

read:读取字符数组。

getline:读取整行字符。

readsome:读取若干数量的字符。

peek:预览下一个字符。

unget:读取期间,回退一个字符。

tellg:返回流中的当前操作位置。

seekg:移动到流中的指定位置。

sync:与存储设备同步。

字符输出流的操作:

operator<<:格式化输出。

put:写入单个字符。

write:写入字符数组。

tellp:返回流中的当前操作位置。

seekp:移动到流中的指定位置。

flush:刷新数据到存储设备。

和状态相关的操作:

good()、bad()、fail()、eof():前面已经讲过。

setstate:设置状态。

clear:清除状态。

3.代码样例

#include <iostream>
#include <sstream>
#include <string>
#include <map>
using namespace std;int main()
{string mystr = "how to study cpp very very good";map<string, int> myMap;stringstream ss(mystr);string Word;while (ss >> Word){myMap[Word]++;}map<string, int>::iterator it;for (it = myMap.begin(); it != myMap.end(); it++){cout << it->first << " -> "<< it->second << "\n";}return 0;
}

运行结果:

cpp -> 1
good -> 1
how -> 1
study -> 1
to -> 1
very -> 2

五,文件流

头文件:<fstream>

常用文件流:

std::ofstream:将数据写入文件

std::ifstream:从文件读取数据

std::fstream:双向操作文件

std::ofstream, std::ifstream文件流的析构函数会自动关闭底层文件,所以操作完文件流以后不需要显式调用close()函数。

1.文件流支持的模式

ios::in:进行输入操作。
ios::out:进行输出操作。
ios::app:在文件流后面追加。
ios::trunc:截断文件内容。
ios::binary:用于二进制(原始字节)IO 操作,而不是基于字符的操作。
ios::ate:将指针移动到流的末尾。

文件流默认以文本模式打开文件流,如果指定了ios_base::binary,文件流将以二进制模式被打开。

2.文件流的常用方法

文件输入流的操作:

operator>>:格式化输入。

get:读取单个字符。

read:读取字符数组。

getline:读取整行字符。

readsome:读取若干数量的字符。

peek:预览下一个字符。

unget:读取期间,回退一个字符。

tellg:返回流中的当前操作位置。

seekg:移动到流中的指定位置。

sync:与存储设备同步。

文件输出流的操作:

operator<<:格式化输出。

put:写入单个字符。

write:写入字符数组。

tellp:返回流中的当前操作位置。

seekp:移动到流中的指定位置。

flush:刷新数据到存储设备。

和状态相关的操作:

good()、bad()、fail()、eof():前面已经讲过。

setstate:设置状态。

clear:清除状态。

3.代码样例

#include <iostream>
#include <fstream>
using namespace std;
int main()
{fstream obj;obj.open("test.txt", ios::out);obj << "Hello World";int pos1, pos2;pos1 = obj.tellp();cout << pos1 << endl;obj.seekp(0, ios::end);obj << "C++";pos2 = obj.tellp();cout << pos2 << endl;obj.close();
}

运行结果:

11
14

六,参考阅读

《C++高级编程》

https://zh.cppreference.com/w/cpp/io/basic_stringstream

https://zh.cppreference.com/w/cpp/io/basic_ifstream

https://www3.ntu.edu.sg/home/ehchua/programming/cpp/cp10_io.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12 list的使用

文档介绍 文档介绍 1.list是可以在常数范围内的任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2.list的底层是带头双向链表循环结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和…

大话设计模式 :UML类图 原版部分

目录 原书部分总结各符号继承关系实现接口关联关系聚合关系组合关系依赖关系 原书部分 总结 各符号 ‘’ 表示public ‘-’ 表示private ‘#’表示protected 棒棒糖表示法 类内实现的接口 用棒棒糖的形状在外部具体实现 继承关系 实现接口 关联关系 聚合关系 组合关系 依赖…

Redis核心数据结构之压缩列表(二)

压缩列表 压缩列表节点的构成 encoding 节点的encoding属性记录了节点的content属性所保存数据的类型及长度: 1.一字节、两字节或者五字节长&#xff0c;值得最高位为00、01或者10的是字节数组编码:这种编码表示节点的content属性保存着字节数组&#xff0c;数组的长度由编…

小迪安全39WEB 攻防-通用漏洞CSRFSSRF协议玩法内网探针漏洞利用

#知识点&#xff1a; 逻辑漏洞 1、CSRF-原理&危害&探针&利用等 2、SSRF-原理&危害&探针&利用等 3、CSRF&SSRF-黑盒下漏洞探针点 #详细点&#xff1a; CSRF 全称&#xff1a;Cross-site request forgery&#xff0c;即&#xff0c;跨站请求…

ThingsBoard开源物联网平台介绍

1. Thingsboard 简介 ThingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。它使用行业标准的物联网协议&#xff08;MQTT、CoAP和HTTP&#xff09;实现设备连接&#xff0c;并支持云和本地部署。ThingsBoard结合了可扩展性、容错…

Springboot+vue的疫情居家办公系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的疫情居家办公系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

上海计算机学会 2023年11月月赛 丙组T5 推箱子(数学 思维 排序)

第五题&#xff1a;T5推箱子 标签&#xff1a;排序、数学、思维题意&#xff1a;给定 t t t组数据&#xff0c;每组数据给定长度为 n n n的字符串&#xff0c; 表示箱子&#xff0c; _ \_ _表示空格&#xff0c;求把箱子都推到一起&#xff08;即两两箱子之间没有空格&#…

Ubuntu18.04 安装搜狗输入法

一. 概述 自己的Ubuntu 18.04系统配置中文搜狗输入法&#xff0c;安装步骤&#xff0c;亲测可用 二. 安装步骤 2.1 确认系统版本和CPU架构 查看Ubuntu系统版本号&#xff0c;通过命令 lsb_release -a wuubuntume:~$ lsb_release -a No LSB modules are available. Distr…

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候&#xff0c;提示&#xff1a;unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的&#xff0c;需要在setting里面设置&#xff1a; 点击Android Studio - Preferences&#xff0c;在 Appeara…

Linux中文件的权限

我们首先需要明白&#xff0c;权限 用户角色 文件的权限属性 一、拥有者、所属组和other&#xff08;用户角色&#xff09; 以文件file1为例 第一个箭头所指处即是文件的拥有者&#xff0c;拥有者为zz 第二个箭头所指处即使文件的所属组&#xff0c;所属组为zz 除去拥有者…

基于log4cpp封装日志类

一、log4cpp的使用 1. 下载log4cpp log4cpp官方下载地址 2. 安装log4cpp 第一步&#xff1a;解压 tar zxvf log4cpp-1.1.4.tar.gz 第二步&#xff1a;进入log4cpp文件夹并执行 ./configure tips&#xff1a;如果是ARM架构的CPU可能会失败&#xff0c;如下面这种情况&a…

Ubuntu查看ros版本-linux查看ros版本

使用ros带的rosversion命令即可查看自己的ros版本&#xff1a; rosversion -d

如何在Windows中检测任何串行设备的COM端口?这里有一个应用程序

使用USB串行设备并不是最简单的工作流程。我们首先需要标识“设备管理器”下的COM端口,然后需要告诉应用程序使用该COM端口。 如果我们可以接收COM设备的自动通知,然后将它们配置为使用特定应用程序打开,该怎么办?Serial Port Notifier程序正是我们所需要的。 在最基本的级…

【计算机网络】UDP/TCP 协议

TCP 协议 一、传输层1. 再谈端口号2. 端口号范围划分3. 进程和端口号4. netstat5. pidof 二、UDP 协议1. UDP 协议端格式(报文)2. UDP 的特点3. 面向数据报4. UDP 的缓冲区 三、TCP 协议1. 认识 TCP2. TCP 协议段格式&#xff08;1&#xff09;4 位首部长度&#xff08;2&#…

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

NVidia NX 中 ROS serial软件包的安装

自己装的ROS是noetic版本&#xff0c;受限于网络&#xff0c;直接用命令安装串口包不行。于是手动安装了一次。 1 下载源码 git clone https://github.com/wjwwood/serial.git 或者直接在浏览器里面输入 https://github.com/wjwwood/serial.git 2 解压 然后在serial&#xf…

OPC UA 服务器的Web访问

基于Web 的应用非常普及&#xff0c;例如基于web 的SCADA &#xff0c;物联网 Dashboard 等等&#xff0c;那么基于Web 的应用如何访问OPC UA 服务器呢&#xff1f;本博文讨论这方面的问题。 Web 的通信方式 Web 是我们通常讲的网站&#xff0c;它由浏览器&#xff0c;HTTP 服…

sqllab第二关通关笔记

知识点整理&#xff1a; 数值型注入判断手法 1/1 1/0 回显不同错误注入函数 extractvalue(xml_flag,xpath) xml_flag&#xff1a;文件表示符xpath&#xff1a;文件路径&#xff1b;不能识别‘~’ ‘#’ 等特殊字符&#xff1b;遇到就报错并打印xpath内容~(十六进制表示)&#…

YOLOv9改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址:arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制,允许模型根据输入的内容动态调整注意力权重。在传统的Transformer中,注意力是…

前后端链条产生的跨域问题

环境&#xff1a; vitevue3 .net 6 vsstudio2022C# asp .net core webapi 看别的up说这个第一条报错是因为&#xff1a;后端没有允许跨域导致的 解决办法: 1.在后端添加允许跨域 Program.cs //添加跨域策略builder.Services.AddCors(options >{options.AddPolicy(…