今天在VS2010写了一个关于文件输入的小程序,但是在用ios::nocreate参数时,提示没有ios::nocreate成员,如下:
#include
using namespace std;
int main()
{
ifstream inFile;
inFile.open("infile.txt",ios::in,ios::nocreate);
if(!inFile)
cerr<<"不能打开infile.txt"<
编译通不过,说是未定义标识符nocreate .这是怎么回事?我该怎么办呢?
原来事情是这样的。
ios::nocreate是在C++标准制定之前在头文件<fstream.h>中有定义的。但是因为它跟系统平台十分密切,所以在C++标准中去掉了对它的支持。为了弥补这一点,C++标准就规定ifstreaam中的open()函数默认打开方就是不创建文件,即文件不存在就打开出错,不会创建文件,这不正是ios::nocreate的功能吗?
注意:
- ifstream的open()函数默认打开都是不创建文件
- oftream的open()函数默认打开却是创建文件,即文件不存在时自动创建文件
- fstream如果以输入方式(ios::in)打开文件,则默认不创建文件;如果以输出方式(ios::out)打开文件,则创建文件。
一句话,输入方式打开文件时不自动创建文件,输出方式打开文件时自动创建文件。
示例如下:
#include
using namespace std;
int main()
{
fstream inFile,outFile;
inFile.open("infile.txt",ios::in);
outFile.open("out.txt",ios::out);
if(!inFile)
cerr<<"不能打开infile.txt"<
想想这也很符合逻辑,你想从一个文件中读取数据,但这个文件不存在,如果自动创建文件的话,里面什么数据都没有,那岂不是做无用功?但若你想向一个文件中写入数据,但这个文件不存在,允许自动创建,然后再把数据写入。
故,ifstream中没有ios::nocreate是没有关系的。
本文解析了C++中使用ios::nocreate参数时遇到的问题,并详细解释了ifstream与ofstream在打开文件时的行为差异,帮助读者理解C++标准库的设计理念。
3385





