文件操作
程序运行时产生的临时数据可以通过文件将数据持续化,程序运行结束时也不会被释放
文件的头文件<fstream>
文件类型
1. 文本文件 文件以文本的ASCII码的形式存储在计算机中
2.二进制文件 文件以文本的二进制的形式存储咋计算机中,用户一般不能直接读懂他们
操作文件的三大类
1.ofstream:写操作
2.ifstream:读操作
3.fstream:读写操作
写文件:创建流对象 ofstream ofs; 打开文件ofs.open("文件路径",打开方式); 写数据ofs<<"写入的数据"; 关闭文件ofs.close();
ios::in 为读文件而打开文件
ios::out 为写文件而打开文件
ios::ate 初始位置:文件尾
ios::trunc 如果文件存在先删除,再创建
ios::binary 二进制方式
ios::app 追加方式写文件.也是在文件尾
文件打开方式可以配合使用 ios::binary | ios::out
读文件:创建流对象ifstream ifs;打开文件并判断文件是否打开成功 ifs.open("文件路径“,打开方式); 读数据 有四种读取方式 ;关闭文件 ifs.close();
先写ifs.open("文件路径“,打开方式); 然后判断文件是否打开成功if ( !ifs.is_open() ) {cout<<"文件打开失败”<<endl; return 0}里面的函数进行判断 如果是1表示成功打开,如果返回为0表示打开失败
第一种读数据的方式
char buf【1024】={0};把文件中的数据放到字符数组中 ,利用>> 当数据全部读入之后,while会退出 读到末尾会返回一个假的标志
while(ifs>>buf) { cout<<buf<<endl;} 然后输出buf中的数据
第二种读取方式
char buf【1024】={0};//getline是获取一行的意思 里面的两个参数是(char * str,std::streamsize——Cout)其中buf数组名就是第一个元素的首地址
//第二个参数表示要读多少个字节数,
while(ifs.getline(buf ,sizeof(buf)))
{
cout<<buf<<endl;//输出buf
}
第三种读取方式
string buf;
while(getline(ifs,buf))//第一个参数是基础的输入流对象 第二个参数是要放入的字符串,这里是全局的getline
{
cout<<buf<<endl;//输出buf
}
第四种方式,不太推荐
一个一个地读取数据,读取之后放入字符里
char c;
while((c=ifs.get())!=EOF)//get函数每一次只读取一个字符,把读到的字符放到字符c里面,并判断是否读到文件尾部EOF
{
cout<<c;
}
二进制的方式对文件进行读写操作
打开方式指定为ios::binary
二进制方式写文件主要是利用流对象调用成员函数write
函数原型:ostream& write(const char *buffer,int len);
字符指针buffer只想内存中的一段存储空间,len是读写的字节数
class person
{
public:
char m_Name[64];//尽量不要使用string 使用char
int m_Age;
}
void test()
{
ofstream ofs; ofs.open("person.txt",ios::out | ios::binary); 写文件 Person p={“张三” ,18};
ofs.write((const char * )&p,sizeo(Person))//强制转换,若直接对p取地址返回的是Person* 但是我们之前提到过这个函数的原型是const char *
关闭文件 ofs.close();
}
二进制方式读文件
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream&read(char *buffer,int len);/字符指针buffer指向内存中一段存储空间 len是读写的字节数
class person
{
public:
char m_Name[64];//尽量不要使用string 使用char
int m_Age;
}
void test()
{
//创建流对象
ifstream ifs;
//打开文件 判断文件是否成功打开
ifs.open("person.txt",ios::in | ios::binary); //以二进制的形式读文件
if (!( ifs.is_open()) ) //如果函数ifs.is_open()返回的是1 那么说明打开成功,否则打开失败
{
cout<<"文件打开失败"<<endl;
return 0;
}
//读文件
Person p;//这里的Person p相当于char p 只不过p的类型是Person,用来接收Peson类数据
ifs.read((char *) &p,sizeof(Person));
cout<<"姓名: "<<p.m_Name<<"年龄"<<p.m_Age<<endl;
//关闭文件
ifs.close();
}