文件的操作
文件的打开方式
- 定义文件流对象时使用带参数的构造函数;
- 调用文件流成员函数open;
文件流定义在std的命名空间中,因此在使用文件流的时候要和使用cin、cout输入输出流一样,用using指令声明使用的命名空间。
文件的打开方式openmode
取值 | 含义 | 作用 |
---|---|---|
ios_base::in | input | 以输入的方式打开文件 |
ios_base::out | output | 以输出的方式打开文件,若该文件已存在,则将其内容全部清空 |
ios_base::app | append | 以输出的方式打开文件,写入数据添加在文件末尾 |
ios_base::ate | at end | 打开一个已有的文件,文件指针指向文件末尾 |
ios_base::binary | binary | 二进制文件,默认为ASCII文件 |
ios_base::trunc | truncate | 打开一个文件,若文件已存在,则将其内容全部清空;若文件不存在,则建立新文件。若指定了ios::out方式而未指定ios::app、ios::ate、ios::in时,默认为此方式 |
文件流相关的函数
ifstream(); //文件输入流构造函数
ifstream(const char* filename ,ios_base::openmode mode = ios_base::in);
ofstream(); //文件输出流构造函数
ofstream(const char* filename ,ios_base::openmode mode = ios_base::out);
fstream(); //文件输入输出流构造函数
fstream(const char* filename ,ios_base::openmode mode = ios:;base::in|ios_base::out);
//使用成员函数open打开文件
void open(const char* filename ,ios_base::openmode mode = ios_base::in);
bool is_open(); //检测文件是否打开
说明
- 可以用位或运算对openmode进行组合;
- 打开文件操作若失败,open函数的返回值为0(假)。如果是调用构造函数打开文件且打开操作失败,则流对象的值为0(空对象);
- 每一个打开的文件都有一个文件指针,该指针初始位置要么在文件末尾(当指定ios_base::app或ios_base::ate时),要么在文件开头。每次读写都从文件指针的当前位置开始,每读写一个字节,指针就自动后移一个字节,当文件指针移到最后,就会遇到文件结束EOF(文件结束符)。
文件的关闭:文件关闭调用文件流成员函数void close();
文件的状态
文件的状态可以通过文件流的四个成员函数来检测
成员函数 | 描述 |
---|---|
bool eof() | 文件到达末尾,eof函数返回为真,否则返回为假 |
bool bad() | 如果在读写文件过程中出错,返回为true,如:对一个不是为写入状态打开的文件进行写入,或者要写入的设备没有了剩余空间 |
bool fail() | 除了遇到与bad函数同样的情况会返回true外,格式错误时,fail函数也会返回true,比如:要读入一个整数而得到一个字母时。 |
bool good() | 如果调用以上任何一个函数返回true的话,good函数将返回false; |
二进制的文件读写
二进制文件读写主要使用read()和write()函数;
//用于文件输入流
istream& read(char*s ,streamsize n); //从文件中读取n字节到s中
streampos tellg(); //返回文件指针的位置
istream& seekg(streampos pos); //移动文件指针到pos位置
istream& seekg(streamoff off, ios_base::seekdir dir); //以dir参照off偏移移动文件指针
//用于文件输出流
ostream& wirite(const char* s, streamsize n); //输出s的n个字节到文件中
streampos tellp(); //返回文件指针的位置
ostream& seekp(streampos pos); //移动文件指针到pos位置
ostream& seekp(streamoff off , ios_base::seekdir dir); //以dir参照off偏移移动文件指针
flush(); // 文件输出流刷新
程序对二进制文件的读写结果文件,用普通方式打开,显示的是乱码,但这并不重要,只要按照程序写入的格式读取,可以重新输出为文本文件!
二进制文件读写操作示例:
/*将一个book.dat的文件数据读取后用二进制的方式写入到另一个文件,需要注意编码格式C++似乎对unicode编码支持不友好,读取的文件若是编码格式不对,将会读入垃圾数据*/
#include <iostream>
#include <fstream>
using namespace std;
struct Book {
char c[5], n[11]; //产品代码、产品名称
int price, count; //产品单价,产品数量
};
int main() {
Book a;
ifstream inf("book.dat");
ios::openmode m = ios::in | ios::out; //定义一个可读可写的参数变量用于mode组合使用
fstream ouf("out.dat", m | ios::trunc | ios::binary);
if (inf.fail() || ouf.fail()) return -1; //文件打开失败退出运行
while (!inf.eof()) {
inf >> a.c >> a.n >> a.price >> a.count;
ouf.write(reinterpret_cast<const char*> (& a), sizeof(Book)); //写二进制文件
}
inf.close();
ouf.seekg(2 * sizeof(Book), ios::beg); //定位第3个结构体
cout << a.c << a.n << a.price << a.count << endl;
ouf.close();
return 0;
}