0. 闲话
最近因为疫情宅在家,于是又狠下心开始了一直想学,但又一直断断续续的C++自学之路。听的课程是慕课上北大郭炜老师的《程序设计与算法(三)C++面向对象程序设计》。现在每天学一点,一方面为了加强理解,另一方面方便后续的查阅。
1. 文件读写的原理
文件读写的原理,类似于输入输出流,只是从键盘输入变为了从文件输入(读文件),从屏幕输出变为输出到文件(写文件)。具体的关系如下图所示:
可以看到文件的读写就是跟三个类相关:ifstream、ofstream及fstream。
需要注意的是:开始需要包含头文件,最后需要关闭打开的各个文件!
#include<fstream>
2. 创建文件的两种方式
- 采用open函数打开
ofstream wrtFile;
wrtFile.open("G://test1.txt",ios::out);
这种方式就是先创建了ifstream对象,再使用open函数打开。
参数:
– G://test1.txt 写入到G盘下名字为test1.txt的文件中
– ios::out 文件打开方式(写的方式)
- ios::out 输出到文件,删除原有内容
- ios::app 输出到文件,保留原内容,在尾部添加
- 不使用open函数直接打开
ofstream wrtFile("G://test1.txt",ios::out);
3. 例子
例子是有一个名为test.txt文件里面有1-10十个数字的杂乱状态,需要按照从小到大的顺序重新写入到test1.txt中。
#include "pch.h"
#include <iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
ifstream redFile;
redFile.open("G://test.txt",ios::in);
if (!redFile) {
//判断是否成功打开
cout << "File open erro!" << endl;
}
ofstream wrtFile("G://test1.txt",ios::out);
//以文本文档方式打开
ofstream wrtBFile("G://testB.dat",ios::out|ios::binary);
//以二进制方式打开
int x;
while (redFile >> x) {
v.push_back(x);
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size();i++) {
wrtFile << v[i] << " ";
}
wrtBFile.write((char *)&v, sizeof(v));
//二进制方式写入
wrtFile.close();
redFile.close();
wrtBFile.close();
return 0;
}
4. 二进制文件读写
二进制文件的读写与文本文件相似,不过是通过两个函数read和write来进行读写操作,参数如下:
write(const char* s, long n)
意思是将内存地址s处的n个字节内容,写入到文件中写指针指向的位置,然后将写指针向后移动n字节,读的参数与写相同。
上面的例子中也有二进制方式写的示例。