C++基础-文件操作

C++基础-文件操作

文件操作(输入输出流)

文件操作的概述

程序运行时产生的数据都属于零食数据,程序一旦运行结束,就会被释放

通过文件可以将数据持久化

C++中对文件的操作包含头文件(文件流)

文件类型分为两种

  • 文本文件:文件以文本的ASCII码的形式存储在计算机
  • 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不直接读他们

操作文件的三大类

  • ofstream:读文件
  • ifstream:写文件
  • festream:读写文件

文本文件

写文件

步骤

  1. 包含头文件

    #include<fstream>
  2. 创建流对象

    ofstream ofs;
  3. 打开文件

    ofs.open("文件路径",打开方式);
  4. 写数据

    ofs << "写入的数据";
  5. 关闭文件

    ofs.cloSe()

打开方式

  • 文件的打开方式可以配合使用,用|操作符(eg:los::binary | ios::in)

路径

  • 没有指明路径的化,默认和当前项目的路径一致
  • 可以用绝对,也可以用相对

例子

#include<iostream>#include<fstream> //添加头文件using namespace std;void test01(){ofstream ofs;  //创建流对象ofs.open("test.txt",ios::out);  //打开的地址和方式ofs << "你好" << endl;  //文件的内容ofs.close();  //关闭文件}int main(int argc, char** argv) {test01();return 0;} 

读文件

步骤相对于写文件多一点

步骤

  1. 包含头文件

    #include<fstream>
  2. 创建流对象

    ifstream ifs;
  3. 打开文件并判断释放打开成功

    ifs.open("文件路径",打开方式);if(!ifs.is_open()){cout << "文件打开失败" << endl;return;}else{...}
  4. 读数据

    一共四种...

  5. 关闭文件

    ifs.cloSe()

例子

#include<iostream>#include<fstream>#include<cstring>using namespace std;void test01(){ifstream ifs;ifs.open("test.txt",ios::in);if(!ifs.is_open()){  //判断是否打开成功cout << "文件打开失败" << endl;return;}else{//第一种//char buf[1024] = {0};//while(ifs >> buf){   //将ifs的数据放入buf中,当数据读完时,返回false,结束循环(不读取数据)//cout << buf <<endl;//}        //第二种//char buf[1024] = {0};//while (ifs.getline(buf,sizeof(buf))){   //getline:一行一行的读取//cout << buf << endl;//}//}        //第三种//    string buf;//while(getline(ifs,buf)){   //ifs一行一行读到buf中//cout << buf << endl;//}        //第四种(不建议用)char c;while((c = ifs.get()) != EOF){  //EOF :文件的尾部标志cout << c; //不要加endl;}ifs.close();   //关闭文件   }}int main(int argc, char** argv) {test01();return 0;} 

小小练习-复制文件

在上面代码的基础上将已经创建好的test.txt文件复制到test1.txt文件下

#include<fstream>  //添加头文件#include<iostream>#include<cstring>using namespace std; void test01(){ofstream ofs;    //创建对象ifstream ifs;    ifs.open("test.txt",ios::in);       //路径和方式ofs.open("test1.txt",ios::out);    if(!ifs.is_open()){        //复制过程cout << "文件打开失败" << endl;   //判断是否打开成功        return;}else{string buf;        while(getline(ifs,buf)){   //读文件ofs << buf << "(test.txt复制成功)" << endl;  //写(复制)文件            // 添加标识,判断复制是否成功}}    ofs.close();    //关闭文件ifs.close();}int main(int argc, char** argv) {test01();return 0;} 

二进制文件

在以二进制读、写文件的时候要加多加一个‘ios::binary’

写文件

二进制方式读文件主要利用流对象调用函数write(读出的部分数据看不懂没有关系,只要还能读回来就可以啦)

函数类型:ofs.write((const char *) &buffer,int len);

参数解释:buffer指向内存中的一段数据;len是要读取的字节数

例子

#include<fstream>#include<iostream>using namespace std; class Person{  //写个类读读public:char m_Name[64]; //最好用charint m_Age;};void test01(){ofstream ofs("Person.txt",ios::binary | ios::out);  //可以一步写哦//ofs.open("Person.txt",ios::binary | ios::out);    Person p = {"Tom" ,18};  //造个对象     ofs.write((const char*)&p,sizeof(p));    //用write函数读出来ofs.close();}int main(int argc, char** argv) {test01();return 0;} 

读文件

二进制方式读文件主要利用流对象调用函数read

函数类型:ofs.read((const char *) &buffer,int len);

参数解释:buffer指向内存中的一段数据;len是要读取的字节数

例子

#include<fstream>  //是同一个Person,年龄是20咯(类哦)#include<iostream> //我把读的也写进来了,这样更灵活一点using namespace std; class Person{public:char m_Name[64];int m_Age;};void test01(){    //写文件ofstream ofs("Person.txt",ios::binary | ios::out);  //可以一步写哦//ofs.open("Person.txt",ios::binary | ios::out);Person p = {"Tom" 20};  //改个对象的参数()ofs.write((const char*)&p,sizeof(p));    ofs.close();    //读文件ifstream ifs("Person.txt",ios::binary | ios::in);    if(!(ifs.is_open())){cout << "文件打开失败" << endl;return;}else{Person p;ifs.read((char*)&p,sizeof(p));cout << p.m_Name << p.m_Age <<endl;}ifs.close();}int main(int argc, char** argv) {test01();return 0;} 

为进一步验证是对同一个文件操作,可以做如下检验

else{    Person p = {"Petter",250};//再次修改ifs.read((char*) &p,sizeof(p)); cout << p.m_Name << p.m_Age <<endl;}

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部