cpp学习记录06:文件操作与模板

news2024/9/21 8:02:44

文件操作

对文件操作需要包含头文件<fstream>

文件类型:

文本文件:以文本ASCII码形式储存

二进制文件:以文本的二进制形式储存

操作文件三大类:

ofstream:写操作

ifstream:读操作

fstream:读写操作

写文本文件

步骤:

1创建流对象  ofstream ofs;

2打开文件  ofs.open("文件路径",打开方式);

3写数据  ofs<< "写入的数据"

4关闭文件  ofs.close();

读文件

步骤

1.创建流对象 ifstream ifs;

2.打开文件 ifs.open("文件路径",打开方式)

3.判断是否成功打开

if(!ifs.is_open()){
cout<<"打开失败"<<endl;
return;
}

3.读数据 四种方式

方式1

charnbuf[1024] = {0};
while(ifs >> buf){
cout<<buf<<endl;
}

方式2

char buf[1024] = {0};
while (ifs.getline(buf,sizeof(buf))){
cout<<buf<<endl;
}

方式3

string buf;
while(getline(ifs,buf)){
cout<<buf<<endl;
}

方式4(不推荐)

char c;
while((c = ifs.get())!=EOF) //EOF end of file
{
cout<<c;
}

4.关文件 ifs.close();

模板

函数模板的作用:

建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表。

语法

typename可以换成class

template<typename T>
函数声明或定义

例子:

template<typename T>
void swapMy(T &a,T &b) {
    T temp = a;
    a = b;
    b = temp;
}

模板使用方式

方式1:自动类型推导


void test() {
    //1.自动推导
    int a= 10;
    int b = 3;
    swapMy(a,b);
}

方式2:显示指定类型

void test() {
    //2.显式指定类型
    int a= 10;
    int b = 3;
    swapMy<int>(a,b);
}

普通函数与函数模板的区别

普通函数调用可以发生隐式类型转换

int add(int a,int b) {
    return a+b;
}
void test01() {
    int a = 10;
    char b = 'a'; //97
    cout<<add(a,b)<<endl; //107
}

函数模板用自动类型推导,不可以发生隐式类型转换

函数模板 用显示指定类型,可以发生隐式类型转换

同名普通函数和函数模板的调用规则

1.如果函数模板和普通函数都可实现,优先普通

2.可以通过空模板参数列表来强制调用函数模板


void swapMy(T &a,T &b) {
    T temp = a;
    a = b;
    b = temp;
}
void swapMy(int a,int b) {
    cout<<'a'<<endl;
}
void test03() {
    int a=0;
    int b=1;
    swapMy<>(a,b); //空模板参数列表 强制调用
}

3.如果函数模板可以产生更好的匹配,优先调用函数模板 更好的匹配指的是不用隐式转换

类模板

语法就是模板声明下面跟一个类就行

template<class AgeType,class NameType = string>//NameType 默认为string
class Person {
public:
    Person(NameType name,AgeType age) {
        this->age = age;
        this->name = name;
    }
    AgeType age;
    NameType name;
};

void test02() {
    Person<int,string> p1("shi",31);
}

类模板成员函数创建时机

在调用时才创建

类模板对象做函数的参数

1.指定传入类型(常用)


class Person {
public:
    Person(NameType name,AgeType age) {
        this->age = age;
        this->name = name;
    }
    void showPerson() {
        cout<<this->age<<endl;
    }
    AgeType age;
    NameType name;
};
//1.指定传入类型
void printPerson(Person<int,string> &p) {
    p.showPerson();
}
void test02() {
    Person<int,string> p1("shi",31);
    printPerson(p1);
}

2.参数模板化

//2.参数模板化
template<class T1,class T2>
void printPerson2(Person<T1,T2> &p) {
    p.showPerson();
}

3.整个类模板化

//整个类模板化
template<class T>
void printPerson3(T &p) {
    p.showPerson();
};

类模板与函数模板的区别

类模板没有自动类型推导的使用方式,只能显示指定。

类模板在模板参数列表中可以有默认参数

类模板与继承

当子类继承的父类是一个类模板时,子类在声明的时候要指定出父类中T的类型

因为如果不指定,编译器无法给子类分配内存

如果想灵活指定父类中T的类型,子类也需要变为类模板

