当前位置: 首页 > news >正文

C++进阶(14)类型转换、IO流

文章目录

  • 一、类型转换
    • C语言
      • 隐式类型转换
      • 强制类型转换
    • C++
      • 类型转换的情况
      • 类型转换的函数(4个)
  • 二、IO流
    • 1、缓冲区
    • 2、提高输入输出效率
    • 3、文件操作
      • 文件权限
      • 写操作 --- ofstream
        • 文本方式写入
        • 二进制方式写入
      • 读操作 --- ifstream
        • 文本方式读取
        • 二进制方式读取
      • 其他操作
        • 判断文件是否成功打开?

一、类型转换

当两个类型不是严格的相同的时候,就会有类型转换的问题。

C语言

隐式类型转换和强制类型转换。

隐式类型转换

适用于类型相似的内置类型(整型、浮点数、字符型)之间进行类型转化。比如:整型和字符型之间,整型和浮点数之间。

int a = 10;
double b = a; // 整型和浮点数之间
char c = a; // 整型和字符型之间

强制类型转换

适用于整型和指针之间,指针和指针之间。

int a = 10;
int* pa = &a;
int b = (int)pa; // 整型和指针之间
double* pb = (double*)b; // 指针和指针之间

C++

类型转换的情况

C++不仅仅兼容C的类型转换,还有一些自定义类型之间的转换。

内置类型 -> 自定义类型

自定义类型 -> 内置类型

自定义类型 -> 自定义类型

// 内置类型转换成自定义类型
// 通过构造函数实现的
class A
{
private:int _a;int _b;
public:A(int a, int b):_a(a), _b(b){}
};
A a(1, 3);// 自定义类型转换成内置类型
// 通过get函数,将A类型转换成int
class A
{
private:int _a;int _b;
public:friend int get(A& a);A(int a, int b):_a(a), _b(b){}
};
int get(A& a)
{return a._a;
}// 自定义类型转换成自定义类型
// 将子类赋值给父类,也可以通过构造函数实现,方法不唯一
class A
{
private:int _a;int _b;
public:A(int a = 1, int b = 1):_a(a), _b(b){}
};
class B:public A
{
private:int _c;
public:B(int c = 1):_c(c){}
};
B b;
A a = b;

类型转换的函数(4个)

// 隐式类型转换:static_cast<T>
int a = 10;
double b = 3.4;
a = static_cast<int>(b);
// 强制类型转换:reinterpret<T>
int a = 10;
int* pa = &a;
int b = reinterpret_cast<int>(pa);
// const类型转换:const_cast<T> --- 用于删除变量的const属性
const int x = 10;
int* px = const_cast<int*>(&x);
*px = 4;
std::cout << *px << std::endl;
// 向下转换:dynamic_cast<T>(父类对象指针/引用 -> 子类指针/引用)
class A
{
public:virtual void print(){std::cout << "A: print()" << std::endl;}
};
class B : public A
{
public:virtual void print(){std::cout << "B: print()" << std::endl;}
};
A* a = new B;
B* b = dynamic_cast<B*>(a);
b->print();

二、IO流

1、缓冲区

输入输出是有缓冲区的概念的,根据Linux中学的一切皆文件,大概的也能明白(因为文件里面有缓冲区)。

// 根据下面的代码可以深刻的体会出缓冲区的概念。
// 一次性输入10x
// 下面会直接输出:
// 10
// x
// 我们只输入的了一次,为什么会直接都输出出来呢?
// 答:当我们输入10x的时候,第一次因为变量a是int类型,他只读到了10,然后就直接退出了,而x还在缓冲区中。当缓冲区不空的时候,我们是没有办法继续往里面进行读数据的,需要将其进行接收。然后ch正好是字符类型,接收了x,所以最后会直接打印出来,而不需要我们输入两次。// 所以为了解决某种用户输入不正确的数据时,需要我们进行判断,然后对缓冲区进行清空,以便不影响下一次输入。
#include <iostream>
int main()
{int a = 0;std::cin >> a;std::cout << a << std::endl;char ch = 0;std::cin >> ch;std::cout << ch << std::endl;return 0;
}

2、提高输入输出效率

// 第一种方式:--- 用C语言的输入输出
//printf
//scanf// 第二种方式 --- C++
// 在main函数中加入这三句语句,一个main函数只需要写一次
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

3、文件操作

进行文件操作的时候只需要包含fstream即可。

下面是文件头文件的结构图。

image-20240820195456482

