c++文件操作

c++文件操作

ofstream:写操作(输出)的文件

ifstream:读操作(输入)的文件

fstream:同时读写操作的文件

打开文件

被打开的文件在程序中由一个流对象来表示,而对这个流对象所做的任何操作就是对该文件进行操作

open():void open (const char* filename, openmode mode)//通过流打开文件,成员函数

filename:打开的文件名

mode:标志组合

ios::in //输入(读)文件
iOS::out//输出(写)文件
ios::ate//初始位置,文件末尾
iOS::app//所有输出附加在文件末尾
iOS::trunc//如果文件已存在则先删除
ios::binary//二进制方式

fstream中还有一个重载的open函数

void open(const char*filename, int mode, int access);

mode:标志组合

aeecss:打开文件的属性

0:普通文件,打开访问

1:只读文件

2、隐含文件

3、系统文件

标志符可以被组合使用,中间以“|”间隔。

比如当我们以二进制方式打开一个 “aaa.bin” 的文件时,通过调用open函数来实现。

fstream file;
file.open("aaa.bin", ios::out | ios::app | ios::binary);

ofstream ,ifstream和fstream都包含了成员函数open,但是默认的打开方式不同

ofstream ios::out,ios::trunc

ifstream ios::in

fstream ios::in | ios::out

ofstream ifstream和fstream这些类都有一个构造函数可以直接调用open函数。并拥有同样的参数。

ofstream file("aaa,.bin", ios::out | ios::in | ios::binary);//不调用open函数的打开方式

可以通过调用is_opne函数来检查文件是否被打开

bool is_open();

关闭文件

完成读写操作后,我们将必须关闭文件,使得这个文件可以重新被访问。

void close();

对文件调用close()函数后,原先的流对象就可以用来打开其他文件,这个文件也可以被其他进程来访问。

为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close.

文本文件

状态标识符验证
file.eof() //当文件到达末尾的时候返回true
file.bad() //如果在读写过程中出错,返回true
file.fail()//读写过程中出错and格式错误返回true
file.good()//如果调用以上任何一个函数返回true的话,此函数则返回false
clear() //重置以上成员函数所检查的标志
获得和设置流指针

所有输入/输出流对象都至少有一个流指针:

ifstream:有一个get pointer的指针,指向下一个将被读取的元素

ofstream:有一个put pointer的指针,指向写入的下一个元素

fstream:同时继承get和put

通过下面的成员函数来读出或者配置这些流指针

tellg()tellp()
//这两个成员函数不用传入参数,返回pos_type类型的值,就是一个整数,代表get和put流指针的位置
seekg()seekp()
//用来改变流指针get和put的位置
seekg(off_type pos);
seekp(off_type pos);
//使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置,要求传入的参数类型与函数tellg和tellp的返回值相同
seekg(off_type offset, seekdir dir);
seekp(off_type offset, seekdir dir);
//使用这个原型可以指定由参数dir决定的一个具体的指针开始计算的一个位移(offset)
iso::beg 从流开始位置计算的位移。
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移

流指针get和put的值对文本文件和二进制文件的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改,因此建议对文件模式打开的文件总是使用seekg和seekp的第一种原型,而且不要对tellg和ellp的返回值进行修改。

对二进制文件,可以任意使用这个函数,因为不会有任何意外发生。

二进制文件

流文件包括两个为顺序读写数据特殊设计的成员函数:write和read

write:是ostream的一个成员函数

write(char * buffer, streamsize size);

read:是istream的一个成员函数

read(char* buffer, streamsize size);

// reading binary file
#include 
#include 
using namespace std;
int main ()
{
    const char * filename = "example.txt";
    char * buffer;
    long size;
    ifstream file(filename, ios::in|ios::binary|ios::ate);
    size = file.tellg();//初始位置为文件尾部
    file.seekg(0, ios::beg);
    buffer = new char [size];
    file.read(buffer, size);
    file.close();
    cout <<"the complete file is in a buffer";
    delete[] buffer;
    return 0;
}
//The complete file is in a buffer

缓存和同步

当我们对文件流进行操作的时候,他们与一个streambuf类型的缓存(buffer)联系到一起,这个buffer实际上是一块内存空间,所谓流(stream)和物理文件的媒介。对一个输出流,每次成员函数put被调用,这个字符不是直接写入该输出流所对应的物理文件中的,而是首先被插入到buffer中的。

当缓存被flush时,它里面的所有数据会被写入到物理媒介中(输出流),或者简单的被抹掉(输入流),这个过程被称为时同步(synchronization)

  • 当文件被关闭时:在文件被关闭前,所有还没有被完全写出或者读取的缓存都将被同步
  • 当缓存buffer满时:缓存buffers有一定的空间限制。当缓存满时,他会被自动同步
  • 控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush和endl。
  • 明确调用sync():调用成员函数sync()可以引发立即同步,这个函数返回一个int值,等于-1表示,没有操作失败

你可能感兴趣的:(c++,c++)