template<class T>
class Base {
public:
    T a;
};
template<class T1,class T2>
class Son:public Base<T2> {
public:
    T1 b;
};

类模板成员函数类外实现

template<class AgeType,class NameType = string> 
class Person {
public:
    Person(NameType name,AgeType age);
    // {
    //     this->age = age;
    //     this->name = name;
    // }
    void showPerson();
    // {
    //     cout<<this->age<<endl;
    // }
    AgeType age;
    NameType name;
};
//构造函数类外实现
template<class AgeType,class NameType>
Person<AgeType,NameType>::Person(NameType name, AgeType age) {
         this->age = age;
         this->name = name;
}
//成员函数类外实现
template<class AgeType,class NameType>
void Person<AgeType,NameType>::showPerson() {
    cout<<this->age<<endl;
}

模板的小练习

//实现通用数组类
//可以对内置数据类型以及自定义数据类型的数据进行存储
//将数组中的数据存储到堆区
//构造函数中可以传入数组的容量
//提供对应拷贝构造函数以及operator=防止浅拷贝问题
//提供尾插法和尾删法对数组中的数据进行增加和删除
//能通过下表访问数组元素
//可以获取数组中当前元素个数和数组容量
template<class T>
class MyArray {
public:
    MyArray(int capacity) {
        this->Capacity = capacity;
        this->Size = 0;
        this->pAddress = new T[this->Capacity];
    }
    ~MyArray() {
        if(pAddress!=NULL) {
            delete[] this->pAddress;
            pAddress = NULL;
        }
    }
    MyArray(const MyArray& arr) {
        this->Capacity = arr.Capacity;
        this->Size = arr.Size;
        this->pAddress = new T[arr.Capacity];

        for(int i=0;i<this->Size;i++) {
            this->pAddress[i] = arr[i];
        }
    }
    MyArray& operator= (const MyArray &arr){
            if(this->pAddress!=NULL) {
                delete[] this->pAddress;
                this->Capacity = 0;
                this->Size = 0;
                this->pAddress = NULL;
            }
        this->Capacity = arr.Capacity;
        this->Size = arr.Size;
        this->pAddress = new T[arr.Capacity];
        for(int i=0;i<this->Size;i++) {
            this->pAddress[i] = arr[i];
        }
    }
    //尾插法
    void Push_Back(cosnt T &value) {
        if(this->Capacity == this->Size) {
            return;
        }
        this->pAddress[this->Size] = value;
        this->Size++;
    }
    //尾删法
    void Pop_Back() {
        if(this->Size == 0) {
            return;
        }
        Size--;
    }
    T& operator[](int number) {
        if(number>=0 && number<Size) {
            return pAddress[number];
        }
    }
private:
    T * pAddress; //指向数组
    int Capacity; //数组容量
    int Size; //数组大小
};

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

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

相关文章

以知识图谱结构为Prompt框架,帮LLM快速找出因果关系生成更精准内容

因果关系提取一直是LLM领域一个热门的研究方向&#xff0c;正如我上一篇文章中介绍的&#xff0c;我们在制定决策和科学研究时&#xff0c;往往需要LLM具有非常稳健的因果推理能力。幸运的是&#xff0c;恰巧知识图谱结构作为Prompt(“KG Structure as Prompt”&#xff09;能够…

做一个能和你互动玩耍的智能机器人之六-装配

openbot小车&#xff0c;最简单的配件。一个小车支架或者底盘&#xff0c;四个马达&#xff0c;最好是双层的&#xff0c;下层安装马在&#xff0c;上层电池和电源盒&#xff0c;L298N&#xff0c;arduino&#xff0c;手机支架&#xff0c;根据需要配置蓝牙&#xff0c;超声波等…

Arrays、Lambda表达式、Collection集合

