zoukankan      html  css  js  c++  java
  • 学习:文件操作

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

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

    C++中对文件操作需要包含头文件

    文件类型分为两种:

    1、文本文件 - 文件以文本的ASCII码形式存储在计算机中
    2、二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

    操作文件的三大类:

    1、ofstream:写操作
    2、ifstream: 读操作
    3、fstream : 读写操作


    写文件操作

    写文件步骤如下:

    1、包含头文件

    #include <fstream>

    2、创建流对象

    ofstream ofs;

    3、打开文件

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

    4、写数据

    ofs << "写入的数据";

    5、关闭文件
    ofs.close();

    示例代码如下:

    #include<iostream>
    #include<fstream> //包含头文件
    
    using namespace std;
    
    int main() {
    
    	//文件写操作
    	ofstream ofs;	 //创建流对象
    	ofs.open("1.txt", ios::out); //以写的方式打开并且是覆盖方式,发现如果文件不存在的时候,以写的方式打开文件会自动创建,读的方式不会
    	ofs << "test" << endl;
    	ofs << "男" << endl;
    	ofs << "18" << endl;
    	ofs.close();
    
    	system("pause");
    	return 0;
    }
    

    注意: 文件打开方式可以配合使用,利用|操作符

    例如:用二进制方式写文件ios::binary | ios:: out


    读文件操作

    步骤其实和写文件的操作差不多,但是我们创建的流对象不一样,并且打开方式也不一样

    示例代码如下:

    #include<iostream>
    #include<fstream> //包含头文件
    
    using namespace std;
    
    int main() {
    
    	ifstream ifs;//创建流对象
    
    	ifs.open("1.txt", ios::in); //以读的方式打开
    
    	if (!ifs.is_open()) { //判断文件是否打开成功,如果打开失败就return
    		cout << "文件读取失败" << endl;
    		return 0;
    	}
    
    
    	//第一种方式进行读取
    	//char buf[1024] = { 0 }; //进行初始化操作
    	//while (ifs >> buf) { //进行读取操作
    	//	cout << buf << endl;//输出读取到的内容
    	//}
    
    
    	//第二种方式进行读取
    	//char buf[1024] = { 0 };
    	////这里自己觉得有意思的是getline传入的buf的指针
    	//while (ifs.getline(buf, size(buf))) {  //istream& getline (char* s, streamsize n );
    	//	cout << buf << endl;
    	//}
    
    
    	//第三种方式进行读取
    	//这种也挺有意思的EOF 来判断 所以自己也写一下记录
    	char c;
    	while ((c = ifs.get()) != EOF) //get进行单个字符读取,感觉有点鸡肋
    	{
    		cout << c;
    	}
    
    	ifs.close(); //进行关闭文件的操作
    
    	system("pause");
    	return 0;
    
    
    }
    

    操作二进制文件:

    之前有提到过,用二进制方式写文件ios::binary | ios:: out,自己了解用二进制来写文件,就是为了体现保密作用

    二进制方式写文件主要利用流对象调用成员函数write

    函数原型 :ostream& write(const char * buffer,int len);

    示例代码如下:

    #include<iostream>
    #include<string>
    #include<fstream>
    
    using namespace std;
    
    class Person {
    public:
    	char name[64];
    	int age;
    };
    
    int main() {
    	ofstream ofs; //创建流对象
    	
    	Person p1 = { "adexx" ,18}; //生成一个对象
    	ofs.open("1.txt", ios::out | ios::binary); //以二进制方式打开文件
    	ofs.write((const char *)&p1,sizeof(p1)); //二进制方法写入  注意的是第一个参数需要时const char指针类型,所以我们需要取地址进行强制性转换
    	ofs.close();
    	system("pause");
    	return 0;
    }
    

    二进制读文件:

    既然我们用二进制写文件,当然也要有二进制读文件的操作了

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

    函数原型:istream& read(char *buffer,int len);

    参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

    示例代码如下:

    #include<iostream>
    #include<string>
    #include<fstream>
    
    using namespace std;
    
    class Person {
    public:
    	char name[64];
    	int age;
    };
    
    int main() {
    	ifstream ifs; //创建流对象
    	Person p1;
    	
    	ifs.open("1.txt", ios::in | ios::binary); //以二进制方式打开文件
    	ifs.read((char *)&p1, sizeof(Person)); //istream& read(char *buffer,int len);,因为buffer指向内存的一段存储空间,所以我们读取的时候就存到p1对象中,并且内存大小为Person类的内存的大小,但是第一个参数为char得指针类型,所以拿到地址还需要转换
    
    	cout << p1.name << "," << p1.age << endl;
    	ifs.close();
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    第009讲:了不起的分支和循环3
    Term_Application
    十大编程算法助程序员走上高手之路
    每天工作4小时的程序员
    编程真相_节选
    Sublime_Snippet
    VIM资源管理
    微信企业号开发资源整理
    vitruviano
    VIM_git
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11877613.html
Copyright © 2011-2022 走看看