C++中的输入输出流iostream、文件流fstream、字符串流sstream解释

news2025/6/19 7:43:22

文章目录

  • 前言
  • 流的理解
  • 流的优势
  • C++中流的分类
      • IO流
      • 字符串流sstream
        • 基本概念
        • 使用
      • 文件流fstream
        • 文本文件
          • 写文件
          • 读文件

前言

流的解释。

流的理解

流的本质是一种对象

流是介于数据程序之间的一个中转设备。

因为流的存在,使得我们可以不需要直接操作数据,而是通过操作流的方式间接对数据进行操作。

流的优势

统一操作标准。

无论对于何种数据,以及数据的类型如何,只要将这个数据和流关联起来,那么我们就可以不用考虑数据到底是如何存储的,只需要按照流的操作标准来进行操作即可,这就是统一了操作标准。

上面说到,流的本质是一个对象,因此对于流而言,存在着许多的方法,这些方法为我们操作数据提供了统一的接口,对我们甚至可以做到在不更改代码的前提下,操作不同的数据。

C++中流的分类

在这里插入图片描述

C++中流主要分为三类:

  • IO流: 输入输出流,iostream
  • 文件流: 对于文件的操作,fstream
  • 字符串流: 主要实现对于字符串的操作,stringstream

IO流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pt9XOfB9-1681742287821)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230417223559721.png)]

这三者在本质上还是一样的,都是抽象出方法,只不过操作的对象不同罢了。以下贴出这几个类之间的关系图:

在这里插入图片描述

由上图可见,为什么说可以像使用cin/cout的方式去使用fstream,因为fstream本身是继承自iostream的。

字符串流sstream

基本概念

用内存中的string类型变量作为输入和输出的对象.。
特点:

  • 与标准输入输出流相同,能够进行文本与二进制之间的相互转换。
  • 向string存数据⇔ \Leftrightarrow⇔cout 二进制转为ASCII。
  • 从string取数据⇔ \Leftrightarrow⇔cin ASCII转为二进制。
  • 无需打开关闭。
  • 能够存放各种类型数据。

使用

#include <sstream>
ostringstream ostr;//输出流
istringstream istr;//输入流
stringstream str;//输入/输出流

sstring头文件定义了三个类型来支持内存IO操作,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。

istringstream从string读取数据,ostringstream向string写入数据,stringstream既可以向string写入数据也可以向string读取数据。

在这里插入图片描述

#pragma once
#include<iostream>
#include<sstream>
#include<string>

class Stream {
public:
	Stream() {}
	Stream(std::string& str)
		:str_(str)
	{}
	~Stream() {};

	//输出流
	void OsStringStream();
	//输入流
	void IsStringStream();
	//输入输出流
	void StringStringStream();

protected:
	std::string str_;
};

#include"stream.h"

void Stream::OsStringStream() {
	std::ostringstream oss(str_);
	std::cout << oss.str() << std::endl;
}

void Stream::IsStringStream() {
	std::string line;
	std::istringstream iss(str_);
	std::getline(iss, line);
	std::cout << line << std::endl;

	//创建输入流
	std::istringstream str;
	//拷贝字符串到输入流中
	str.str("bye bye");
	//用str_str返回str.str()的拷贝
	std::string str_str = str.str();
	std::cout << str_str << std::endl;
}

void Stream::StringStringStream() {
	std::stringstream ss1(str_);
	std::cout << ss1.str() << std::endl;
}

#include"stream.h"

int main() {
	std::string str("ni hao");
	Stream stream(str);
	stream.IsStringStream();
	stream.OsStringStream();
	stream.StringStringStream();
	return 0;
}

文件流fstream

img

程序运行时,产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化,C++对文件操作需要包含头文件 < f s t r e a m > 。文本类型分为两种:

(1)文本文件:文件以文本的ASCII码的形式存储在计算机中。
(2)二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们。

操作文件三大类:

  • ofstream:写

  • ifstream:读

  • fstream:读写

文本文件

写文件

步骤如下:

  • 包含头文件:#include< fstream>
  • 创建流对象:ofstream ofs;
  • 打开文件:ofs.open(“文件路径”,打开方式);
  • 写数据:ofs<<“写入的数据”;
  • 关闭文件:ofs.close();

打开方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9jo0uZ3-1681742287823)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230417223237070.png)]

在这里插入图片描述

注:文件打开方式可以配合使用,利用|操作符。

void Csv::WriteCsvFile() {
	//std::ofstream out_file("data.csv", std::ios::out); //std::ios::out 文件不存在则创建文件,有文件则清空文件
	std::ofstream out_file;
	out_file.open("data.csv", std::ios::out);
	if (!out_file) {
		std::cout << "open file failed" << std::endl;
		return;
	}
	for(int i = 0; i < 5; ++i) {
		out_file << 12 << ",";
		out_file << 13 << ",";
		out_file << 14 << std::endl;
	}
	out_file.close();
	std::cout << "write file successed" << std::endl;
}

在这里插入图片描述

读文件

