【32】C++流

目录

C++流

读写文件:文件流

对文本文件流读写 

写文本文件

读文本文件

对二进制文件流读写

写二进制文件

 读二进制文件

 对文件流按格式读写取数据

按指定格式写文件

按指定格式读文件


C++流

IO: 向设备输入数据和输出数据

C++的IO流

设备: 

  1. 文件
  2. 控制台
  3. 特定的数据类型(stringstream)

c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出)

读写文件:文件流

文件流: 对文件进行读写操作

头文件:  <fstream>

类库:

   ifstream    对文件输入(读文件)

   ofstream    对文件输出(写文件)

   fstream     对文件输入或输出

对文本文件流读写 

文件打开方式:

以上打开方式, 可以使用位操作 |  组合起来

写文本文件

(自编代码)

#include <fstream>
#include <iostream>
#include <string>using namespace std;int main(void) {ofstream writefile;writefile.open("flie.txt");string name;int age;while (1) {cout << "please input your name:[Ctrl+z exit]";cin >> name;if (cin.eof()) {break;}writefile << name << "\t";cout << "please input your age:";cin >> age;writefile << age << endl;}writefile.close();system("pause");return 0;
}

读文本文件

#include <fstream>
#include <iostream>
#include <string>using namespace std;int main(void) {ifstream outfile;outfile.open("flie.txt");string name;int age;while (1) {outfile >> name;if (outfile.eof()) {break;}cout << name << "\t";outfile >> age;cout << age << endl;}outfile.close();system("pause");return 0;
}

对二进制文件流读写

思考:

文本文件和二进制文件的区别?

文本文件: 写数字1,  实际写入的是 ‘1’

二进制文件:写数字1, 实际写入的是  整数1(4个字节,最低字节是1, 高3个字节都是0)

                     写字符‘R’实际输入的还是‘R’

写二进制文件

使用文件流对象的write方法写入二进制数据.

#include <fstream>
#include <iostream>
#include <string>using namespace std;int main(void) {ofstream bitWriteFile;bitWriteFile.open("flie.bat");string name;int age;while (1) {cout << "please input your name [Ctrl+z exit] :";cin >> name;if (cin.eof()) {break;}bitWriteFile << name << "\t";cout << "please input your age :";cin >> age;bitWriteFile.write((char*)&age, sizeof(age));}bitWriteFile.close();system("pause");return 0;
}
bitWriteFile.write((char*)&age, sizeof(age));

这行代码是在C++程序中将一个整数 `age` 以二进制形式写入到文件中的操作。让我们详细解释一下这行代码的各个部分:

1. `bitWriteFile`:这是一个 `ofstream` 类型的对象,它是C++标准库中的一个类,用于提供对文件的输出功能。

2. `.write`:这是 `ofstream` 对象的一个成员函数,用于写入数据。`.write` 函数接受两个参数:第一个参数是一个指向要写入数据的指针,第二个参数是要写入的数据的大小(以字符为单位)。

3. `(char*)&age`:这是一个类型转换操作,它将整数 `age` 的地址转换为一个 `char*` 类型的指针。这样做的原因是 `.write` 函数需要一个指向字符数据的指针。由于C++中的类型安全性,直接传递一个整数的地址是不合法的,因此需要将其转换为 `char*` 类型。`&age` 获取 `age` 变量的内存地址,然后通过强制类型转换 `(char*)`,告诉编译器将这个地址当作字符数组的首地址来处理。

4. `sizeof(age)`:这是一个编译时运算符,它返回变量 `age` 所占的字节数。对于一个 `int` 类型的变量,`sizeof(age)` 通常返回 4(在32位系统中)或 8(在64位系统中),这取决于编译器和操作系统的架构。这个值告诉 `.write` 函数需要写入多少字节的数据。

综合起来,`bitWriteFile.write((char*)&age, sizeof(age));` 这行代码的作用是以二进制形式将 `age` 变量的内容写入到 `bitWriteFile` 指定的文件中。这种方式写入的数据不是以文本形式存储的,而是直接存储 `age` 变量在内存中的二进制表示。这意味着,如果你在不同的机器或不同的编译器上读取这个文件,可能会遇到字节序(endianness)或整数大小不一致的问题,导致读取的值不正确。因此,使用二进制文件进行数据交换时,需要确保写入和读取数据的系统环境是兼容的。

 读二进制文件

