C++文件操作
关键字:ifstream
、ofstream
、ios::
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
C++中对文件操作需要包含头文件<fstream>
文件类型分为两种:
- 文本文件 - 文件以文本的ASCII码形式存储在计算机中
- 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类:
- ofstream:写操作
- ifstream:读操作
- fstream:读写操作
文本文件
写文件
写文件步骤如下:
- 包含头文件
#include <fstream>
- 创建流对象
ofstream ofs;
- 打开文件
ofs.open("文件路径",打开方式);
- 写数据
ofs << "写入的数据"
- 关闭文件
ofs.close()
文件打开方式:
打开方式 |
解释 |
ios::in |
为读文件而打开文件 |
ios::out |
为写文件而打开文件 |
ios::ate |
初始位置:文件尾 |
ios::app |
追加方式写文件 |
ios::trunc |
如果文件存在先删除,再创建 |
ios::binary |
二进制方式 |
记忆技巧:ate = at the end
、app = append
、trunc = truncate(截断的意思)
注意:文件打开方式可以配合使用,利用|
操作符
例如:用二进制方式写文件:ios::binary | ios::out
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <iostream> #include <string> #include <fstream>
using namespace std;
int main() { ofstream outputFile;
outputFile.open("output.txt", ios::app);
if (outputFile.is_open()) { outputFile << "Hello, World!" << endl; }
outputFile.close();
return 0; }
|
读文件
读文件与写文件步骤相似,但是读取方式相对较多
读取文件步骤如下:
- 包含头文件
#include <fstream>
- 创建流文件
ifstream ifs;
- 打开文件并判断文件是否打开成功
- 读数据(四种方式)
- 关闭文件
ifs.close();
最常用的方式:getline(inputFile, line);
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <iostream> #include <string> #include <fstream>
using namespace std;
int main() { ifstream inputFile;
inputFile.open("test.txt", ios::in); if (!inputFile.is_open()) { cout << "打开文件失败" << endl; return -1; }
char c; while ((c = inputFile.get()) != EOF ) { cout << c; } inputFile.close();
return 0; }
|
二进制文件
以二进制的方式对文件进行读写操作
打开方式要指定为ios::binary
写文件
二进制方式写文件主要利用流对象调用成员函数write
函数原型:ostream& write(const char * buffer, int len);
参数解释:字符指针buffer
指向内存中一段存储空间。len
是读写的字节数
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <iostream> #include <string> #include <fstream>
using namespace std;
class Person { public: char name[20]; int age;
Person() {};
Person(char n[20], int a) { for (int i = 0; i < 20; i++) { this -> name[i] = n[i]; }
this -> age = a; } };
int main() { ofstream ofs; ofs.open("person.txt", ios::out | ios::binary);
char name[] = "Mike";
Person p1(name, 18);
if (ofs.is_open()) { ofs.write((char *) &p1, sizeof(Person)); ofs.close(); }
return 0; }
|
读文件
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char* buffer,int len);
参数解释:字符指针buffer
指向内存中一段存储空间。len
是读写的字节数
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream> #include <string> #include <fstream>
using namespace std;
class Person { public: char name[20]; int age;
Person() {};
Person(char n[20], int a) { for (int i = 0; i < 20; i++) { this -> name[i] = n[i]; }
this -> age = a; } };
int main() { ifstream ifs("person.txt", ios::in | ios::binary);
if (!ifs.is_open()) { cout << "打开文件出错" << endl; return -1; }
Person p;
while (ifs.read((char *)&p, sizeof(Person))) { cout << "姓名:" << p.name << " 年龄:" << p.age << endl; }
ifs.close();
return 0; }
|