编程语言
首页 > 编程语言> > C++核心编程(五)—— 文件操作

C++核心编程(五)—— 文件操作

作者:互联网

C++系列内容的学习目录 → \rightarrow →C++学习系列内容汇总

1. 文件操作概述

  到目前为止,我们已经使用了iostream标准库,它提供了cin和cout方法分别用于从标准输入读取流和向标准输出写入流。当实现从文件读取流和向文件写入流时,就需要用到C++中另一个标准库fstream,它定义了三个新的数据类型:

数据类型 描述
 ofstream  该数据类型表示输出文件流,用于创建文件并向文件写入信息。
 ifstream  该数据类型表示输入文件流,用于从文件读取信息。
 fstream  该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

  程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化。

  C++中对文件操作需要包含头文件 <fstream>;

  文件类型分为两种:1. 文本文件 :文件以文本的ASCII码形式存储在计算机中;
           2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。

  操作文件的三大类: 1. ofstream:写操作
            2. ifstream: 读操作
            3. fstream : 读写操作

2. 文本文件

2.1 写文件

  写文件的步骤如下:

  1. 包含头文件:#include <fstream>
  2. 创建流对象:ofstream ofs;
  3. 打开文件:ofs.open("文件路径", 打开方式);
  4. 写数据:ofs << "写入的数据";
  5. 关闭文件:ofs.close();

  文件的打开方式

打开方式 解释
ios::in 打开文件用于读取
ios::out 打开文件用于写入
ios::ate 文件打开后定位到文件末尾
ios::app 所有写入都追加到文件末尾
ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为0
ios::binary 二进制方式

  注意: 文件打开方式可以配合使用,利用|操作符。例如,用二进制方式写文件 ios::binary | ios:: out

  实例如下所示。

#include<iostream>
using namespace std;
#include<fstream>

//文本文件——写文件
void test01()
{
	//1. 包含头文件 fstream

	//2. 创建流对象
	ofstream ofs;

	//3. 指定打开方式
	ofs.open("test.txt", ios::out);

	//4. 写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;		
	ofs << "年龄:18" << endl;

	//5. 关闭文件
	ofs.close();
}

int main()
{
	test01();

	system("pause");

	return 0;
}

  效果如下所示。

在这里插入图片描述
  总结: 1. 文件操作必须包含头文件fstream;
      2. 读文件可以利用ofstream或fstream类;
      3. 打开文件时候需要指定操作文件的路径,以及打开方式;
      4. 利用<<可以向文件中写数据;
      5. 操作完毕,要关闭文件.

2.2 读文件

  读文件与写文件步骤相似,但是读取方式相对于比较多。

  读文件的步骤如下:

  1. 包含头文件:#include <fstream>
  2. 创建流对象:ifstream ifs;
  3. 打开文件并判断文件是否打开成功:ifs.open("文件路径",打开方式);
  4. 读数据:四种方式读取
  5. 关闭文件:ifs.close();

  实例如下所示。

#include<iostream>
using namespace std;
#include<fstream>
#include<string>

//文本文件——读文件
void test01()
{
	//1. 包含头文件 fstream

	//2. 创建流对象
	ifstream ifs;

	//3. 打开文件,并判断是否打开成功
	ifs.open("test.txt", ios::in);

	if (!ifs.is_open())  //判断是否打开成功
	{
		cout << "文件打开失败!" << endl;
		return;
	}

	//4. 读数据:共有四种方式
	//第一种
	//char buf[1024] = { 0 };  //字符数组
	//while (ifs >> buf)
	//{
	//	cout << buf << endl;
	//}

	//第二种
	//char buf[1024] = { 0 };
	//while (ifs.getline(buf, sizeof(buf)))
	//{
	//	cout << buf << endl;
	//}

	//第三种
	//string buf;
	//while (getline(ifs, buf))
	//{
	//	cout << buf << endl;
	//}

	//第四种(不推荐)
	char c;
	while ((c = ifs.get()) != EOF)  //EOF: end of file
	{
		cout << c;
	}

	//5. 关闭文件
	ifs.close();
}

int main()
{
	test01();

	system("pause");

	return 0;
}

姓名:张三
性别:男
年龄:18

  总结: 1. 读文件可以利用ifstream ,或者fstream类;
      2.利用is_open函数可以判断文件是否打开成功;
      3. close关闭文件 。

3. 二进制文件

  以二进制的方式对文件进行读写操作,打开方式要指定为ios::binary

3.1 写文件

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

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

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

  实例如下所示。

#include<iostream>
using namespace std;
#include<fstream>

//二进制文件——写文件
class Person
{
public:
	char m_Name[64];  //姓名(字符数组代表字符串,C++的string字符串会有些问题)
	int m_Age;  //年龄
};


void test01()
{
	//1. 包含头文件

	//2. 创建流对象
	ofstream ofs("person.txt", ios::out | ios::binary);

	//3. 打开文件
	//ofs.open("person.txt", ios::out | ios::binary);  //也可以在创建对象流的时候,指定所有方式

	//4. 写文件
	Person p = { "张三", 18 };
	ofs.write((const char *)&p, sizeof(Person));  //(const char *) &p 对数据p取地址,并强转为const char型

	//5. 关闭文件
	ofs.close();
}

int main()
{
	test01();

	system("pause");

	return 0;
}

  效果如下所示。

在这里插入图片描述
  总结: 文件输出流对象可以通过write函数,以二进制方式写数据。

3.2 读文件

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

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

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

  实例如下所示。

#include<iostream>
using namespace std;
#include<fstream>

//二进制文件——读文件
class Person
{
public:
	char m_Name[64];  //姓名
	int m_Age;  //年龄
};


void test01()
{
	//1. 包含头文件

	//2. 创建流对象
	ifstream ifs;

	//3. 打开文件,并判断文件是否打开成功
	ifs.open("person.txt", ios::in | ios::binary);

	if (!ifs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return;
	}

	//4. 读文件
	Person p;
	ifs.read((char *)&p, sizeof(Person)); 
	cout << "姓名:" << p.m_Name << "    年龄:" << p.m_Age << endl;

	//5. 关闭文件
	ifs.close();
}

int main()
{
	test01();

	system("pause");

	return 0;
}

姓名:张三  年龄:18

  总结: 文件输入流对象可以通过read函数,以二进制方式读数据。

4. 总结

在这里插入图片描述

标签:文件,ifs,二进制,编程,ios,C++,ofs,include
来源: https://blog.51cto.com/u_15178976/2787845