文件权限

  1. ios::in:以输入(读取)模式打开文件。
  2. ios::out:以输出(写入)模式打开文件。
  3. ios::app:以追加模式打开文件,写入的数据会追加到文件末尾。
  4. ios::ate:打开文件时,立即将文件指针移动到文件末尾。
  5. ios::trunc:如果文件已存在,打开时清空文件内容。
  6. ios::binary:以二进制模式打开文件,而不是默认的文本模式。

写操作 — ofstream

文本方式写入
#include <iostream>
#include <fstream>int main()
{// 以文本方式打开文件(如果默认路径下没有文件,则新建文件)、// 默认的权限是ios::out// std::ofstream fout("test.txt", std::ios::out); --- 以写的方式打开文件// std::ofstream fout("test.txt", std::ios::out | std::ios::app); --- 以追加模式的写的方式打开文件// ...std::ofstream fout("test.txt");// 文本输入fout << "12434\n";fout << "abcdefg";fout << "hijk";// 关闭文件fout.close(); return 0;
}
二进制方式写入
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{std::vector<int> v = { 1, 2, 3, 4 };// 打开文件,以写的方式std::ofstream fout("test.txt", std::ios::out | std::ios::binary);// 写入文件// ostream& write (const char* s, streamsize n);for (auto& e : v){fout.write(reinterpret_cast<char*>(&e), sizeof(e));}// 关闭文件fout.close();return 0;
}

读操作 — ifstream

文本方式读取
#include <iostream>
#include <string>
#include <fstream>int main()
{// 打开文件,以读的方式std::ifstream fin("test.txt");// 读取文件std::string tmp;while (fin >> tmp){std::cout << tmp << std::endl;}// 关闭文件fin.close();return 0;
}
二进制方式读取
// 以什么方式写,就以什么方式读
// 也要注意数据的格式,如果是整型就整形方式读,自定义类型就自定义类型方式读
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{// 打开文件,以读的方式std::ifstream fin("test.txt", std::ios::in | std::ios::binary);// 读取文件char ch;while (fin.read(&ch, sizeof(ch))){std::cout << ch;}if (fin.good()){std::cout << "读取成功" << std::endl;}// 关闭文件fin.close();return 0;
}

image-20240820220212954

其他操作

判断文件是否成功打开?
#include <iostream>
#include <string>
#include <fstream>
#include <vector>int main()
{// 打开文件,以读的方式std::ifstream fin("test.txt", std::ios::in | std::ios::binary);// 判断是否成功打开文件if (!fin){std::cout << "无法打开文件!" << std::endl;return 1;}// 关闭文件fin.close();return 0;
}

谢谢大家!

相关文章:

C++进阶(14)类型转换、IO流

文章目录 一、类型转换C语言隐式类型转换强制类型转换 C类型转换的情况类型转换的函数&#xff08;4个&#xff09; 二、IO流1、缓冲区2、提高输入输出效率3、文件操作文件权限写操作 --- ofstream文本方式写入二进制方式写入 读操作 --- ifstream文本方式读取二进制方式读取 其…...

配置oss cdn加速静态资源访问 阿里云

效果对比 配置cdn下载速度对比 步骤 1: 登录阿里云控制台控制台主页&#xff0c;找到并点击“对象存储 OSS” 创建存储空间&#xff08;Bucket&#xff09; 设置权限 步骤 2: 获取外网访问地址 步骤 3 在 CDN 中使用该地址 复制该外网访问地址 打开全站加速 DCDN/域名管理 添…...

实现 前端框架 SPA 路由功能:Hash 模式与 History 模式的手动实现

前言 在前端框架&#xff08;如 Vue.js、React 等&#xff09;中&#xff0c;路由管理通常会配置一个 router 对象来定义 URL 路径与组件的映射关系。 路径&#xff08;path&#xff09;: 这是浏览器 URL 的一部分&#xff0c;比如 /home 或 /about。组件&#xff08;compone…...

去中心化的新时代:Web3技术的全球影响

随着技术的不断演进&#xff0c;Web3正引领互联网的去中心化新时代。相较于传统的Web1和Web2&#xff0c;Web3通过去中心化、区块链和智能合约等技术&#xff0c;正在重塑网络的运作方式。这一变革不仅提升了网络的安全性和透明度&#xff0c;也对全球经济、社会和文化产生了深…...

初始redis:List

列表 List 相当于数组或者顺序表。 对于List来说&#xff0c;两侧都可以插入和删除&#xff0c;时间复杂度是O(1)。 有很多的操作&#xff0c;比如 llen 可以获取List的长度&#xff0c;lrem 可以删除元素 &#xff0c;lrange可以去一个字符串 &#xff0c; lindex可以根据下标…...

