资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

C++中fstream-创新互联

#include

头文件fstream包含了ifstream、ofstream、fstream三个类,可以通过定义这三个类的对象来实现相对应的文件操作。

创新互联公司是一家专注于成都网站制作、做网站与策划设计,望城网站建设哪家好?创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:望城等地区。望城做网站价格咨询:18980820575
#includeofstream     //文件写操作,内存写入存储设备
ifstream     //文件读操作,存储设备读取到内存中
fstream      //读写操作,对打开的文件可进行读写操作
1.打开文件
  • 函数 open()

public member function
 
void open ( const char * filename,
            ios_base::openmode mode = ios_base::in | ios_base::out );
 
void open(const wchar_t *_Filename,
        ios_base::openmode mode= ios_base::in | ios_base::out,
        int prot = ios_base::_Openprot);
参数filenamemodeprot
含义操作文件名打开文件方式打开文件属性(应用少)
  • 打开文件的方式在ios类(所有流式I/O的基类)中定义,有如下几种方式:
ios::in为输入(读)而打开文件
ios::out为输出(写)而打开文件
ios::ate初始位置:文件尾
ios::app所有输出附加在文件末尾
ios::trunc如果文件已存在先删除文件
ios::binary二进制方式
  • 打开文件的方式可以单一使用或者利用“|”组合使用,例如:

ofstream outfile;
outfile.open("Hello.txt",ios::in|ios::out|ios::binary)
  • 打开文件的属性在ios类中也有定义:
0普通文件,打开文件
1只读文件
2隐含文件
3系统文件

对于文件的属性也可以利用“|”和“+”进行组合使用

  • 如果只是使用默认的打开方式可以不用显式的调用open()函数,直接使用流对象进行文件的操作,如:

ofstream out("\\\",ios::out);
ifstream in("\\\",ios::in);
fstream fil("\\\",ios::in|ios::out);

当使用默认的方式对文件进行打开时,可以使用成员函数is_open()对文件进行是否已打开的验证。

2.关闭文件
  • 函数close()
    对文件进行完读写操作之后,必须将文件关闭使得文件重新变成可以访问的。close()函数负责将缓存中的数据排放出来并关闭文件。关闭的只是流对象所打开的文件,仍然可以利用流对象去打开别的文件。
3.文本文件的读写

文本文件的读写可以如同类与控制台交互一样利用"<<”和">>"分别进行写和读,如:

#includeint main()
{
    ofstream file("out.txt");
    if(file.is_open())
    {
        file<<"This is a test"<

#include#includeusing namespace std;
int main()
{
  char buff[256];
  ifstream infile("in.txt");
  if(!infile.is_open())
      cout<<"Error open"<

状态标志符的验证

有一些验证流的状态的成员函数(所有都返回bool型返回值):

  • bad()
    如果在读写过程中出错,返回true.
  • fail()
    除了与bad()同样的情况下返回true外,加上格式错误时也返回true,例如当想要读入一个整数 ,而得到一个字母。
  • eof()
    如果读文件到达文件的末尾,返回true。
  • good()
    最通用的验证:如果遇上以上任何一个函数返回true的话,此函数返回false。
  • clear()
    重置以上成员函数所检查的状态标志,没有参数。

获得和设置流指针

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

  • ifstream,类似istream,有一个被称为get pointer的指针,指向下一个将被读取的元素。
  • ofsream,类似ostream,有一个被称为put pointer的指针,指向下一个元素的位置。
  • fstream,类似iostream,同时继承了 get 和 put 。

可以使用以下成员函数来读取或配置流指针:

  • tellg()和tellp()
    这两个函数不用传入参数,返回pos_type类型的值,即一个整数,代表当前get流指针的位置(用tellg)或put流指针的位置(用tellp)。
  • seekg()和seekp()
    这对函数分别用来改变指针get和put的位置。两个函数都被重载为两种不同的原型:

seekg(pos_type position);
seekp(pos_type position);

使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。

seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );

使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:

ios::beg从流开始位置计算的位移
ios::cur从流指针当前位置开始计算的位移
ios::end从流末尾处开始计算的位移

流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。

// obtaining file size
    #include#includeconst char * filename = "test.txt";
    
    int main () {
        long l,m;
        ifstream in(filename, ios::in|ios::binary);
        l = in.tellg();
        in.seekg (0, ios::end);
        m = in.tellg();
        in.close();
        cout<< "size of "<< filename;
        cout<< " is "<< (m-l)<< " bytes.\n";
        return 0;
    }                     //`获取二进制文件的大小
4.二进制文件

在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。

文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:

write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );

这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。

// reading binary file
    #include#includeconst char * filename = "test.txt";
    
    int main () {
        char * buffer;
        long size;
        ifstream in (filename, ios::in|ios::binary|ios::ate);
        size = in.tellg();
        in.seekg (0, ios::beg);
        buffer = new char [size];
        in.read (buffer, size);
        in.close();
        
        cout<< "the complete file is in a buffer";
        
        delete[] buffer;
        return 0;
    }
    //运行结果:
    The complete file is in a buffer

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:C++中fstream-创新互联
链接分享:http://www.cdkjz.cn/article/dhjddg.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220