C++基础——输入输出(文件)

一、标准输入输出流

C++ 的输入输出是程序与用户或外部设备(如文件、网络等)之间交换信息的过程。

C++ 提供了丰富的标准库来支持这种交互,主要通过流的概念来实现。

:抽象概念,表示一连串的数据(字节或字符),数据按先进先出的顺序传输。

        输入流是从外部源到程序的数据传输,而输出流则是从程序到外部目标的数据传输。

C++输入/输出类的层次结构

解释:

ios_base:这是IO流的基本信息类,它定义了所有IO流共有的属性和行为。

ios:这是IO流的基类,它继承自ios_base。ios类提供了通用的输入和输出功能。

istream:这是一个通用的输入类,它继承自ios。

                cin对象是istream的一个实例,用于从标准输入(通常是键盘)读取数据。

ostream:这是一个通用的输出类,它继承自ios。

                cout和cerr对象都是ostream的实例,分别用于向标准输出(通常是屏幕)和错误                          输出写入数据。

iostream:这是一个通用的输入/输出类,它同时继承自istream和ostream。

                iostream类可以进行双向的数据传输。

ifstream:这是一个文件输入类,它继承自istream。ifstream类用于从文件中读取数据。

ofstream:这是一个文件输出类,它继承自ostream。ofstream类用于向文件中写入数据。

fstream:这是一个文件输入/输出类,它同时继承自ifstream和ofstream。

                fstream类可以对文件进行双向的数据传输。

输入输出cin/cout和提取符和操作符:

在C++中,cin 和 cout 是两个常用的I/O流对象,它们分别代表标准输入流和标准输出流。

在C++中,>> 和 << 是两个常用的流操作符,它们分别用于从输入流中读取数据和向输出流写入数据。

通常两者结合

#include<iostream>

int main()
{
	int a;
	std::cin >> a;
	std::cout << a;
	return 0;
}

//输入:1
//输出结果是:1

get与getline函数:

get和getline函数都有两个用法 :

std::cin.get和std::get,std::cin.getline和std::getline

std::cin.get和std::cin.getline是在std::istream 类的成员函数

std::get和std::getline是标准库里的函数

两者的区别:

处理换行符:getline函数在读取完一行后会自动丢弃换行符,而get函数(特别是带有分隔符的版本)会保留分隔符(通常是换行符)在输入队列中。

目标容器:get通常用于填充字符数组,而std::getline的全局版本可以直接读入std::string。

自动终止:getline在达到指定长度或遇到分隔符时会自动停止并处理字符串结束标志,而使用get时可能需要手动处理字符串的结束。

get函数的使用:

std::get

std::get一般为访问一些容器中的元素:

举例子:

访问元组里的元素

std::tuple<int, std::string> my(10, "Test");
int i = std::get<0>(my); 
// 访问第一个元素,类型为 int
std::string s = std::get<1>(my); 
// 访问第二个元素,类型为 std::string
// 这里,get 是模板函数,它的模板参数是元素的位置(从0开始),返回对应类型引用。
std::cin.get

1.std::cin.gin()

这个版本没有参数,它从输入流中读取下一个字符,包括空格和换行符。

如果到达文件尾或者遇到错误,它会返回 EOF(通常定义为 -1),否则返回读取字符的 ASCII 值。

功能:主要是读入缓存区里的换行符

2.std::cin.get(a)

a是要输入数据的变量名

3.std::cin.get(a,b)

a是要输入数据的变量名,b是要读入的字符数会读入n-1个字符,最后一个是'/0'

4.std::cin.get(a,b,c)

a是要输入数据的变量名,b是要读入的字符数会读入n-1个字符,最后一个是'/0',c是要遇到哪个字符就提前结束输入

getline函数的使用:

std::getline

针对于string容器、

有两种常用的用法:

istream& getline(istream& is, string& str);

从输入流is读取字符直到遇到换行符(\n),并将读取的内容(不包括换行符)存入str中。

#include<iostream>
#include<string>
int main()
{
	std::string a;
	std::getline(std::cin, a);
	std::cout << a;
	return 0;
}

如果之前str已有内容,这些内容会被新读取的字符串覆盖。

istream& getline(istream& is, string& str, char delim);

同上,但允许用户指定分隔符delim。

当遇到此分隔符时停止读取,并将读取的内容(不包括分隔符)存入str。

#include<iostream>
#include<string>
int main()
{
	std::string a;
	std::getline(std::cin, a,'a');
	std::cout << a;
	return 0;
}
std::cin.getline

istream& getline(char* s, streamsize n);

