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文件