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;
}

结果是:

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

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

相关文章

typescript:vscode的settings配置文件配置ts语法提示

typescript&#xff1a;vscode的settings配置文件配置ts语法提示 1 找到vscode左下角的齿轮按钮 2 点击Settings&#xff08;或者快捷键ctrl,&#xff09;&#xff1a; 点击右上角的Open Settings(JSON)按钮打开配置文件&#xff1a; 或者ctrlshiftp&#xff0c;搜索settings&…

展开说说:Android实现多线程几种方式

1、线程是什么 关于线程&#xff0c;Android开发经常遇到的一个和线程相关的异常报错&#xff1a;NetworkOnMainThreadException&#xff0c;因为网络请求不可以运行在主线程&#xff08;又称UI线程&#xff09;。和网络请求一样的还有I/O操作、数据库操作等耗时任务一样都只能…

奈氏准则和香农定理

一、奈奎斯特和香农 哈里奈奎斯特&#xff08;Harry Nyquist&#xff09;(左) 克劳德艾尔伍德香农&#xff08;Claude Elwood Shannon&#xff09;(右) 我们应该在心里记住他们&#xff0c;记住所有为人类伟大事业做出贡献的人&#xff0c;因为他们我们的生活变得越来越精彩&…

使用xshell工具连接ubuntu的root账户被拒绝的解决方法

问题描述&#xff1a; 我在使用xshell工具远程连接Ubuntu虚拟机的过程中&#xff0c;如果连接的是的普通用户则xshell工具可以正常连接&#xff0c;但是当我向连接ubuntu系统的root用户&#xff0c;即便是密码输入正确但还是不能连接成功。不能连接成功的截图如下&#xff1a; …

从零开始学AI绘画,万字Stable Diffusion终极教程(二)

【第2期】关键词 欢迎来到SD的终极教程&#xff0c;这是我们的第二节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在第一节课里面&#xff0c;我们…

PS 2018

软件安装 文件太大&#xff0c;分批上传了&#xff0c;后续下载下来文件目录是这样的&#xff0c; 三个文件夹.7z 分批上传&#xff0c;exe也压缩分批上传&#xff0c; 其中products文件夹太大&#xff0c;里面子目录继续压缩分批上传 都下好了&#xff0c;就exe执行安装就行…

如何使用提示测试为LLMs构建单元测试?

原文地址&#xff1a;how-to-build-unit-tests-for-llms-using-prompt-testing 确保您的人工智能交付&#xff1a;快速测试完美生成应用程序的基本指南 2024 年 4 月 26 日 如果你曾经编写过软件&#xff0c;你就会知道测试是开发过程中必不可少的一部分。特别是单元测试&#…

Git推送本地项目到gitee远程仓库

Git 是一个功能强大的分布式版本控制系统&#xff0c;它允许多人协作开发项目&#xff0c;同时有效管理代码的历史版本。开发者可以克隆一个公共仓库到本地&#xff0c;进行更改后将更新推送回服务器&#xff0c;或从服务器拉取他人更改&#xff0c;实现代码的同步和版本控制。…

BUUCTF:Web 解析(一)

前言 Buuctf Web 是一个在线安全挑战平台&#xff0c;旨在提高参与者对网络安全的理解和实践能力。本文将详细介绍 Buuctf Web 的特点、挑战和机遇&#xff0c;帮助读者更好地了解这一领域。 一、Buuctf Web 的特点 多样化的挑战场景&#xff1a;Buuctf Web 提供了多种挑战场…

金属表面粗糙度对信号的影响

在进行PCB的传输线设计时&#xff0c;如果希望仿真结果更加贴合于实际的效果&#xff0c;就需要考虑很多的附加因素&#xff0c;比如&#xff0c;真实的叠构参数、介电常数、损耗角正切值、蚀刻因子、金属表面粗糙度、玻纤效应等&#xff0c;在常规的信号仿真中&#xff0c;前三…

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源&#xff0c;可以都是mysql数据源&#xff…

基于RK1126的小型化低功耗AI相机,支持人体特征识别、人脸特征识别、案例帽识别等

提供可定制的⼀套 AI相机软硬件开发平台&#xff0c; 硬件采⽤ RockchipRV1126处理器解决 ⽅案&#xff0c;可选择搭配 SonyIMX系列传感器&#xff0c;POE供电与数据传输&#xff0c;采⽤ 38板标准结构设计&#xff0c;快速按需定制外壳&#xff0c;⽀撑从开发到验证到批量⽣产…

C#知识|事件集中响应,多个按钮关联同一事件(实例练习)

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 本节学习窗体Controls集合、控件事件的统一关联及如何优化重复代码。 01 事件集中响应 原理&#xff1a;就是相同的控件&#xff0c;可以关联同一个事件响应方法。 02 示例演示 2.1、示例功能 该示例实现窗体中选择…

基于php+mysql+html简单图书管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Springboot图片上传【本地+oss】

文章目录 1 前端组件页面2 本地上传3 上传到阿里云oss3.1申请开通账号&#xff0c;做好先导准备3.2 开始使用 1 前端组件页面 使用的VueElement组件 在线cdn引入&#xff1a; <script src"https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js"></script&…

Typescript语法

常量声明 let用于声明变量&#xff0c;而const用于声明常量。两者的区别是变量在赋值后可以修改&#xff0c;而常量在赋值后便不能修改。 const b:number 200; 类型判断 如果一个变量或常量的声明包含了初始值&#xff0c;TS便可以根据初始值进行类型判断&#xff0c;此时…

有限元分析

TOC在这里插入代码片 **应力挤压时的横截面内部力 剪应力&#xff1a;应力的相反力 法向力&#xff1a;施加的压力 与应力垂直 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解…

STM32入门学习之DMA

1.直接存储访问DMA(Direct Memory Access)&#xff1a;DMA传输不需要CPU的参与&#xff0c;直接在内存和I/O设备间开辟了一条新的数据传输通道&#xff0c;不仅提高数据传输的速率&#xff0c;还因为不需要CPU的干预&#xff0c;从而提高了CPU的利用率。(注&#xff1a;文中的资…

小红书API接口封装 | 根据笔记链接采集笔记详情,含正文内容、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 用python开发的爬虫采集软件&#xff0c;可自动按笔记链接抓取笔记的详情数据。 为什么有了源码还开发界面软件呢&#xff1f;方便不懂编程代码的小白用户使用&#xff0c;无需安装python&#xff0c;无需改代码&#xff0c;双击打开即用&#xf…