C++——文件操作

一、文本文件

C++中输入输出是通过流对象进行操作,对于文件来说写文件就是将内容从程序输出到文件,需要用到写文件流ofstream;而读文件就是将内容从文件输入到程序,需要用到读文件流ifstream;这两个文件流类都包含在头文件<fstream>中,对文件操作需要包含<fstream>。

(一)写文件

文本文件写入主要包括以下步骤:

  1. 包含头文件:#include<fstream>
  2. 创建文件流对象: ofstream ofs;
  3. 以写入方式打开文件:ofs.open("文件路径",ios::out);
  4. 写入内容:ofs<<"写入内容";
  5. 关闭文件:ofs.close();
cpp 复制代码
#include<iostream>
#include<fstream>
using namespace std;

int main(int argc, char const *argv[]) {
	ofstream ofs;
	ofs.open("test.txt", ios::out);
	ofs << "姓名:张三" << endl;
	ofs << "年龄:20" << endl;
	ofs.close();
	return 0;
}

(二)打开方式

|-------------|-----------------------------------------------------------------------------|
| 打开方式 | 描述 |
| ios::in | 读取方式打开文件。若文件不存在打开失败 |
| ios::out | 写入方式打开文件。若文件存在,清空后写入;文件不存在,创建后写入 |
| ios::ate | 初始位置:文件末尾。单独使用或和ios::out合用没有区别:清空后写入或创建后写入;和ios::in合用,若文件存在末尾可写入,若文件不存在打开失败 |
| ios::app | 末尾追加。单独使用或和ios::out/in合用没有区别:文件不存在时创建写入,存在时末尾追加; |
| ios::trunc | 若文件存在,清空后写入;若文件不存在创建后写入 |
| ios::binary | 以二进制方式写入或读取文件 |

(三)读取文件

  1. 文本文件读取主要包含以下步骤:
  2. 包含头文件:#include<fstream>
  3. 创建流对象:ifstream ifs;
  4. 以读取模式打开文件:ifs.open("文件路径+文件名/文件名",ios::in)
  5. 读取数据:常用的有4中方法。
  • ifs>> int,char,float,char *,string 等等。可读取整形、浮点型、字符型、字符串等等,读取字符串时可将读取内容存入字符数组,也可存入string;读取字符串时一次读一行,遇到空格、制表符、换行符或读取到字符数组长度-1个字符时返回。读取成功返回istream&,读取失败返回false。

  • ifs.getline(char *buf,int size,char delim='\n');一次读取一行,存入字符数组;遇到换行符或者读取到sizeof(buf)-1个字符返回(最后一个字符需要自动添加结束字符\0);遇到限定字符delim提前返回。读取失败返回false。

  • getline(istream& ifs,string& str,char delim='\n');一次读取一行,存入字符串;遇到换行符和限定字符delim提前返回。读取失败返回false。

  • int get();/ istream& get(char *buf, int size,char delim='\n');/istream& get(char c)常用的ifstream成员get函数有这几种重载;同样读取内容存入字符数组时遇到限定字符delim时提前返回,后面两种读取失败返回false。

    cpp 复制代码
    #include<iostream>
    #include<fstream>
    using namespace std;
    #include<string>
    //写文件
    void write() {
    	ofstream ofs("test.txt", ios::out);
    	if (ofs.is_open()) {
    		ofs << "姓名:张三" << endl;
    		ofs << "年龄:20" << endl;
    		ofs.close();
    	}
    }
    //方法1
    void func(ifstream& ifs, char buf1[1024], string buf2) {
    	//while (ifs >> buf1) {
    	//	cout << buf1 << endl;
    	//}
    	while (ifs >> buf2) {
    		cout << buf2 << endl;
    	}
    }
    //方法2
    void func(ifstream& ifs, char buf1[1024]) {
    	while (ifs.getline(buf1, 1024)){
    		cout << buf1 << endl;
    	}
    }
    //方法3
    void func(ifstream& ifs, string& buf2) {
    	while (getline(ifs, buf2)) {
    		cout << buf2 << endl;
    	}
    }
    //方法4
    void func(ifstream& ifs, char c) {
    	while (ifs.get(c)) {
    		cout << c;
    	}
    }
    void doWork(char buf1[1024], string& buf2, char c ) {
    	ifstream ifs("test.txt", ios::in);
    	if (ifs.is_open()) {
    		if (c == 1) {
    			func(ifs, buf1, buf2);
    		}else if (c == 2) {
    			func(ifs, buf1);
    		}
    		else if (c == 3) {
    			func(ifs, buf2);
    		}
    		else if (c == 4) {
    			func(ifs, c);
    		}
    
    		ifs.close();
    	}
    }
    int main(int argc, char const *argv[]) {
    	char buf1[1024];
    	string buf2;
    	char c;
    	write();
    	doWork(buf1, buf2, 1);
    	doWork(buf1, buf2, 2);
    	doWork(buf1, buf2, 3);
    	doWork(buf1, buf2, 4);
    	return 0;
    }

二、二进制文件

(一)二进制文件写入

具体步骤:

  1. 包含头文件:#include<fstream>
  2. 创建文件流:ofstream ofs;
  3. 以二进制方式打开文件:ofs.open("文件名",ios::binary|ios::out);
  4. 写入数据:调用成员函数ostream& write(const char * buffer,int len); ofs.write((const char*)ptr,sizeof(*ptr)); 字符指针buffer指向内存中一段储存空间,len是要写入字节数。
  5. 关闭文件:ofs.close();

(二)二进制文件读取

具体步骤:

  1. 包含头文件:#include<fstream>
  2. 创建文件流:ifstream ifs;
  3. 以二进制方式打开文件:ifs.open("文件名",ios::binary|ios::in);
  4. 读取数据:调用成员函数ifstream& read((char*)buf,sizeof(buf)); buf是读取内容的缓存区强转为(char*),按照单个字节计算读取内容。
  5. 关闭文件:ifs.close();
cpp 复制代码
#include<iostream>
using namespace std;
#include<fstream>
#include<string>
class Person {
public:
	string m_Name;
	int m_Age;
};
void write(void) {
	Person p = { "李四",21 };

	ofstream ofs("test.dat", ios::binary | ios::out);
	if (ofs.is_open()) {
		ofs.write((char*)&p, sizeof(p));
		ofs.close();
	}
}
void read(void) {
	Person p;
	ifstream ifs("test.dat", ios::binary | ios::in);
	if (ifs.is_open()) {
		ifs.read((char*)&p, sizeof(p));
		ifs.close();
	}
	cout << "姓名:" << p.m_Name << endl;
	cout << "年龄:" << p.m_Age << endl;
}
void test(void) {
	write();
	read();
}
int main(int argc, char const** argv) {
	test();
	return 0;
}
相关推荐
向宇it12 分钟前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
是娜个二叉树!29 分钟前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
Schwertlilien33 分钟前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习
liuyunshengsir36 分钟前
Squid代理服务器的安装使用
开发语言·php
只做开心事1 小时前
C++之红黑树模拟实现
开发语言·c++
很楠不爱1 小时前
项目实战——高并发内存池
开发语言·项目实战
程序员buddha2 小时前
C语言从入门到放弃教程
c语言·开发语言
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
南七澄江2 小时前
各种网站(学习资源及其他)
开发语言·网络·python·深度学习·学习·机器学习·ai
程序猿会指北3 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发