对文件的操作
学C的时候我们就接触过如何读写文件,C++中存在C++风格的文件读写,同时也支持C风格的读写文件.
这是IO类库的基本结构,箭头表示该类从何处继承.
文件的打开模式标记代表了文件的使用方式,这些标记可以单独使用,也可以组合使用,组合使用时,用|将其连接
模式标记 | 适用对象 | 作用 |
---|---|---|
ios::in | ifstream、fstream | 打开文件用于读取数据。如果文件不存在,则打开出错。 |
ios::out | ofstream、fstream | 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除原来的内容。 |
ios::app | ofstream、fstream | 打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件。 |
ios::ate | ifstream | 打开一个已有的文件,并将文件读指针指向文件末尾(读写指 的概念后面解释)。如果文件不存在,则打开出错。 |
ios:: trunc | ofstream | 单独使用时与 ios:: out 相同。连用时,如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件。 |
ios::binary | ifstream、ofstream、fstream | 以二进制方式打开文件。若不指定此模式,则以文本模式打开。 |
下面的代码简单地展示了如何读写文本文件,重点为代码内注释.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void) {
string name;
int age;
ofstream fdata;
fdata.open("data.txt");//打开文件,如未指定打开方式,默认为ios::out.如果没有该文件,则会新建
while (1) {
cout << "请输入昵称:";
cin >> name;
if (cin.eof()) {
break;
}
fdata << name << "\t";//用流运算符<<向文件中输入数据
cout << "年龄:";
cin >> age;
fdata << age << "\n";//输入数据
}
fdata.close();//一定记得关闭文件
ifstream fread;
fread.open("data.txt");//打开文件,如未指定打开方式,默认为ios::in
while (1) {
fread >> name;//用流运算符>>从文件中读取数据到变量
if (fread.eof()) {
break;
}
fread >> age;//读取数据
cout << name << "\t" << age << endl;
}
fread.close();//关闭文件
system("pause");
return 0;
}
data.txt文件的内容:
写二进制文件的简单操作如下,基本的操作和读写文本文件一样:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void) {
string name;
int age;
ofstream fdata;
fdata.open("data.dat", ios::binary | ios::out | ios::trunc);
while (1) {
cout << "请输入昵称:";
cin >> name;
if (cin.eof()) {
break;
}
fdata << name << "\t";
cout << "年龄:";
cin >> age;
//write(const unsigned char *buf,int num);
//从buf 指向的缓存写 num 个字符到文件中
fdata.write((char*)&age, sizeof(age));
fdata << "\n";
}
fdata.close();
system("pause");
return 0;
}
data.dat文件内容,可以看到是乱码
用二进制方式打开
前四个是中文的存储,09是水平制表符(\t),14 00 00 00是输入的年龄(16进制),转化成10进制就是1*16+4=20,和输入的数据相同,0e是回车(\n).后面一个数据分析同上