文件操作
文件基本概念
根据文件数据的编码方式不同可以分为:
- 文本文件
- 二进制文件
根据存取方式不同分为:
- 顺序存取文件,访问第i个数据,首先要访问第i-1个数据,例如:磁带
- 随机存取文件,例如:磁盘
文件的基本操作:
- 读文件
- 写文件
C++ 文件流类
C++ 标准库中有3个流类可以用于文件操作,分别为:
- ifstream,读文件
- ofstream,写文件
- fstream,可读、可写
引入以上3个文件流时,需要引入 fstream 头文件,即:#include
程序中使用一个文件,必须包含3个基本步骤:
- 打开文件(open)
- 操作文件
- 关闭文件(close)
打开和关闭文件
先建立流对象,然后调用 open() 函数连接外部文件。格式如下:
流类名 对象名;
对象名.open(文件路径, 模式);
调用流类带参数的构造函数,再建立流对象的同时连接外部文件。格式如下:
流类名 对象名(文件路径, 模式);
打开、关闭文件
使用 open()
函数 打开文件 。
流类名 对象名;
对象名.open(文件路径, 模式);
模式标记 | 适用对象 | 作用 |
---|---|---|
ios::in | ifstream fstream | 以读方式打开文件。文件不存在,则抛错 |
ios::out | ofstream fstream | 以写方式打开文件。文件不存在,则新建文件;文件存在,则打开并清空文件内容 |
ios::app | ofstream | 以追加方式打开文件,用于在文件尾部添加数据。如果文件不存在,则新建文件 |
ios::ate | ofstream | 打开一个已有的文件,并将文件读指针指向文件末尾。文件不存在,抛错 |
ios::trunc | ofstream | 删除文件现有内容 |
ios::binary | ifstream ofstream fstream | 以二进制模式打开文件 |
ios::in | ios::out | fstream | 打开已存在文件,可读可写,不清空文件内容。文件不存在,抛错 |
ios::in | ios::out | ofstream | 打开已存在文件,可写,不清空文件内容。文件不存在,抛错 |
ios::in | ios::out | ios::trunc | fstream | 打开已存在文件,可读可写,清空文件内容。文件不存在,抛错 |
使用 close()
函数 关闭文件 。
流类名 对象名;
对象名.open(文件路径, 模式);
对象名.close();
示例代码:
#include
#include
using namespace std;
void main
{
ifstream inFile;
// 打开当前目录下的 data.txt 文件
inFile.open("data.txt", ios::in);
if (inFile)
{
inFile.close();
}
ofstream outFile;
// 打开指定路径的文件,这里的 newfile 没有尾缀,意味着为二进制文件
outFile.open("c:\\c2019\\newfile", ios::out | ios::binary);
if (outFile)
{
outFile.close();
}
};
文件读写操作
写操作
#include
#include
using namespace std;
int main
{
ofstream outFile;
outFile.open("score.txt", ios::out);
if (!outFile)
{
cout << "创建文件失败" << endl;
return 0;
}
char id[11], name[21];
int score;
cout << "请输入:学号 姓名 成绩 (以 Ctrl + Z 结束输入)" << endl;
while (cin >> id >> name >> score)
{
outFile << id << " " << name << " " << score << endl;
}
outFile.close();
return 0;
};
读操作
#include
#include
#include
using namespace std;
int main
{
ifstream inFile;
inFile.open("score.txt", ios::in);
if (!inFile)
{
cout << "打开文件失败" << endl;
return 0;
}
char id[11], name[21];
int score;
while (inFile >> id >> name >> score)
{
cout << left << setw(10) << id << " " << setw(20) << name << " " << right << setw(3) << score << endl;
}
inFile.close();
return 0;
};
写二进制文件(.dat)
该成员函数将村中中 buffer 所指向的 nCount 个字节的内容写入文件,格式如下:
ostream & write(char * buffer, int nCount)
示例代码:
#include
#include
using namespace std;
class CStudent
{
public:
char id[11];
char name[21];
int score;
}
int main()
{
ofstream outFile("students.dat", ios::out | ios::brinary);
if (!outFile)
{
cout << "创建文件失败" << endl;
return 0;
}
CStudent stu;
cout << "请输入:学号 姓名 成绩 (以 Ctrl + Z 结束输入)" << endl;
while (cin >> stu.id >> stu.name >> stu.score)
{
outFile.write((char *)&stu, sizeof(stu));
}
outFile.close();
return 0;
}
读二进制文件(.dat)
从文件中读取 nCount 个字节的内容,存放到 buffer 所指向的内存缓冲区中,格式如下:
ostream & read(char * buffer, int Count);
使用 ostream::gcount()
成员函数得到读取的字节数
成员函数 get() 读文件
int get()
不带参数的 get() 函数从指定的输入流中提取一个字符(包含空白字符)。
函数的返回值即为该字符。
当遇到文件结束符时,返回系统常量EOF。
istream & get(char & rch)
从指定输入流中提取一个字符(包含空白字符),将该字符作为 rch 引用的对象。
当遇到文件结束符时,函数返回0;否则返回对 istream 对象的引用。
istream & get(char * pch, int Count, char delim = ' \n')
从流的当前字符开始,读取 nCount-1 个字符,或遇到指定的分隔符 delim 结束。
函数把读取的字符(不包含分隔符)写入数组 pch 中,并在字符串后添加结束字符 '\0'。
成员函数 put() 写文件
向输出流中插入一个字节,格式如下:
ostream & put(char ch);
文本文件和二进制文件的异同
功能 | 文本文件 | 二进制文件 |
---|---|---|
存储数据格式 | 文本 | 二进制 |
存储数据是否需要转换 | 是 | 否 |
是否支持随机访问 | 否 | 是 |
通过纯本文信息(如字符串)以文本形式存储,而将数值信息以二进制文件形式存储。
随机访问文件
顺序文件
文件只能进行顺序存取操作,例如:键盘、显示器、保存在磁带上的文件
随机文件
可以在文件的任意位置进行存取操作,例如:磁盘文件
移动读指针函数
将读指针设置为 pos,即将读指针移动到文件的 pos 字节处,格式如下:
istream & seekg(long pos);
将读指针按照 seek_dir 的指示(方向)移动 offset 个字节,其中 seek_dir 是在类 ios 中定义的一个枚举类型,格式如下:
istream & seekg(long offset, ios::seek_dir dir);
返回读指针当前的位置,格式如下:
long tellg();
移动写指针函数
将写指针设置为 pos,即将写指针移动到文件的 pos 字节处。格式如下:
istream & seekp(long pos);
将写指针按照 seek_dir 的指示(方向)移动 offset 个字节,其中 seek_dir 是在类 ios 中定义的一个枚举类型。格式如下:
istream & seekp(long offset, ios::seek_dir dir)
返回写指针当前的位置。格式如下:
long tellp();