目录
C++对文件的操作以流为基础,使用stream类的派生类fstream实现,使用时需要增加头文件<fstream.h>。fstream可以通过构造函数指定某一个文件。
C++流文件操作由三种读写类型:
ofstream:给一个特定文件写入数据,只能写入文件
ifstream:从一个特定文件读出数据,只能读取文件
fstream:可以对特定文件读写操作
1. 打开/关闭流操作
// 1. 构造文件流对象,并使用open()函数以mode模式打开文件
fstream file1;
file1.open(filename,mode,0);
// 2. 构造文件流对象,并以默认模式打开文件
fstream file2(filename);
// 3. 构造文件流对象,并以mode模式打开文件
fstream file3(filename,mode);
// 4. 判断文件是否成功打开且没有关闭
file1.is_open(); // 该函数返回bool类型
// 5. 关闭文件
file1.close();
上面提到的open()函数声明如下:
void open(const char* filename,int openmode,int access);
参数说明:
@filename:要打开的文件名
@mode:要打开文件的方式
@access:打开文件的属性
mode模式有如下
ios::app: 以追加的方式打开文件,如果文件不存在,创建文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式
ios::in: 文件以输入方式打开(文件=>程序,读),如果文件不存在,打开失败
ios::out: 文件以输出方式打开 (程序=>文件,写)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
ifstream类默认打开文件的方式为ios::in
ofstream类默认打开文件的方式为ios::out
fstream类默认打开文件的方式为ios::in | ios::out
打开文件的属性access取值有:
0 = 普通文件,打开访问;1 = 只读文件;2 = 隐含文件;4 = 系统文件
属性取值access和打开方式mode都可以用或 | 连接。
2. 读写操作
2.1 文本文件读写
文本文件写入可以使用<<符号。
读写文件时需要判断流状态,有以下常用流状态成员函数
eof(); // 如果到达文件末尾,返回 true
bad(); // 如果读写过程中出错,返回true
fail(); // 读写过程中出错或格式错误,返回true
读取文件可以使用getline()函数或运算符>>,getline会读取空格,只能读取字符串;>>会忽略空格。另外读写二进制文件时使用read()/write()函数。读取文本文件示例:
void CPlusPlus_file()
{
const char *szFilename = "text1.txt";
/************************** 写入文本文件 **************************/
ofstream wfile(szFilename,ios::trunc); // 以追加模式打开
wfile << 1 << endl;
wfile << 12 << endl;
wfile << 123 << endl;
wfile << 1234 << endl;
wfile << "Hello World!" << endl;
wfile.close();
cout << "write end" << endl;
cout << endl;
std::ifstream file(szFilename);
if(!file.is_open())
{
std::cout << "Open file FAILED:" << szFilename << std::endl;
return;
}
/**************************** getline()读取文件 ****************************************/
std::string strtmp;
while(getline(file,strtmp)) // 这里也可以先判断读取文件时是否到达了文件末尾 while( !file.eof() && getline(file,strtmp))
{
cout << strtmp << endl;
}
file.close();
cout << "getline() end" << endl;
cout << endl;
/****************************** >> 读取文件 ***************************************/
file.open(szFilename,ios::in);
if(!file.is_open())
{
std::cout << "Open file FAILED:" << szFilename << std::endl;
return;
}
int itmp;
while(file >> itmp) // 这里也可以先判断读取文件时是否到达了文件末尾 while( !file.eof() && file >> itmp)
{
cout << itmp << endl; // >> 读取时只能读取指定类型的内容,这里是只读取整型
}
file.close();
cout << ">> end" << endl;
cout << endl;
}
2.2 二进制文件读写
二进制文件读的时候需要知道文件大小是多少,使用seekg()和ftellg()函,然后再使用read()函数读取数据。
void CPlusPlus_binfile()
{
const char *szFilename = "LED_OP.hex";
std::ifstream file(szFilename,ios::binary);
if(!file.is_open())
{
std::cout << "Open file FAILED:" << szFilename << std::endl;
return;
}
/****************************获取文件大小***********************/
file.seekg(0,ios::end); // 指针定位到文件末尾
size_t len = file.tellg(); // 获取文件当前位置,即文件大小
file.seekg(0,ios::beg); // 指针定位到开头位置,开始读取数据
/*************************** 读取数据 *****************/
char *pbuf = new char[len];
file.read(pbuf,len);
file.close();
/************************** 写入数据 ********************/
const char *szFilename1 = "LED_OP1.hex";
ofstream wfile(szFilename1,ios::binary);
if(wfile.is_open())
{
wfile.write(pbuf,len);
wfile.close();
}
delete[] pbuf;
}
参考:
1. fstream —文件读写操作_Xu小亿的博客-CSDN博客_fstream读写文件
2. C++ ifstream 读取文件大小和读取所有内容_Car12的博客-CSDN博客_ifstream获取文件大小