在文件处理中,我碰到了 ifstream、ofstream 和 fstream。能否有人告诉我它们之间的主要区别?
basic_ifstream
basic_ofstream
basic_fstream
ifstream
、ofstream
和fstream
是“char
”的特化模板,这意味着它们实际上就是basic_ifstream<char>
、basic_ofstream<char>
和basic_fstream<char>
,即它们用于从文件中读取和写入char
。
ifstream
是输入文件流,允许您读取文件的内容。ofstream
是输出文件流,允许您将内容写入文件。fstream
默认允许从文件中读取和写入。但是,您可以通过传入 ios::open_mode
标志,使 fstream
表现得像 ifstream
或 ofstream
。ios::openmode
标志打开模式标志如下:
标志 | 描述 |
---|---|
ios::app |
所有写操作必须发生在文件末尾 |
ios::binary |
以二进制模式打开 |
ios::in |
以读取模式打开 |
ios::out |
以写入模式打开 |
ios::trunc |
打开文件后清空文件内容 |
ios::ate |
打开文件后定位到文件末尾 |
这些标志是可叠加的,这意味着您可以使用按位或 |
运算符组合多个标志。如果我想以二进制模式打开文件并进行追加操作,可以按以下方式组合标志:
ios::binary | ios::app
ifstream
总是设置了ios::in
标志,且无法移除。同样地,ofstream
总是设置了ios::out
标志,且无法移除。添加的其他标志将与ifstream
的ios::in
和ofstream
的ios::out
结合使用。fstream
传递任何标志,那么默认为ios::in | ios::out
,因此您可以从文件中读取和写入。但是,如果您明确为fstream
指定了一个标志,例如ios::in
,它将仅被打开用于读取,就像一个ifstream
。您可以在构造函数中或在调用open()
时这样做:
ifstream infile("filepath", ios::binary); //Open the file for reading in binary mode, ios::in will always be set
ofstream outfile("filepath", ios::trunc); // Open the file for writing and clear its contents, ios::out is implicitly set
fstream inoutfile("filepath") // default flag will be: ios::in | ios::out hence both reads and writes possible
fstream infile("filepath", ios::in) // file will be opened in read mode like fstream
ifstream
和ofstream
,而总是使用带有所需标志的fstream
。但是在设置标志时容易出现意外错误。因此,使用ifstream
可以确保不会发生写入操作,而使用ofstream
只会进行写入操作。
ios::noreplace
)C++ 23添加了ios::noreplace
标志,它专门用于以独占方式打开文件进行写入。该标志在某些实现中已经存在,但现在在C++ 23中已经标准化。如果文件已经存在,则无法打开。
ifstream
仅用于输入。
ofstream
仅用于输出。
fstream
可以用于输入和/或输出。
关键在于命名:
ifstream
= "输入文件流",它是 istream
或 "输入流" 的一种类型ofstream
= "输出文件流",它是 ostream
或 "输出流" 的一种类型fstream
= "(双向) 文件流",就像 iostream
("输入/输出流") 一样,通过继承包含了两个方面
ifstream
,ofstream
,fstream
。 - Enlico