从输入流读取最多n个字符(不包括终止的空字符'\0')到字符数组s中。

如果在读取n-1个字符之前遇到文件结束或换行符,则停止读取,并在s末尾添加'\0'。

istream& getline(char* s, streamsize n, char delim);

类似于上一个版本,但读取会在遇到delim字符或读取n-1个字符后停止,并在s末尾添加'\0'。


二、文件输入输出流:

程序运行时,产生的数据都属于临时数据,程序一旦运行结束就会被释放,通过文件可以将数据持久化。

C++中对文件进行操作需要包含头文件<fstream>

文件类型:

文本文件-文件以文本的ASCII码形式存储在计算机中

二进制文件-文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们

操作文件的三大类:

ofstream:写操作 ifstream:读操作 fstream:读写操作

ios::in 

为输入(读)而打开文件
ios::out为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app所有输出附加在文件末尾
ios::trunc 如果文件已存在则先清空该文件,若文件不存在则创建文件
ios::binary二进制方式打开,不做字符转换(别用string 有大bug)

这些表示符可以 用    |   进行组合 

写文件:

简单的写一个文件: 

#include<iostream>
#include<fstream>
int main()
{
	std::ofstream is;
	is.open("test.txt",std::ios::out);
	is << "aaaa";
	is.close();
	return 0;
}

 如果不指定文件路径,默认和你项目的文件路径一样

运行结果: 

 实际产生的文件:

也可以使用write进行写文件

流对象.write(指向要写入数据的缓冲区的指针,字节数)

 读文件:

#include<iostream>
#include<fstream>
int main()
{
	std::ifstream os;
	os.open("test.txt",std::ios::in);
	//第一种
	/*char put[10] = { 0 };
	while (os>>buf)
	{
		std::cout << put << endl;
	}*/
	//第二种
	/*char buf[10] = { 0 };
	while (ifs.getline(put,sizeof(put)))
	{
		std::cout << put << endl;
	}*/
	//第三种
	/*#include<string>
    string put;
	while (getline(os,buf))
	{
		std::cout << put << endl;
	}*/
	//第四种-不推荐
	char c;
	while ((c = os.get()) != EOF)
	{
		std::cout << c;
	}
	os.close();
	return 0;
}

结果是:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言从入门到函数速成(2)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学​​​c的学 好&#xff0c;正片开始&#xff01; 数组 概念&#xff1a;数组中存放的是1个或者多个数据&#xff0c;但是数组元素个…

频率和转速转换功能块(CODESYS ST源代码)

1、转速和频率转换功能块 转速和频率转换功能块(CODESYS ST源代码)-CSDN博客文章浏览阅读10次。1、转速/频率常用转换关系转速/频率/线速度/角速度计算FC_200 plc计算角速度-CSDN博客文章浏览阅读3.2k次。https://rxxw-control.blog.csdn.net/article/details/138438864 1、转…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒处理建议

在网络技术不断发展的时代&#xff0c;网络在企业中的应用广泛&#xff0c;可以为企业带来更多的便利&#xff0c;大大提升了企业的生产效率&#xff0c;但网络作为虚拟世界&#xff0c;在为企业提供便利的同时&#xff0c;也为企业数据安全带来严重威胁。近期&#xff0c;云天…

C++入门系列-基于范围的for循环(C++11)和指针空值nullptr(C++11)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 基于范围的for循环 范围for的语法 在C98中如果要遍历一个数组&#xff0c;可以按照以下方式进行&#xff1a; void TestFor() {int array[] { 1,2,3,4,5 };for (int i 1; i …

VmWare 虚拟机没有网络解决办法

由于最近需要&#xff0c;装了个VM虚拟机&#xff0c;但是突然发现本机有网络&#xff0c;虚拟机却没有网络&#xff0c;更换了虚拟机的网络设置&#xff0c;都尝试过了 都不管用&#xff0c; 最后尝试了这种方法完美解决 还原网络默认设置 首先还原虚拟网络编辑器设置 启动V…

力扣---二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,…

FFmpeg计算图像的SSIM的原理

SSIM算法基于HVS更擅长从图像中提取结构信息的事实&#xff0c;并且利用结构相似度来计算图像的感知质量。 在Z. Wang等人的论文Multi-scale structural similarity for image quality assessment中也提到&#xff0c; S S I M SSIM SSIM算法要好于当时的其它的感知图像质量指标…

Java-I/O-编写程序实现从文件中读取数据

