C++核心编程(五)—— 文件操作
2021/5/19 22:29:09
本文主要是介绍C++核心编程(五)—— 文件操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++系列内容的学习目录 → \rightarrow →C++学习系列内容汇总。
- 1. 文件操作概述
- 2. 文本文件
- 2.1 写文件
- 2.2 读文件
- 3. 二进制文件
- 3.1 写文件
- 3.2 读文件
- 4. 总结
到目前为止,我们已经使用了iostream标准库,它提供了cin和cout方法分别用于从标准输入读取流和向标准输出写入流。当实现从文件读取流和向文件写入流时,就需要用到C++中另一个标准库fstream,它定义了三个新的数据类型:
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件可以将数据持久化。
C++中对文件操作需要包含头文件 <fstream>;
。
文件类型分为两种:1. 文本文件 :文件以文本的ASCII码形式存储在计算机中;
2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。
操作文件的三大类: 1. ofstream:写操作
2. ifstream: 读操作
3. fstream : 读写操作
2.1 写文件
写文件的步骤如下:
- 包含头文件:
#include <fstream>
- 创建流对象:
ofstream ofs;
- 打开文件:
ofs.open("文件路径", 打开方式);
- 写数据:
ofs << "写入的数据";
- 关闭文件:
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 读文件
读文件与写文件步骤相似,但是读取方式相对于比较多。
读文件的步骤如下:
- 包含头文件:
#include <fstream>
- 创建流对象:
ifstream ifs;
- 打开文件并判断文件是否打开成功:
ifs.open("文件路径",打开方式);
- 读数据:四种方式读取
- 关闭文件:
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关闭文件 。
以二进制的方式对文件进行读写操作,打开方式要指定为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. 总结这篇关于C++核心编程(五)—— 文件操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)