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.rhkb.cn/news/274794.html

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

相关文章

关于c++的protected关键字

关于c的protected关键字 分类引言例子1&#xff09;错误的demo2&#xff09;改正的demo protected在c中的含义与作用 分类 c基础知识 引言 做了很业务&#xff0c;c基础知识却忘了很多&#xff0c;今天看了一个例子&#xff0c;唤醒了我关于c三大特性之一----封装&#xff0…

信息抽取在旅游行业的应用:以景点信息抽取为例

开源项目推荐 今天先给大家推荐一个开源项目&#xff0c;多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 https://gitee.com/stonedtx/free-nlp-api 场景描述 在旅游行业…

echarts vue里画一个简单的环状饼图

<!--观察记录--><div class"teach-plan observe-record"><div class"title-common"><div class"title-common-left">观察记录</div></div><div class"teach-plan-cont"><div class"…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

蓝桥杯每日一题 走迷宫bfs 超超详细解释!!!

昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 答案&…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

【PHP+代码审计】PHP基础——流程控制

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

[nlp入门论文精读] | Transformer

写在前面 最近工作从CV转向了NLP&#xff0c;于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候&#xff0c;我们小组就选择了经典的Attention和Bert&#xff0c;但还有很多细节并不完全理解&#xff0c;实际使用时也很困惑。 因此这个系列就来记…

C语言快速入门之字符函数和字符串函数

一.字符分类函数和字符转换函数 C语言中有一系列的函数专门做字符分类的&#xff0c;就是区分一个字符是属于什么类型的&#xff0c;头文件是 #include <ctype.h> 以下是具体函数&#xff1a; 这些函数的使用方法类似&#xff0c;我们写出一些代码来举例。 例如&…

神经网络线性量化方法简介

可点此跳转看全篇 目录 神经网络量化量化的必要性量化方法简介线性对称量化线性非对称量化方法神经网络量化 量化的必要性 NetworkModel size (MB)GFLOPSAlexNet2330.7VGG-1652815.5VGG-1954819.6ResNet-50983.9ResNet-1011707.6ResNet-15223011.3GoogleNet271.6InceptionV38…

【力扣精选算法100道】——二进制求和

LCR 002. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 目录 &#x1f388;了解题意 &#x1f388;算法分析 &#x1f6a9;cur1>0 &#x1f6a9;cur2>0 &#x1f6a9;t &#x1f388;实现代码 &#x1f388;了解题意 遵循二进制加法法则&#xff0c;如果俩…

单通道 6 阶高清视频滤波驱动电路芯片D1675,一款高清视频信号译码、编码的滤波器和缓冲器

1、概述&#xff1a; D1675单电源工作电压为2.5V到5V&#xff0c;是一款高清视频信号译码、编码的滤波器和缓冲器。与使用分立元件的传统设计相比&#xff0c;D1675更能节省PCB 板面积&#xff0c;并降低成本以及提高视频信号性能。D1675集成了一个直流耦合输入缓冲器、一个消除…

一分钟就能搞定发成绩这件事,你信吗?

快节奏的现代教育环境中&#xff0c;每一分钟都显得尤为宝贵。对于老师和家长来说&#xff0c;及时、准确地获取学生的成绩信息是关乎学生学习进度和效果的重要环节。那么&#xff0c;有没有一种方法能在短短一分钟内完成成绩的发布和查询呢&#xff1f;答案是肯定的&#xff0…

OceanBase4.2版本 Docker 体验

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

闲聊电脑(7)常见故障排查

闲聊电脑&#xff08;7&#xff09;常见故障排查 夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;平时遇到电脑故障该咋处理呢&#xff1f; 冰箱&#xf…

linux 查看打开使用了哪些端口

你可以使用 netstat 命令来查看Linux系统中正在使用的端口。例如&#xff0c;要查看所有正在使用的TCP和UDP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tulpn如果你只想查看所有正在使用的TCP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tpln 如果你只…

C#,红黑树(Red-Black Tree)的构造,插入、删除及修复、查找的算法与源代码

1 红黑树(Red-Black Tree) 如果二叉搜索树满足以下红黑属性,则它是红黑树: 每个节点不是红色就是黑色。根是黑色的。每片叶子(无)都是黑色的。如果一个节点是红色的,那么它的两个子节点都是黑色的。对于每个节点,从节点到后代叶的所有路径都包含相同数量的黑色节点。红…

使用yarn创建vite+vue3electron多端运行

文章目录 第一步 使用yarn创建vitevue3项目遇到创建报错看 第二步 引入electron第三步 创建main.js在electron下面的main.js写入下面代码 第四步 安装同时运行多条命令npm包&&修改package.json文件npm包增加一条electron运行脚本命令 效果图 第一步 使用yarn创建vitevu…

关于- bounding box reparameterization

因为detr以及大部分detr的变体都是将box的x,y,w,h映射到[0~1]之间&#xff1b; 这样对于小目标的检测的话就会比较困难&#xff0c;因为损失被大目标主导了&#xff0c; 所以将box的坐标编码为跟长宽占比的数值&#xff0c;具体如图图中描述所示&#xff1a;

SA3D:基于 NeRF 的三维场景分割方法

Paper: Cen J, Zhou Z, Fang J, et al. Segment anything in 3d with nerfs[J]. Advances in Neural Information Processing Systems, 2024, 36. Introduction: https://jumpat.github.io/SA3D/ Code: https://github.com/Jumpat/SegmentAnythingin3D SA3D 是一种用于 NeRF 表…