#include <fstream>
#include <iostream>
#include <string>using namespace std;int main(void) {ifstream bitOutFile;bitOutFile.open("flie.bat", ios::in | ios::binary);string name;int age;while (1) {bitOutFile >> name;if (bitOutFile.eof()) {break;}cout << name << "\t";char temp;bitOutFile.read((char*)&temp,sizeof(temp));bitOutFile.read((char*)&age, sizeof(age));cout << age << endl;}bitOutFile.close();system("pause");return 0;
}

 对文件流按格式读写取数据

使用stringstream

按指定格式写文件

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>using namespace std;int main()
{string name;int age;ofstream outfile;outfile.open("file.txt", ios::out | ios::trunc);while (1) {cout << "请输入姓名: [ctrl+z退出] ";cin >> name;if (cin.eof()) { //判断文件是否结束break;}cout << "请输入年龄: ";cin >> age;stringstream s;s << "name:" << name << "\t\tage:" << age << endl;outfile << s.str();}// 关闭打开的文件outfile.close();system("pause");return 0;
}

按指定格式读文件

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <Windows.h>using namespace std;int main(void)
{char name[32];int age;string line;ifstream infile;infile.open("file1.txt");while (1) {getline(infile, line);if (infile.eof()) { //判断文件是否结束break;}sscanf_s(line.c_str(), "name:%s\t\tage:%d", name, sizeof(name), &age);cout << "姓名:" << name << "\t\t年龄:" << age << endl;}infile.close();system("pause");return 0;
}

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

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

相关文章

21世纪20年代了, 居然遭遇扩容U盘!

扩容u盘前些年很泛滥&#xff0c; 所以也有针对扩容u盘的测试软件 h2testw h2testw的工作原理很简单&#xff0c; 就是往u盘里写文件&#xff0c;写满后再读取文件进行验证 如果没有h2test&#xff0c; 也可以往里面考大文件&#xff0c; 再拷贝出来&#xff0c; 不出错就表示…

Navicat导入Excel数据时数据被截断问题分析与解决方案

目录 前言1. 问题分析1.1 默认字段类型的影响1.2 MySQL诊断机制的限制 2. 解决方案2.1 修改字段长度2.2 修改Excel数据以影响推断2.3 检查导入工具的设置 3. 其他注意事项3.1 注册表的修改3.2 增加自增ID 4. 结语 前言 在数据库的日常操作中&#xff0c;将Excel数据导入MySQL是…

ubuntu常用文件操作

1. 查看文件和目录 列出目录内容&#xff1a; ls列出当前目录的文件和子目录。常用参数包括&#xff1a; ls -l&#xff1a;显示详细信息&#xff08;权限、所有者、大小、时间等&#xff09;。ls -a&#xff1a;显示隐藏文件&#xff08;以 . 开头的文件&#xff09;。ls -h&a…

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…

Ubuntu22.04版本左右,扩充用户可使用内存

1 取得root权限后&#xff0c;输入命令 lsblk 查看所有磁盘和分区&#xff0c;找到想要替换用户可使用文件夹内存的磁盘和分区。若没有进行分区&#xff0c;并转为所需要的分区数据类型&#xff0c;先进行分区与格式化&#xff0c;过程自行查阅。 扩充替换过程&#xff0c;例如…

28.3 一致性哈希和推送数据的redirect流程

本节重点介绍 : 开启一致性哈希环变更监听处理 这个服务的节点变更了(节点宕机、扩容)就对哈希环进行重置 开启结果监听和watch服务编写pgw的http接收端 推送数据的redirect流程 一致性哈希和推送数据的redirect流程 开启一致性哈希环变更监听处理 位置 sd/rings.go当这个…

大语言模型数据处理方法(基于llama模型)

文章目录 前言一、基于huggingface的DataCollatorForSeq2Seq方法解读1、DataCollatorForSeq2Seq方法2、batch最长序列填充3、指定长度填充二、构建大语言模型数据加工模块1、数据读取2、数据加工1、数据格式2、预训练(pretrain)数据加工3、微调(sft)数据加工①、sft数据加工…

Springboot项目搭建的问题

1.第一次出现这个问题是在使用postgresql进行搭建项目的时候&#xff0c;但是配置文件中的驱动一致导入不了 最后发现是meaven中依赖导入不进来&#xff08;不知道为什么&#xff09;&#xff0c;于是手动的在meaven中央仓库下载了对应的jar进行配置 然后项目可以正常启动 2.…

大模型系列——AlphaZero/强化学习/MCTS

AlphaGo Zero无需任何人类历史棋谱&#xff0c;仅使用深度强化学习&#xff0c;从零开始训练三天的成就已远远超过了人类数千年积累的围棋知识。 1、围棋知识 &#xff08;1&#xff09;如何简单理解围棋知识 &#xff08;2&#xff09;数子法分胜负&#xff1a;https://zhu…

w外链如何跳转微信小程序

要创建外链跳转微信小程序&#xff0c;主要有以下几种方法&#xff1a; 使用第三方工具生成跳转链接&#xff1a; 注册并登录第三方外链平台&#xff1a;例如 “W外链” 等工具。前往该平台的官方网站&#xff0c;使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…

Jellycat玩偶界的天花板,如何用情绪营销征服成年人的心?

Jellycat的用户肯定对这个品牌有一定的了解&#xff0c;不知道的用户或许也看过这个很火的茄子表情包&#xff0c;这是Jellycat很火的一款玩偶“活泼茄子”。Jellycat&#xff0c;这个源自英国伦敦的高端玩具品牌&#xff0c;近年来在全球范围内迅速走红&#xff0c;摇身一变玩…

一方数据能让沃尔玛广告业务成为下一个亚马逊吗?

作者&#xff1a;刀客doc 在如今的广告市场可以说是热闹非凡。有Facebook、谷歌这些传统巨头&#xff0c;也有亚马逊、TikTok这些行业新贵涌现出来。近几年连PayPal、Netflix这些原来和广告业务八竿子打不着的平台&#xff0c;也都开始把勺子伸进来&#xff0c;想要分一杯羹。…

基于SSM土家风景文化管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;景点分类管理&#xff0c;热门景点管理&#xff0c;门票订单管理&#xff0c;旅游线路管理&#xff0c;系统管理 前提账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

windows 编译 breadpad

原文链接:https://gist.githubusercontent.com/vnl/f317840bfa9c638a60f2c4110872056a/raw/07185c8e86fc2faf08e3410ed3950a5c4d2e8b32/Breakpad%2520on%2520Windows ##### Building Google breakpadBuilding Google breakpad on Windows is a very painful experience because…

搭建海外云服务器需要什么费用?

搭建海外云服务器需要什么费用&#xff1f;搭建海外云服务器的费用涉及多个方面&#xff0c;包括服务器实例费用、公网带宽费用、磁盘存储费用、操作系统费用和其他费用。具体费用取决于所选的云服务提供商、服务器配置、计费模式等因素。以下是UU云小编整理的一些主要的费用构…

Python 基础语法 - 赋值运算符

运算符说明简单赋值运算符、-、*、/、%、//、**等复合赋值运算符 1. 赋值运算符的功能 所有的赋值运算符都是用来给变量赋值的&#xff08;都是完成将数据保存到一个变量中&#xff09;重要结论&#xff1a;所有的赋值运算符表达式都没有结果 -> 无法提供数据 2. 简单赋值…

IDEA->EasyCode(mapper.xml) 字段无逗号分隔和修改全局变量问题

1.mapperxml字段无逗号分隔 在easycode的设置里找到&#xff1a; 1、Template下的 mapper.xml.vm脚本 2、Global Config下的 mybatisSupport.vm脚本 将脚本里的 $velocityHasNext 替换成 $foreach.hasNext&#xff0c;然后保存。Mybatis-Plus框架操作一样 github->issue连…

C# 将时间转换为毫秒

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; C# 将时间转换为毫秒…

PHP的 CSRF、XSS 攻击和防范

CSRF攻击 CSRF&#xff08;Cross-Site Request Forgery&#xff09;攻击&#xff0c;也称为跨站请求伪造&#xff0c;是一种常见的网络安全威胁。在这种攻击中&#xff0c;攻击者利用已认证的用户身份&#xff0c;在用户不知情的情况下伪造请求&#xff0c;冒充用户的操作向目…

Elastic Stack - FileBeat 入门浅体验

Filebeat 是 Elastic Stack 中的一个轻量级日志转发器&#xff0c;主要用于收集和转发日志数据。Filebeat 作为代理安装在您的服务器上&#xff0c;可以监控您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将其转发到 Elasticsearch 或 Logstash 进行索引。 一…