Java | Leetcode Java题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {private class Node {// 哈希表存储关注人的 IdSet<Integer> followee;// 用链表存储 tweetIdLinkedList<Integer> tweet;Node() {followee new HashSet<Integer>();tweet new LinkedList<Integer&g…...

MVC与三层架构分层

1. 应用分层 应用分层类似公司的组织架构。我们进行项目开发时&#xff0c;最开始功能简单&#xff0c;前后端放在一起开发&#xff0c;但随着项目功能的复杂&#xff0c;项目会被前端和后端不同的团队接手&#xff0c;甚至更细粒度的团队。甚至后端开发也会根据功能再进行细分…...

Go语言基础--switch

在Go语言中&#xff0c;switch语句是一种非常强大的控制流结构&#xff0c;它允许一个变量的值与多个case进行比较&#xff0c;并根据匹配的结果执行不同的代码块。与C、C或Java中的switch不同&#xff0c;Go语言的switch更灵活&#xff0c;支持没有显式条件的switch&#xff0…...

【数字ic自整资料】AXI握手协议及outstanding

参考资料&#xff1a; ic基础|时序篇&#xff1a;握手协议valid和ready的时序优化_valid和ready握手信号-CSDN博客 https://zhuanlan.zhihu.com/p/365573848 1、AXI握手协议 当我们遇到时序违例时&#xff0c;通常采用的方式为插入寄存器&#xff08;打拍&#xff09;或者是…...

C++ //练习 18.13 什么时候应该使用未命名的命名空间?

C Primer&#xff08;第5版&#xff09; 练习 18.13 练习 18.13 什么时候应该使用未命名的命名空间&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 当需要将实体限定在特定文件中&#xff0c;并且不会作用于不同文件…...

yum小bug

这个错误是在克隆的机子上安装mysql时&#xff0c;查看有无mysql发现的 [rootwebserve-2 backup] # yum list installed | grep mysql Repository cr is listed more than once in the configuration Repository fasttrack is listed more than once in the configuration 这…...

GDB的基本使用

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…...

如何利用AI创作高质量的文章

讯飞星火 利用AI创作高质量的文章需要遵循以下步骤&#xff1a; 确定主题和目标受众&#xff1a;在开始写作之前&#xff0c;明确文章的主题和目标受众。这将帮助你确定文章的风格、结构和内容。 收集资料和信息&#xff1a;在撰写文章之前&#xff0c;进行充分的研究&#x…...

开源的量化交易领域平台vn.py(VeighNa)

一&#xff1a;vn.py&#xff08;VeighNa&#xff09;下的工具以及社区版和Elite版的区别 vn.py是一款广泛应用于量化交易领域的开源软件&#xff0c;它主要有以下用途和功能&#xff1a; 1. 交易系统开发框架&#xff1a;vn.py提供了一个完整的交易系统开发框架&#xff0c;可…...

选择搜索引擎进行搜索

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>选择搜索引擎进行搜索</title><script>function searchSelectedEngine() {var keyword document.getElementById(keyword).value;var engine document.getEl…...

安卓framework修改density

安卓平台,不同屏幕分辨率需要修改density值,以适配UI显示,比如字体大小等. 命令行下进入安卓SDK源码的device/目录 再根据不同芯片厂进入不同目录, 比如展锐就是 cd device/sprd, 高通是device/qcom/搜索关键字"ro.sf.lcd_density", grep -nr “ro.sf.lcd_density”…...

我们如何将数据输入到神经网络中?

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 下面我拿识别美女的例子来给大家介绍如何将美女的图片数据输入到神经网络中。 此例中&#xff0c;待输入的数据是一张图像。为了存储图像…...

基于python模板的药品名称识别系统设计与实现

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

【第五节】Win32汇编程序设计

目录 一、汇编的第一个“helloworld” 二、汇编中的标号 三、的使用 四、数据定义 五、全局变量 六、局部变量 七、结构体 八、结构体的访问 九、获取变量地址 十、函数 十一、分支与循环 十二、内联汇编 十三、裸函数的使用 一、汇编的第一个“helloworld” .38…...

2.1算法的时间复杂度与空间复杂度

本篇博客介绍算法的时间复杂度与空间复杂度 一、算法效率 算法好坏从时间和空间两个维度衡量 二、时间复杂度 1&#xff0e;概念 时间复杂度是算法中基本操作的执行次数&#xff0c;定量描述了算法的运行时间 2&#xff0e;注意 &#xff08;1&#xff09;时间复杂度是偏…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...