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

news2024/11/15 16:01:07

文章目录

  • 一、类型转换
    • 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;
}

谢谢大家!

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

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

相关文章

如何使用DEV-C++做游戏?

我的B站视频做过关于python的小游戏开发&#xff0c;但很多小伙伴希望通过C做一些有趣的动画或游戏&#xff0c;该怎么实现呢&#xff1f; B站&#xff1a;bigbigli_大李 大家好&#xff0c;我是大李。 今天主要跟大家谈谈如何通过C做一些小游戏开发&#xff0c;这里我们就 使用…

JavaScript - Api学习 Day02(事件监听、流、委托)

事件监听 一、事件监听1.1 什么是事件、事件监听1.1.1 事件监听的基本流程1.1.2 重点关注以下三个核心要素 1.2 Event handling models 事件处理模型1.2.1 DOM Level 版本&#xff08;1&#xff09;DOM Level 0&#xff08;2&#xff09;DOM Level 2 1.2.2 事件类型&#xff08…

iPad协议08算法

微信协议就是基于微信IPad协议的智能控制系统&#xff0c;利用人工智能AI技术、云计算技术、虚拟技术、边缘计算技术、大数据技术&#xff0c;打造出智能桌面系统RDS、 智能聊天系统ACS 、智能插 件系统PLUGIN 、云计算服务CCS 、任务管理系统TM、设备管理服务DM、 应用管理系统…

ECCV 2024亮点:APGCC技术刷新人群计数与定位的SOTA

摘要 在ECCV 2024会议上&#xff0c;一项名为APGCC的新技术以其卓越的性能引起了广泛关注。这项技术通过创新的方法&#xff0c;显著提高了人群计数和定位的准确性和鲁棒性&#xff0c;为监控、事件管理和城市规划等领域带来了新的解决方案。 正文&#xff1a; 随着城市化进…

ant design pro 技巧之实现列表页多标签

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的ant design pro 中用户的表单如何控制多个角色ant des…

全国大学生数学建模比赛——时间序列(详细解读)

全国大学生数学建模比赛中&#xff0c;时间序列分析是一种重要的方法。以下是对时间序列在该比赛中的详细解读&#xff1a; 一、时间序列的概念 时间序列是按时间顺序排列的一组数据。在数学建模中&#xff0c;时间序列数据通常反映了某个现象随时间的变化情况。例如&#xf…

编程中数据字典介绍

目录 第一章、快速了解数据字典1.1&#xff09;数据字典介绍1.2&#xff09;主动数据字典1.2.1&#xff09;主动数据字典对表字段的描述1.2.2&#xff09;主动数据字典对表索引的描述1.2.3&#xff09;主动数据字典对表外键的描述1.3&#xff09;被动数据字典1.4&#xff09;数…

golang实现windows获取加密盘符的总大小

golang实现windows获取加密盘符的总大小 package mainimport ("fmt""syscall""unsafe" )type PartitionStyle uint32const (IOCTL_DISK_GET_DRIVE_LAYOUT_EX 0x00070050FILE_DEVICE_MASS_STORAGE uint32 0x0000002dIOCTL_STOR…

【生物特征识别论文分享】基于深度学习的掌纹掌静脉识别

&#xff08;待更新&#xff09;基于深度学习的生物特征识别&#xff08;手掌静脉、手背静脉、手指静脉、掌纹、人脸等&#xff09;论文模型总结 。具体方法包括&#xff1a;基于特征表征、基于传统网络设计与优化、基于轻量级网络设计与优化、基于Transformer设计与优化、基于…

Isaac Sim仿真平台学习(2)基础知识

目录 0.前言 1.isaac sim的组建 1.Isaac Lab的资料 2.PhysX 3.RTX 4.Digital Twins 5.Replicator 6.Omnigraph 0.前言 难得更新阿&#xff0c;今天黑猴发布了没有去玩&#xff0c;跑来更新博客&#xff0c;本来想着按宇树的go2开发指南去试试RL的&#xff0c;但可惜没成…

39_WAF的概念、功能,ModSecurity部署配置、LAMP环境部署、Ubuntu搭建DVWA靶机测试、测试WAF防御、OWASP规则集的部署

一、WAF的概念 WAF&#xff08; Web Application Firewall &#xff09;&#xff0c;即Web应用防火墙 通过执行一系列HTTP/HTTPS&#xff08;应用层的协议&#xff09;的安全策略为Web应用提供保护的一种网络安全产品。增加攻击者的难度和成本&#xff0c;但不是100%安全。工…

XRAY~漏洞扫描工具

有人说&#xff1a;“所有的漏扫工具都是人写出来的&#xff0c;既然是工具&#xff0c;肯定没有人厉害&#xff0c;但是&#xff0c;漏扫可以大大减少你的工作量” 4、⭐ XRAY xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&…

五、2 移位操作符赋值操作符

1、移位操作符 2、赋值操作符 “ ”赋值&#xff0c;“ ”判断是否相等 1&#xff09;连续赋值 2&#xff09;复合赋值符

关于栈(顺序栈)的知识讲解

1.1 什么是栈 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈)&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。 特点&#xff1a;栈是先进后出FILO(First In Last Out) (LIFO(Last In First Out)) 1.2 顺序栈 1.2.1 特性 逻辑结构&#xff1…

推荐4款高效的视频剪辑神器。

很多人一开始&#xff0c;面对各种视频剪辑软件时会不知所措。不知道该选择哪一个&#xff0c;也知道如何使用。但是这几个软件&#xff0c;对于不太熟悉视频剪辑的朋友们来说简直就是神器&#xff0c;简单易上手&#xff0c;功能做的也非常的专业。 1、福昕剪辑软件 直达链接…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(下)

目录 一.Nginx 反向代理功能 1.缓存功能 2.http 反向代理负载均衡 二.实现 Nginx 四层负载均衡 三.实现 FastCGI 1.为什么会有FastCGI&#xff1f; 2.什么是PHP-FPM&#xff1f; 3.FastCGI配置指令 4.Nginx与php-fpm在同一服务器 5.Nginx配置转发 6. php的动态扩展模…

关于c++多线程中的互斥锁mutex

关于c多线程中的互斥锁mutex c中的多线程线程的基本概念C 标准库中的线程支持 多线程与主线程与join换一种方式理解线程互斥锁第一种第二种 子线程与互斥锁混合锁--看这个应该就明白了&#xff08;这个主要使用的是嵌套锁&#xff09;定义一个类创建线程 这个示例主要使用并列锁…

SAP负库存

业务示例 在系统中&#xff0c;对于一些物料而言&#xff0c;不能立即将收到的交货输入为收货。如果要使发货无论如何都是可以过帐的&#xff0c;则需要允许这些物料的负库存。 负库存 发货数量大于预订数量时&#xff0c;过帐该发货就会出现负库存。如果由于组织原因&#…

【人工智能】Transformers之Pipeline(十一):零样本图片分类(zero-shot-image-classification)

目录 一、引言 二、零样本图像分类&#xff08;zero-shot-image-classification&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 …

嵌入式软件--PCB DAY 1

一、入门 1.什么是PCB 随着技术的进步&#xff0c;我们已经可以将一个电子设备的主要功能全部集成在一块单独的电路板上。这种电路板可以由相关的机械设备像印刷一样生产出来。因此我们现在的电路板可以被称为印刷电路板(Printed Circuit Board&#xff09;。 2.什么是PCBA …