1. Arrays 1.1 操作数组的工具类 方法名说明public static String toString(数组)把数组拼接成一个字符串public static int binarySearch(数组,查找的元素)二分查找法查找元素public static int[] copyOf(原数组,新数组长度)拷贝数组public static int[] copyOfRange(原数组…

接口自动化测试mock框架模块实战

前言 mock的介绍 py3已将mock集成到unittest库中&#xff1b; 为的就是更好的进行单元测试&#xff1b; 简单理解&#xff0c;模拟接口返回参数&#xff1b; 通俗易懂&#xff0c;直接修改接口返回参数的值&#xff1b; mock的作用 1、解决依赖问题&#xff0c;达到解耦作用…

基于Spring前后端分离版本的论坛

基于Spring前后端分离版本的论坛系统 PP论坛地址系统设计逻辑交互图数据库设计工程结构概述注册功能实现展示注册交互图参数要求接口规范后端具体实现前端数据集成 接口拦截器实现mybatis生成类与映射文件改造session存储到 redis加盐算法实现部分Bug调试记录项目测试记录Postm…

关于正点原子imx6ull-mini在写触摸驱动时,一直挂载不上驱动,就是没有一些信息反馈

/** 设备树匹配表 */ const struct of_device_id gt9147_of_match_table[] {{.compatible "goodix,gt9147" },{ /* sentinel */ } };const struct of_device_id gt9147_of_match_table[] {{.compatible "goodix&#xff0c;gt9147"},{} }; 找了俩小时…

高频面试题全攻略:从算法到解题技巧

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

基于宝塔面板稳定快速安装 ssl 证书脚本

背景 我通过AI制作了不少关于签发ssl证书的脚本&#xff0c;目的是方便无脑安装&#xff0c;不需要懂代码。 但全都是基于acme.sh这个工具来设计的脚本&#xff0c;而且证书申请有点慢&#xff0c;有时还会申请失败。 然后我发现了certbot, 安装证书可谓神速&#xff01; c…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

全面解析PHP反序列化漏洞:原理、复现与防御

文章目录 概念序列化数据的含义魔术方法魔术方法的使用construct&#xff0c;destructtoStringcallgetsetsleepwakeupissetunsetinvoke 原生态反序列化漏洞概念种类复现 wakeup长度绕过产生原因条件复现 基本题型源码解读 在Web应用安全领域&#xff0c;PHP反序列化漏洞常常被视…

Tomcat 使用和配置文件(详解)

一.tomcat 介绍 1. tomcat 概述 自从JSP发布之后&#xff0c;推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后&#xff0c;开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器&#xff0c;当然同时也支持 Servlet&#xff0c;这样Tomcat就诞…

MySQL数据库误删恢复--超详细

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Tensorflow——第三讲神经网络八股

前两讲我们学习了使用tensorflow原生代码搭建神经网络&#xff0c;本讲主要学习使用Tensorflow API&#xff1a;tf.keras搭建神经网络 一、搭建网络八股Sequential 六步法&#xff1a; 1.import&#xff1a;import 相关模块&#xff0c;如 import tensorflow as tf 2.train…

2024年7月30日~2024年8月5日周报

一、前言 上周继续修改论文&#xff0c;并阅读了两篇论文。 本周主要修改论文、完成实验、参加一些组会与论文讨论会&#xff0c;并配置了torch环境。 二、完成情况 2.1 论文符号系统注意事项 数学符号应该有唯一性&#xff0c;不能与其他符号造成误解&#xff1b;W_{\mathr…

c++初阶-----适配器---priority_queue

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

极狐GitLab CICD Catalog Beta 功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

【Python】数据类型之列表(下)

&#xff08;6&#xff09;清空列表 功能&#xff1a;clear() 代码示例&#xff1a; &#xff08;7&#xff09;根据值获取索引&#xff08;从左到右找到第一个返回索引&#xff09;【慎用&#xff0c;找不到报错】 功能&#xff1a;index(xyz)&#xff0c;xyz为数据类型。 …

OpenAI gym player mode

题意&#xff1a;OpenAI gym 的自定义模式 问题背景&#xff1a; Does anyone know how to run one of the OpenAI gym environments as a player. As in letting a human player play a round of cart pole? I have seen that there is env.mode human but I have not been…

波兰表达式求值

from operator import add, sub, muldef div(x, y):# 使用整数除法的向零取整方式return int(x / y) if x * y > 0 else -(abs(x) // abs(y))class Solution(object):op_map {: add, -: sub, *: mul, /: div}def evalRPN(self, tokens: List[str]) -> int:stack []for …

【C基础-按要求找数】一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少

一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少 完全平方数是指一个整数能够表示为某个整数的平方。换句话说&#xff0c;如果存在一个整数 n&#xff0c;使得 n^2m,那么 m 就是一个完全平方数。 使用C…