C++文件操作

文件的操作

文件的打开方式

  • 定义文件流对象时使用带参数的构造函数;
  • 调用文件流成员函数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();	//检测文件是否打开

说明

  1. 可以用位或运算对openmode进行组合;
  2. 打开文件操作若失败,open函数的返回值为0(假)。如果是调用构造函数打开文件且打开操作失败,则流对象的值为0(空对象);
  3. 每一个打开的文件都有一个文件指针,该指针初始位置要么在文件末尾(当指定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;
}
posted @ 2020-06-30 03:04  暖浮生  阅读(23)  评论(0编辑  收藏  举报