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

文件操作的openmode的更多相关文章

  1. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  2. Qt5:Qt文件操作类 QFile

    在QT中,操作文件一般不使用C++提供的文件操作类 , 因为操作文件的时候,要用到C++提供的 string 类,而在QT中使用的是Qt自己实现的一个string类 QString .在Qt中使用C+ ...

  3. 文件操作fstream

    c++文件操作详解 2009-04-16 20:46:35|  分类: C/C++|举报|字号 订阅 C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ost ...

  4. python之文件操作总结

    目录 文件:数据的抽象和集合 文件的打开关闭 文件内容的读取 文件的全文本操作 文件的逐行操作 数据文件的写入 使用json模块 文件:数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是数据 ...

  5. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  6. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  7. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  8. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  9. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

随机推荐

  1. SQL Server 修复数据库 相关 脚本 之 DBCC CHECKDB 用法 来自同事分享

    DBCC CHECKDB 用法详解, 手工修复数据库 1. 快速修复 DBCC CHECKDB ('数据库名',REPAIR_FAST) 2.重建索引并修复 DBCC CHECKDB ('数据库名', ...

  2. javaSE第一天

    第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5)语言    2 (6)人机交 ...

  3. Spring Controller 获取请求参数的几种方法

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...

  4. mariadb介绍

    事务(Transaction):组织多个操作为一个整体,要么全部执行,要么全部不执行 “回滚” ,rollback SQL接口:sql语句分析器和优化器 表:为了满足范式设计要求,将一个数据集分拆为多 ...

  5. 【Windows】如何判断当前鼠标是否按下左键或右键

    在delphi中,很多窗体和控件的鼠标事件里面已经将鼠标按键状态封装好传给响应事件的函数,所以这种情况直接使用就可以,但在某些时候,我们没有这些事件可以处理时,想判断鼠标按键是否按下的状态,就需要借助 ...

  6. Linux操作系统常用命令

    http://www.cnblogs.com/huangzelin/p/5617611.html http://www.cnblogs.com/liumt/p/6117168.html

  7. 关于js中立即执行的匿名函数写法

    /*最流行的写法*/ (function() { alert("run!") })(); /* !号可以有1~正无穷个,所以这一种就可以衍生无数种方式 */ !!!(functio ...

  8. IOS开发之后台处理

    1 前言IOS4 之后提供了后台处理,在后台运行应用程序,在一些情形下甚至可以在用户按下Home按钮之后在后台运行. 2 详述IOS可以在用户按下Home按钮后将应用程序添加到暂停状态.这种暂停执行的 ...

  9. 实战MySQL集群,试用CentOS 6下的MariaDB-Galera集成版

    说起mysql的集群估计很多人会首先想起mysql自带的replication或者mysql-mmm.mysql-mmm其实也是基于mysql自带的replication的,不过封装的更好用一些,但是 ...

  10. SQLAlchemy连接数据库并在django admin显示

    SQLAlchemy 0.7     postgersql  9.0 SQLAlchemy连接数据库有两种方法,一种是classic,一种是modern 1,modern方法 from sqlalch ...