zoukankan      html  css  js  c++  java
  • 文件操作的openmode

    C中文件的openmode如下:

    r 只读 为输入打开一个文本文件
    w 只写 为输出打开一个文本文件
    a 追加 向文本文件尾添加数据
    rb 只读 为输入打开一个二进制文件
    wb 只写 为输出打开一个二进制文件
    ab 追加 向二进制文件尾添加数据
    r+ 读写 为读写打开一个文本文件
    w+ 读写 为读写新建一个新的文本文件
    a+ 读写 为读写打开一个文本文件,并在文件尾进行写入
    rb+ 读写 为读写打开一个二进制文件
    wb+ 读写 为读写新建一个二进制文件
    ab+ 读写 为读写打开一个二进制文件,并在文件尾进行写入
    /*
        下面的函数是在vs中单步调试时得到的,具体操作是在fp.open()这里打个断点,然后单步调试(F11)
        这里体现了C中和C++打开文件的各种模式的对应关系,即mods和valid中的元素是一一对应的
    */
    _CRTIMP2_PURE FILE *__CLRCALL_PURE_OR_CDECL _Fiopen(const _Sysch_t *filename,
        ios_base::openmode mode, int prot)
        {    // open a file with native name
        static const _Sysch_t *mods[] =
            {    // fopen mode strings corresponding to valid[i]
            _SYSCH("r"), _SYSCH("w"), _SYSCH("w"), _SYSCH("a"),
            _SYSCH("rb"), _SYSCH("wb"), _SYSCH("wb"), _SYSCH("ab"),
            _SYSCH("r+"), _SYSCH("w+"), _SYSCH("a+"),
            _SYSCH("r+b"), _SYSCH("w+b"), _SYSCH("a+b"),
            0};
    
        static const int valid[] =
            {    // valid combinations of open flags
            ios_base::in,
            ios_base::out,
            ios_base::out | ios_base::trunc,
            ios_base::out | ios_base::app,
            ios_base::in | ios_base::binary,
            ios_base::out | ios_base::binary,
            ios_base::out | ios_base::trunc | ios_base::binary,
            ios_base::out | ios_base::app | ios_base::binary,
            ios_base::in | ios_base::out,
            ios_base::in | ios_base::out | ios_base::trunc,
            ios_base::in | ios_base::out | ios_base::app,
            ios_base::in | ios_base::out | ios_base::binary,
            ios_base::in | ios_base::out | ios_base::trunc
                | ios_base::binary,
            ios_base::in | ios_base::out | ios_base::app
                | ios_base::binary,
            0};
    
        FILE *fp = 0;
        int n;
        ios_base::openmode atendflag = mode & ios_base::ate;
        ios_base::openmode norepflag = mode & ios_base::_Noreplace;
    
        if (mode & ios_base::_Nocreate)
            mode |= ios_base::in;    // file must exist
        if (mode & ios_base::app)
            mode |= ios_base::out;    // extension -- app implies out
    
        mode &= ~(ios_base::ate | ios_base::_Nocreate | ios_base::_Noreplace);
        for (n = 0; valid[n] != 0 && valid[n] != mode; ++n)
            ;    // look for a valid mode
    
        if (valid[n] == 0)
            return (0);    // no valid mode
        else if (norepflag && mode & (ios_base::out || ios_base::app)
            && (fp = _Xfsopen(filename, _SYSCH("r"), prot)) != 0)
            {    // file must not exist, close and fail
            fclose(fp);
            return (0);
            }
        else if (fp != 0 && fclose(fp) != 0)
            return (0);    // can't close after test open
        else if ((fp = _Xfsopen(filename, mods[n], prot)) == 0)
            return (0);    // open failed
    
        if (!atendflag || fseek(fp, 0, SEEK_END) == 0)
            return (fp);    // no need to seek to end, or seek succeeded
    
        fclose(fp);    // can't position at end
        return (0);
            }

    其中的mods和valid是对应的,分别代表C和C++中文件的openmode,即

    搜狗截图20150512225737

    下面看c++中文件操作的openmode

    ios::in

    打开文件进行读操作,如果文件不存在,则打开失败

    ios::out

    打开文件进行写操作,如果文件不存在,则自动创建新文件[注1、注2]

    ios::app

    打开文件进行写操作,如果文件不存在,则自动创建新文件(这是因为ios::app相当与ios::app|ios::out,注3),但每次写操作之前,都会将指针放到文件末尾(意味着seekg/seekp无效,只能在文件尾写入数据)

    ios::ate 打开文件时,指针定位到文件末尾(但可以通过seekg/seekp来调节指针位置,从而在指定位置写入数据)
    ios::trunc 打开文件时清空原有数据
    ios::binary

    以二进制形式打开文件,如未设置,则默认以文本形式打开文件

    注:
    1.只设置ios::out相当于设置了ios::out|ios::trunc。在代码中体现为_SYSCH("w"), _SYSCH("w")对应的分别是ios_base::out,ios_base::out | ios_base::trunc, _SYSCH("wb"), _SYSCH("wb")对应的分别是ios_base::out | ios_base::binary,ios_base::out | ios_base::trunc | ios_base::binary,对应着文本文件和二进制文件
    2.ios::out的自动创建新文件的功能在只有ios::in|ios::out和ios::in|ios::out|ios::binary这两种情况下失效
    3.ios::app相当于ios::app|ios::out,在代码中体现为:
        if (mode & ios_base::app)
            mode |= ios_base::out;    // extension -- app implies out

    最后,ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:

    默认openmode
    ofstream ios::out
    ifstream ios::in
    fstream ios::in | ios::out

    注:

    1.只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。

    2.ofstream的默认openmode为ios::out,结合前面所讲,其实是ios::out | ios::trunc,且如果文件不存在会自动创建文件

    3.fstream的默认openmode为ios::in | ios::out,结合前面所讲,此时不会清空文件,且如果不存在也不会自动创建文件

  • 相关阅读:
    Managing C++ Objects: 管理C++对象 —— 一些建议准则
    像Java一样管理对象:T&形式仅仅用在参数传递
    Visual Studio的语法着色终于调得赏心悦目
    j.u.c: Java并发包的5大块
    笔记:Java Language Specification
    线程与锁
    分布式系统涉及的基本问题
    微服务为什么是一种趋势
    js实现复制功能
    css label两端对齐
  • 原文地址:https://www.cnblogs.com/kevinq/p/4499007.html
Copyright © 2011-2022 走看看