步骤如下:

  • 包含头文件:#include< fstream>
  • 创建流对象:ifstream ifs;
  • 打开文件,并判断文件是否打开成功:ifs.open(“文件路径”,打开方式);
  • 读数据:四种读取方式
  • 关闭文件:ifs.close();

在这里插入图片描述

在这里插入图片描述

#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>

class Csv {
public:
	Csv() {}
	~Csv() {}
	void ReadCsvFile();
	void WriteCsvFile();
};

#include"csv.h"

void Csv::ReadCsvFile() {
	//std::ifstream in_file("data.csv", std::ios::in);
	std::ifstream in_file;
	in_file.open("data.csv", std::ios::in);
	if (!in_file) {
		std::cout << "open fill failed" << std::endl;
	}
	int num = 0;
	std::string line;
	std::string file;
	while (std::getline(in_file, line)) {
		std::string file;
		// 将整行字符串line读入到字符串流iss中
		std::istringstream iss(line);
		std::getline(iss, file, ',');
		//将刚刚读取的字符串转换成int
		std::cout << std::atoi(file.c_str()) << " ";
		std::getline(iss, file, ',');
		std::cout << std::atoi(file.c_str()) << " "; 
		std::getline(iss, file, ',');
		std::cout << std::atoi(file.c_str()) << std::endl;
		num++;
	}
	std::cout << "读取了" << num << "行" << std::endl;
	if (5 == num) {
		std::cout << "read file success" << std::endl;
	}
	in_file.close();
}

void Csv::WriteCsvFile() {
	//std::ofstream out_file("data.csv", std::ios::out);
	std::ofstream out_file;
	out_file.open("data.csv", std::ios::out);
	if (!out_file) {
		std::cout << "open file failed" << std::endl;
		return;
	}
	for(int i = 0; i < 5; ++i) {
		out_file << 12 << ",";
		out_file << 13 << ",";
		out_file << 14 << std::endl;
	}
	out_file.close();
	std::cout << "write file successed" << std::endl;
}

#include"csv.h"

int main() {
	Csv csv;
	csv.WriteCsvFile();
	csv.ReadCsvFile();
	return 0;
}

每个文件流都有一个默认的文件模式,ifstream关联的文件默认以in模式打开,ofstream关联的文件默认以out模式打开,fstream关联的文件默认以in和out模式打开。

ofstream out; // 未指定文件打开模式
out.open("test.txt"); // 模式隐含设置为输出和截断
out.close(); // 关闭out
out.open("test2.txt",ofstream::app); //模式为输出和追加
out.close(); //关闭out 

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

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

相关文章

瑞吉外卖Linux

1、linux简介 Linux系统版本 Linux系统分为内核版和发行版 内核版&#xff1a; 由LinusTorvalds及其团队开发、维护 免费、开源 负责控制硬件 发行版&#xff1a; 基于Linux内核版进行扩展 由各个Linux厂商开发、维护 有收费…

自动插入匹配与标题相关的百度图片或者搜狗图片软件-批量插入txt文档-Chatgpt批量写文章配图神器

1、我们用《Chatgpt 3.5-turbo软件》批量生成txt文档&#xff0c;但是这样txt文档里不带图片&#xff0c;直接发布到网站上&#xff0c;光有文字没有图片&#xff0c;效果也不是很理想&#xff0c;就需要一款配图软件。 2、该软件根据txt标题自动匹配百度图片或者搜狗图片里的…

Redis高可用

最近离职后还没开始找工作&#xff0c;在找工作前去学习一下Redis高可用方案。 目录Redis高可用高可用的概念实现方式持久化主从复制简单结构优化结构优缺点哨兵模式&#xff08;Sentinel&#xff09;哨兵进程的作用自动故障迁移(Automatic failover)优缺点集群优缺点Redis高可…

300左右买什么蓝牙耳机好?300元内音质最好的蓝牙耳机

在市场上有很多蓝牙耳机。当时无线蓝牙耳机如此流行也是由苹果公司提出。作为首次取消手机上3.5毫米耳机插孔的手机&#xff0c;后面许多手机也纷纷效仿。但这也促进了科学技术的发展。下面分享几款300元内音质表现不错的蓝牙耳机。 第一款&#xff1a;南卡小音舱Lite2蓝牙耳机…

【深度思考】人工智能技术对未来各行业的影响,我们该如何应对?

目录 1、AI的应用对行业带来的机遇 2、AI将冲击哪些行业 3、如何应对AI对个人发展的挑战 4、AI对于程序员的冲击 随着技术的不断发展&#xff0c;AI已经开始深刻影响着各行各业。从生产制造到金融、医疗和交通等行业&#xff0c;人工智能技术都在发挥着越来越重要的作用。现…

ijkplayer编译支持x264编码器

ijkplayer作为一款基于ffmpeg在移动端比较流行的播放器&#xff0c;并没有集成编码器。如果使用ffmpeg且需要音视频编码功能的话就需要自己手动集成。 编译支持x264编码器的流程主要参考了 ijkplayer支持x264编译 - 简书 原理与ijkplayer编译支持openssl的流程类似。 1 下载x…

