文件操作的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,即

下面看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,结合前面所讲,此时不会清空文件,且如果不存在也不会自动创建文件

时间: 2024-08-12 08:52:00

文件操作的openmode的相关文章

QT开发(二十四)——QT文件操作

QT开发(二十四)--QT文件操作 一.QT文件操作简介 QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同. 1.IO操作的主要函数接口 打开设备:bool open(OpenMode mode) 读取数据:QByteArray read(qint64 maxSize) 写入数据:qint64 write(const QByteArray & byteArray) 关闭设备:void close() IO操作的本质是连续

第32课 Qt中的文件操作

1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操作中的关键函数接口——IO操作的本质:连续存储空间的数据读写 ①打开设备:bool open(OpenMode mode); ②读取数据:QByteArray read(qint64 maxSize); ③写入数据:qint64 write(const QByteArray& byteArray);

【c++笔记十三】c++中的输入、输出和文件操作

2015年2月6日 周五 晴 很快到星期五了,感觉这一个星期都是在复习,这两周过后我觉得c++的基本知识应该掌握的差不多了,可以追求一点更高层次的东西了. 今天讲一讲c++中的输入.输出和文件操作,差不多c++基本语法就结束了.可能以后的笔记中不会再强调基本的语法知识. --------------分割线-------------- 其实在c语言中,我们就已经学习了基本的输入输出和文件操作,像什么printf.scanf.fopen.fclose之类的.其实c++的IO和文件都和c差不多,只不过

python中的文件操作总结

目录 文件:数据的抽象和集合 文件的打开关闭 文件内容的读取 文件的全文本操作 文件的逐行操作 数据文件的写入 文件:数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是数据存储的一种形式 文件展现形态:文本文件和二进制文件 文本文件 VS. 二进制文件 文件文件和二进制文件只是文件的展示方式 本质上,所有文件都是二进制形式存储 形式上,所有文件采用两种方式展示 文本文件 由单一特定编码组成的文件,如UTF-8编码 由于存在编码,也被看成是存储着的长字符串 适用于例如:.txt文件..p

Python 文件操作

操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读: 不存在则创建:存在则只追加内容:] "+" 表示可以同时读写某个文件 r+,可读写文件.[可读:可写:可追加] w+,写读 a+,

python基础:python循环、三元运算、字典、文件操作

目录: python循环 三元运算 字符串 字典 文件操作基础 一.python编程 在面向过程式编程语言的执行流程中包含: 顺序执行 选择执行 循环执行 if是条件判断语句:if的执行流程属于选择执行:if语句有三种格式,如下: 在多分支的if表达式中,即使多个条件同时为真,也只会执行一个,首先测试为真: 选择执行 单分支的if语句 if CONDITION: 条件为真分支 双分支的if语句 if CONDITION 条件为真分支 else 条件不满足时分支 多分支的if语句 if CONDI

python文件操作

文件操作:os.mknod("test.txt")        创建空文件fp = open("test.txt",w)     直接打开一个文件,如果文件不存在则创建文件 关于open 模式: w     以写方式打开,a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)r+     以读写模式打开w+     以读写模式打开 (参见 w )a+     以读写模式打开 (参见 a )rb     以二进制读模式打开wb     以二进制写模式打

Python基础(六) 基础文件操作

今天学习python下对文件的基础操作,主要从open函数.File对象的属性.文件定位.简单操作.举例说明几个步骤开始学习,下面开始进入今天的主题: 一.open函数介绍 open函数主要是打开一个文件,创建一个file对象,相关的方法可以调用它进行读写 . 语法格式如下: 1 2 3 file object = open(文件名,打开文件的模式) file object  = with open (文件名,打开文件的模式) as 变量名 两种语法格式的不同在于下面这种方法不用输入f.clos

小何讲Linux: 基本文件操作和实例

文件操作的基本概念参见博客: 小何讲Linux: 底层文件I/O操作 1.  函数说明 open()函数:是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数. 所谓打开文件实质上是在进程与文件之间建立起一种连接,而"文件描述符"唯一地标识着这样一个连接 close()函数:是用于关闭一个被打开的文件.当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件. read()函数:是用于将从指定的文件描述符中读出的数据