文件模式总结
c++文件的打开模式有六个:in,out,ate,app,trunc,binary。
如果你输出它们cout<<ios_base::in<<endl;的话,会看到它们的值分别是1,2,4,8,16,32.
但是,它们的值并不能说明什么,因为我不知道fstream类的构造函数是怎样通过它们的组合的值来决定文件打开时的状态的。
问题:按照排列组合的知识,6个模式的组合数等于2^6-1,即63种组合。这其中哪些组合是无效的?我想说的是,其实这六种模式是互相影响的,所以我没有办法看到
一种组合就判别出文件打开时的状态。最让我头痛的就是两个问题:如果文件不存在,会不会创建?如果文件存在,内容会不会被清空?
后来,我又遇到一个问题:是不是只允许在末尾写入?
在C语言中,没有组合,所以文件打开模式明白清晰,如果只算文本文件的话,只有六种:r,w,a,r+,w+,a+.
前三种模式的含义如下,后三种和前三种的状态是一样的,只不过后三种都是可读可写而已。
r:文件存在则不清空内容,不存在则不创建新文件。
w:存在则清空,不存在则创建。
a:存在则不清空,不存在则创建。(而且,只允许在末尾写文件。)
好吧,我还捏造出一种情况:如果我想让文件在打开时的状态是“文件存在则清空,不存在则不创建”,我应该怎么办?
转念一想,如果我的需求是这样的话,我真怀疑这个需求是不是有点蛋疼。所以,捏造出来的这种状态是不必要的。
然后我看到C语言和C++的对应:http://stdcxx.apache.org/doc/stdlibug/30-3.html
Table 33: Open modes and their C stdio counterparts
| Open Mode | C stdio Equivalent | Effect |
|
in |
"r" |
Open text file for reading only |
|
out|trunc out |
"w" |
Truncate to0 length, if existent, or create text file for writing only |
|
out|app |
"a" |
Append; open or create text file only for writing at end of file |
|
in|out |
"r+" |
Open text file for update (reading and writing) |
|
in|out|trunc |
"w+" |
Truncate to0 length, if existent, or create text file for update |
|
in|out|app |
"a+" |
Append; open or create text file for update, writing at end of file |
在这个表的上面还有这么一句话: Combinations of modes that are not listed in the table (such as bothtruncandapp) are invalid, and the attemptedopen() operation fails.
我更头痛了,因为:ate模式哪儿去了?
于是,我google到了一个帖子http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/8baa7462-6c33-44d0-a11a-7518d354644b
那个人最终使用in|out|ate的组合达到了“文件打开时不清空,同时写操作可以在任意位置”的效果。
最后,我打算自己动手实践,让自己在进行文件操作时有的放矢。以下是我的实践结果:
我的困惑来自于写操作和读写操作,所以单独的读操作不试验。我也不关心文件存在与否。同时,为了减少实验的次数,我规定全部采用fstream类。
(1)out 文件被清空,写操作可以在任意地方。
out|trunc 空,任意。
out|app 不空,写操作只能在末尾。
out|ate 空,任意。
(2)
int|out 空,任意。
in|out|trunc 空,任意。
in|out|app 不空,末尾。
in|out|ate 不空,任意。
in|out|trunc|app 文件打开失败。
实验到此,还有一种状态没出现:空,末尾。如果要实现最后这种,可以先删除文件,在采用out|app打开。
总结一下,三种状态(1.空,任意;2.不空,任意;3.不空,末尾)分别可以用out,out|app和in|out|ate实现。不过 in|out|ate的问题是,如果要打开的文件不存在,则不会创建新文件,打开失败。

浙公网安备 33010602011771号