项目管理 | 10年项目经理推荐的一份书单:你认真读过几本?

作为一名项目经理&#xff0c;我们需要在团队之间协调合作&#xff0c;管理预算和资源&#xff0c;确保项目按时、按预算顺利完成。因此&#xff0c;学习项目管理知识是提高我们的职业素养、职业技能和职业竞争力的关键。 今天就来给大家分享几本具有广泛影响力和权威性的项目…

如何动态的给一个类增加功能?

装饰器模式概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为&#xff0c;在现实生活中&#xff0c;这种情况也到处存在&#xff0c;例如一张照片&#xff0c;我们可以不改变照片本身&#xff0c;给它增加一个相框&#xff0c;使得它具有防潮的功能&a…

跨域问题?别担心!Spring Boot的5种奇巧淫技解救你

来源&#xff1a;https://blog.csdn.net/weter_drop/article/details/112135940 一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同…

SpringBoot自定义注解+异步+观察者模式实现业务日志异步入库

SpringBoot自定义注解异步观察者模式实现业务日志异步入库前言基础环境导入依赖编写yml配置数据库设计代码实现实体类编写注解业务类型枚举编写切片ip工具类事件发布监听者Controller控制层servicemapper验证前言 我们在企业级的开发中&#xff0c;必不可少的是对日志的记录&a…

VSCode将markdown文件导出为带书签的PDF文件

背景 之前找工作的总结性文章&#xff0c;全是markdown形式的想直接变成PDF好携带。方便查找 初步探索遇到的问题 markdown直接在chrome钟打开&#xff0c;右键有打印选项&#xff0c;有一说一&#xff0c;效果不错&#xff0c;唯一缺点&#xff0c;没书签。 怎么办 查资料…

收音机知识,调谐(选频/滤波),调制(升频)

参考&#xff1a;https://www.bilibili.com/video/BV1d14y1N7nm/?spm_id_from333.999.0.0&vd_source00bd76f9d6dc090461cddd9f0deb2d51 有关知识提纲整个信号的传输变化调谐人耳听到声音的频率范围&#xff08;20~20000Hz&#xff09;天线和传送信号的波长关系波长和天线长…

LeetCode 剑指 Offer II 106. 二分图【二分图匹配】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

京东pop店铺订单导出

下载安装与运行 下载、安装与运行 语雀 特别提醒 只能导出已登录店铺的订单导出的收件人手机号是虚拟号 功能 主要是方便线下工厂发货的店主 所见即所得的导出自由选择导出项自由排序Excel导出列顺序导出过程中有进度提示&#xff0c;用户可以随时提前中止 什么是所见即所…

Linux网络编程概述

文章目录 前言一、客户端与服务端二、客户端程序编写三、程序的编译和运行总结前言 本篇文章将带大家来正式学习Linux网络编程。 一、客户端与服务端 一般认为服务器是一个长时间运行的程序(既守护程序)他只在相应来自网络请求时才发送网络消息 协议的另一端是客户端程序,…

Swagger文档注释

本文以DRF框架为例使用 为什么要接口文档注释 一. 方便后端调试与后续接口更新&#xff1b; 二. 对于大型前后端分离项目&#xff0c;前后端人员是分开开发的&#xff0c;甚至前端的人你都不知道远在何处&#xff0c;这时候接口文档的重要性就太重要了。 三. 接口注释文档常用…

巧用千寻位置GNSS软件| 点放样操作指南

在工程测量中&#xff0c;点放样就是将设计或图纸上的点位在实地上测量出来&#xff0c;将目标坐标输入软件在实地放样出来的过程。本文将围绕“如何在千寻位置GNSS软件上完成点放样操作”进行分步骤讲解。点击【测量】->【点放样】->【坐标点库】&#xff0c;选择一个点…

气传导和骨传导耳机的区别?这两种耳机哪个更好更实用?

气传导和骨传导耳机的最大区别&#xff1a;就在于发声原理的不同。 这两种耳机&#xff0c;一种是空气传播声音&#xff0c;一种是骨骼固体传声。 气传导耳机&#xff0c;就是声音从外部传过来&#xff0c;并由外耳、中耳传导到内耳&#xff0c;这是我们日常中接触最多的传导…

第三方支付接口测试面试要点

第三方支付接口测试面试要点 第三方支付接口测试&#xff0c;主要是看你的接口功能实现的是否满足需求&#xff0c;以及你的测试思路是否正确。因此&#xff0c;接口测试工程师要从以下几个方面来准备。 首先&#xff0c;我们需要了解第三方支付的流程; 最后&#xff0c;我们需…

Spring 之 AOP 原理详解

Spring 是一个流行的 Java 企业应用程序开发框架。其中的 AOP&#xff08;面向切面编程&#xff09;是 Spring 框架中的一个核心概念。本文将介绍 Spring AOP 的底层实现原理&#xff0c;并通过源代码解析来详细阐述其实现过程。 什么是AOP&#xff1f; AOP是一种编程范式&…