定义一个类FileUtil&#xff0c;在FileUtil中定义一个方法 String readFromFile(File file)&#xff0c;该方法从指定的文件中读取数据&#xff0c;并将读取到的数据以字符串的格式返回。 FileUtil类的接口定义&#xff1a; class FileUtil{ String readFromFile(File file){…

强大而简洁:初学Python必须掌握的14个单行代码

Python的魅力与单行代码的重要性 Python&#xff0c;作为一种高级编程语言&#xff0c;自诞生以来就以其简洁、易读、易学的特性而广受开发者喜爱。其魅力不仅在于其强大的功能和广泛的应用领域&#xff0c;更在于其能够用简洁的代码实现复杂的功能&#xff0c;这种能力在很大…

nodejs实战——搭建websocket服务器

本博客主要介绍websocket服务器库安装&#xff0c;并举了一个简单服务器例子。 服务器端使用websocket需要安装nodejs websocket。 cd 工程目录 # 此刻我们需要执行命令&#xff1a; sudo npm init上述命令创建package.json文件&#xff0c;系统会提示相关配置。 我们也可以使…

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中&#xff0c;为数值矩阵&#xff1b;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日&#xff0c;中间没有缺失&#xff0c;绘图代码&#xff1a; % clear; timespan1[20210102 20211231]; datenn1datenum(da…

Visual studio调试技巧

Visual studio调试技巧 bug是什么&#xff1f;Debug和ReleaseDebugRelease 如何调试VS调试快捷键调试过程中查看程序信息查看临时变量的值查看内存信息查看调用堆栈查看汇编信息查看寄存器信息 编译常见错误编译型错误链接型错误运行时错误 bug是什么&#xff1f; bug的英文释…

用例设计规范示例

一个好的用例设计&#xff0c;可以让任何一个执行测试的测试人员都能够容易理解&#xff0c;好操作、易执行、无歧义。这就需要有一个用例设计规范。 下面是一组用例设计规范的示例。 用例编号命名规范化 用例具有规范的、统一的、唯一的标识&#xff0c;有助于实现对用例的…

VMware | 虚拟机开启摄像头

VMware | 虚拟机开启摄像头 打开主机摄像头功能 首先请确保主机摄像头打开。 若图像显示正常则可以。 确保主机虚拟机USB服务开启 进入系统服务界面&#xff0c;确保 VMware USB … 处于开启状态&#xff0c;如果没开启&#xff0c;将它打开。 开启虚拟机摄像头 在 V…

以信息挖掘为关键技术的智慧校园建设

随着信息技术的快速发展&#xff0c;数据信息资源以井喷的姿态涌现。数据信息的大量涌现给人们带来丰富的数据信息资源&#xff0c;但面对海量的信息资源时&#xff0c;加大了人们对有效信息资源获取的难度&#xff0c;数据挖掘技术正是这一背景下的产物&#xff0c;基于数据挖…

C语言/数据结构——每日一题(分割链表)

一.前言 今天在LeetCode觉得很不错&#xff0c;想和大家们一起分享这道链表题——分割链表&#xff1a;https://leetcode.cn/problems/partition-list-lcci废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目描述 1.2题目分析 大致思路&#xff1a;我们可以通过…

手撸Mybatis(二)—— 配置项的获取

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 配置项解析 在mybatis中&#xff0c;一般我们会定义一个mapper-config.xml文件&#xff0c;来配置数据库连接的相关信息&#xff0c;以及我们的mapperxml文件存放目录。在本章&#xff0c;我们会…

【C++】---模板进阶

【C】---模板进阶 一、模版参数1、类型参数2、非类型参数 二、模板的特化1、函数模板的特化2、类模板特化&#xff08;1&#xff09;全特化&#xff08;2&#xff09;偏特化 三、模板分离编译1、模板支持分离编译吗&#xff1f;2、为什么模板不支持分离编译&#xff1f;3、如何…

《21天学通C++》(第十五章)标准模板库简介

本章简单介绍STL容器、迭代器和算法的基本概念&#xff0c;之后几章会分别详述 1.STL容器 STL容器是STL中用于存储集合数据的组件&#xff0c;它们可以被看作是模板类&#xff0c;允许开发者定义特定类型的容器发&#xff0c;这里按照C11标准分为四类&#xff1a;顺序容器、关…

Vmware虚拟机瘦身及Samba服务不可用问题解决

虚拟机磁盘空间膨胀是一个令人头疼的问题&#xff0c;特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发&#xff0c;都面临着这个难题。首先&#xff0c;操作系统本身就已占用不少空间&#xff0c;更新安装包&#xff0c;再下载一些开源软件&#xff0c;剩…