C++ Day9 文件和模板

一、文件

  • 对文件操作要包含头文件:
  • 文件类型:
    1. 文本文件:文件以文本的ASCLL码形式存储在计算机中
    2. 二进制文件:文件以文本的二进制形式储存在计算机中,用户一般不能直接读懂。
  • 写操作:ofstream
  • 读操作:ifstream
  • 读写操作:fstream
打开方式意义
ios::in以读文件为目的打开文件
ios::out以写文件为目的打开文件
ios::ate初始位置为文件尾
ios::app追加方式写入文件
ios::trunc文件已存在先删除在创建
ios::binary二进制方式
  • 利用 |配合使用:ios::in |ios::binary
#include<iostream>
#include<fstream>
using namespace std;

void read()
{
        //读数据
    ifstream ifs;//读流对象
    ifs.open("1.txt",ios::in);//打开文件
    if(!ifs.is_open())
    {
        cout<<"文件打开失败";
        return;
    }
    char buf[1024]={0};
    while(ifs >> buf)
    {
        cout<<buf<<endl;
    }
    ifs.close();
}
int main()
{
    ofstream ofs;
    ofs.open("1.txt",ios::out);
    ofs<<"1.包含头文件 #include<fstream>";
    ofs<<"2.创建流对象 ofstream ofs; ";
    ofs<<"3.打开文件   ofs.open('文件路径',打开方式);";
    ofs<<"4.写数据     ofs<<'数据' ";
    ofs<<"5.关闭文件";
    ofs.close();
  
    read();
    system("pause");
    
}

c++泛型编程和STL技术

二、模板

2.1 基础

  • 建立通用的模具,大大提高复用性
  • 模板机制:函数模板和类模板

2.2 函数模板

  • 语法:
template<typename T>
函数的声明或者定义
  • 将类型参数化
#include<iostream>
#include<fstream>
using namespace std;

template<typename T>//定义一个模板
void myswap(T &a,T &b)//实现相同数据类型之间数的交换
{
    T temp =a;
    a=b;
    b=temp;
}

int main()
{
    int a=10;
    int b=11;
    double c=12;
    double d=13;
    // myswap(a,b);//自动类型推导
    myswap<int>(a,b);//显示指定类型
    cout<<a<<endl;
    cout<<b<<endl;
    myswap(c,d);
    cout<<c<<endl;
    cout<<d<<endl;
    system("pause");

}

注意

  • 模板必须确定数据类型。
  • 必须推导出一致的数据类型T才可以使用。

2.3 模板示例数组排序

#include<iostream>
using namespace std;
template<class T>
void myswap(T &a,T &b)//交换模板
{
    T temp=a;
    a=b;
    b=temp;
}
template<typename T>//排序模板,选择排序
void chosesort(T arr[],int len)
{
    for (int i=0;i<len-1;i++)
    {
        int min=i;
        for(int k=i+1;k<len;k++)
        {
            if(arr[k]<arr[min])
                {
                    min=k;
                }
        }
        if(min!=i)
        {
            myswap(arr[min],arr[i]);
        }
    }
}
int main()
{
    char arr[]="fdsthga";
    int len=sizeof(arr)/sizeof(arr[0]);
    chosesort(arr,len-1);
    cout<<arr;
    system("pause");
}

2.4 普通函数和函数模板

  • 区别:普通函数可以发生自动类型转换(隐式类型)
  • 函数模板自动推导类型不发生隐式转换,利用显示指定类型的方式可以发生隐式类型转换。

调用规则:

  • 函数模板和普通函数都可调用,优先普通函数
  • 函数模板可重载
  • 可以通过空模板参数列表来强制调用模板函数
  • 函数模板可以更好匹配,优先函数模板

2.5 模板的局限性

  • 不是万能的,自定义数据类型不好计算或者比较
  • 利用具体的模板解决
  • 学习模板的目的是在STL中能够运用系统提供的模板

2.6 类模板

template<typename T>
template<class nametype,class agetype>
class student
{
    public:
        nametype name;
        agetype age;
        student(nametype name,agetype age)
        {       
            this->age=age;
            this->name=name;
        }
        void print()
        {
            cout<<name<<endl;
            cout<<age<<endl;
        }
};
int main()
{
    student<char*,int> s1("小明",100);
    s1.print();
    system("pause");
}

2.7 类模板与函数模板

  • 类模板没有自动类型推导,只能指定类型student<char*,int>

  • 类模板在参数列表中可以有默认参数template<class nametype,class agetype=int >

  • 类模板中:普通类中的成员函数一开就可以创建,而类模板中成员函数在调用时创建。

2.8 类模板对象作为函数参数

三种方法:

  • 指定传入类型,最常用
  • 参数模板化
  • 类模板化
template<class nametype,class agetype>
class student
{
    public:
        nametype name;
        agetype age;
        student(nametype name,agetype age)
        {       
            this->age=age;
            this->name=name;
        }
        void print()
        {
            cout<<name<<endl;
            cout<<age<<endl;
        }
};
template<class T>//类模板化
void print1(T &a)
{
    cout<<a.name<<endl;
    cout<<a.age<<endl;
}

template<class T1,class T2>
void print2(student<T1,T2> &a)//参数模板化
{
    cout<<a.name<<endl;
    cout<<a.age<<endl;
}

void print3(student<char *,int> &a)//指定传入类型
{
    cout<<a.name<<endl;
    cout<<a.age<<endl;
}
int main()
{
    student<char*,int> s1("小明",100);
    print1(s1);
    print2(s1);
    print3(s1);
    system("pause");
}

2.9类模板和继承

  • 子类继承的父类为类模板时,子类要指名父类中的T类型,不指定无法给子类分配内存

  • 类模板分文件编写应:1.直接包含.cpp文件 或者1.将.h和。cpp写在一起为.hpp文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值