本文中仅为文件读写的简单操作。
一、文件操作类
在C++中,有一个stream类,所有的I/O都以这个“流”为基础。处理文件类似于处理标准输入和输出,类fstream、ifstream和ofstream分别从类iostream、istream和ostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。
#include
fstream file; //读写操作,对打开的文件可进行读写操作
ifstream file_in; //文件读操作,从存储设备读取到内存中
ofstream file_out; //文件写操作,从内心on个写入存储设备
二、打开文件
对这些类的对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象来表示这些类的实例,而这个流对象所做的任何输入输出操作实际上就是对该文件所做的操作。
1.使用构造函数打开文件
fstream file("test.txt", ios::in | ios::out);
ifstream file_in("test.dat", ios::app);
ofstream file_out("test.dat", ios::binary | ios::app);
上述代码中的ios类定义了打开文件的方式,有如下几种方式:
- ios::app 从后面添加
- ios::ate 打开并找到文件尾
- ios::binary 二进制模式 I/O (与文本模式相对)
- ios::in 只读打开
- ios::out 写打开
- ios::trunc 将文件截为 0 长度
这些方式是能够进行组合使用的,如上代码中所示,以“或”运算("|")的方式进行组合。
2.使用open()函数打开文件
使用流对象的open()函数打开文件,默认以写方式打开时,文件不存在则创建,而以读打开时不存在则打开不成功,文件打开时默认是兼容共享模式。
ofstream file_out;
file_out.open("test.txt", ios::out|ios::binary); //根据自己需要进行适当的选取打开方式
3.打开文件的属性设置
打开文件的属性同样在ios类中有定义:
- 0 普通文件,打开访问
- 1 只读文件
- 2 隐含文件
- 4 系统文件
同样的,也可以用“或”运算符将以上属性连接起来,例如
fstream file;
file.open("test.txt", ios::app|ios::binary, 1|2);
4.检查文件打开是否成功
使用is_open()成员函数来检查文件是否打开,该函数返回一个bool值,“true”代表顺利打开,“false”代表打开失败。
相关代码见本文第四部分读写文件。
三、关闭文件
文件读写完成之后,必须将其关闭以使文件重新变为可访问的。关闭文件需要调用“close()”函数,它负责将缓存中数据释放出来并关闭文件。
这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。
相关代码见本文第四部分读写文件。
四、读写文件
1.文本文件的读写
fsteam、ifstream和ofstream是派生类,故其可以使用父类的成员来访问数据。
向文件中写入数据,使用插入器(<<)写文件。
//写入文件
#include //在标准C++中,已经使用取代,所有的C++标准头文件都是无后缀的
using namespace std;
int main()
{
ofstream file_out;
file_out.open("test.txt", ios::app); //打开文件
if(file_out.is_open()) //检查文件是否打开成功
{
file_out<<"Hello, guys."<
从文件中读入数据同样可以用与cin>>一样的方法。
//从文件中读入数据并写进另一个文件中
#include
#include
#include
using namespace std;
int main()
{
char buffer[256];
ifstream file_in("test.txt"); //构造函数打开文件
ofstream file_out;
if (! file_in.is_open())
{
cout << "Error opening file";
exit (1);
}
while (!file_in.eof() )
{
file_out.open("out.txt", ios::app); //open函数打开文件
file_in.getline (buffer,100); //读入数据
file_out<< buffer << endl; //写入数据
file_out.close(); //关闭文件
}
return 0;
}
在上面的代码中使用了一个新的成员函数eof,它是ifstream从类ios中继承过来的,当读入文件到达文件末尾时返回true。
使用getline()函数读取文件,头文件#include<string>,每次读取一行,下次读取会自动换行
//头文件
#include<fstream>
#include<iostream>
#include<string>
//命名空间
using namespace std;
int main()
{
ifstream readCard("../card.txt");
string card;
if (!readCard.is_open())
{
cout << "Error opening file";
exit (1);
}
while(!readCard.eof())
{
getline(readCard, card); //读取文件的一行,不包括换行符
cout<<card<<endl;
}
system("pause");
return 0;
}
2.二进制文件的读写
首先看一下,什么是二进制文件。
二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
下面,使用成员函数read()和write()读写二进制文件。
这两个函数的原型为:
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
其中,buffer是一块内存地址,用来存储或者读数据;len表示读写的字节数。
函数的功能即将字符指针buffer所给的地址开始的len个字节长度的内容不加转换的读入或写到磁盘文件中。
下面是代码
#include
#include
using namespace std;
int main()
{
char buffer[256];
int len = 9;
ofstream file_out("writeBinary.dat", ios::binary); //打开二进制文件
ifstream file_in;
file_in.open("readBinary.dat", ios::binary); //打开二进制文件
file_in.read(buffer, len); //将二进制文件内容读入内存中
file_out.write(buffer, len); //将内存中的内容写入二进制文件中
file_in.close(); //关闭文件
file_out.close();
return 0;
}
3.文件读写位置的定位
在读写文件的时候,每读取或者写入一个字节,磁盘中的文件指针就会向后移动一个字节。可以通过控制指针的位置,以便在我们需要的位置进行读写文件。
文件流提供以下成员函数来读取或配置文件指针:
- tellg() 返回读取文件指针的当前位置
- tellp() 返回写入文件指针的当前位置
- seekg(指针偏移量) 将读取文件指针移到指定位置
- seekg(指针偏移量,参照位置) 将读取文件指针移到指定位置
- seekp(指针偏移量) 将写入文件指针移到指定位置
- seekp(指针偏移量,参照位置) 将写入文件指针移到指定位置
这些成员函数名和参数,容易混淆,下面就简单解释一下:
1)可以看到,函数名最后一个字母不是g就是p,其中,g代表get,表示读取;p代表put,表示写入。
2)函数参数中的“文件中的位置”和“指针偏移量”为long整型,一字节为单位。“参照位置”是一个有以下值的枚举:
- ios::beg 文件开头计算偏移量
- ios::cur 文件当前位置计算偏移量
- ios::end 文件结尾计算偏移量
其中,函数seekg(指针偏移量)和seekp(指针偏移量),默认从文件开头计算偏移量。
下面是代码,功能是获取文件的总字节数
#include
#include
#include
using namespace std;
int main()
{
long lenBegin, lenEnd;
ifstream file_in;
file_in.open("readBinary.txt", ios::in|ios::binary); //打开文件
if(!file_in.is_open()) //检查文件是否打开成功
{
cout<<"Error Opening File."<
才疏学浅,欢迎指正。
参考:
http://blog.csdn.net/kingstar158/article/details/6859379
http://blog.sciencenet.cn/blog-481152-434834.html
http://blog.163.com/dingmz_frcmyblog/blog/static/21730402320133174330716/
http://c.biancheng.net/cpp/biancheng/view/260.html