ifstream没有ios::nocreate

本文解析了C++中使用ios::nocreate参数时遇到的问题,并详细解释了ifstream与ofstream在打开文件时的行为差异,帮助读者理解C++标准库的设计理念。

今天在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的功能吗?
注意:

  1. ifstream的open()函数默认打开都是不创建文件
  2. oftream的open()函数默认打开却是创建文件,即文件不存在时自动创建文件
  3. 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 还可以使用文件流的方式操作文件,使用文件流的方式操作文件需要包含头文件<fstream>,代码如下: #include <fstream> 头文件<fstream>中定义了三个类:类 fstream、类 ifstream 和类 ofstream。 类 ifstream 实现文件的输入 类 ofstream 实现文件的输出 类 fstream 实现文件的输入输出 使用文件流操作文件依然可以分为三个步骤:打开文件、读写文件、关闭文件。 打开文件 打开文件用于读时可以使用类 fstream 或者 ifstream 函数。 ifstream 函数 ifstream inFile(“test.txt”, ios::in); inFile 是声明的 ifstream 的一个对象(也可以叫变量,只是这个变量里面包含的东西较多,类似于结构变量),声明该对象时会自动执行一个特殊的函数(构造函数,学习面向对象部分的时候会了解)。 test.txt和 ios::in 是传递给该函数的参数。test.txt是要打开的路径和文件名,ios::in 是文件打开的方式,表示打开文件用于输入。 执行该函数将会以读的方式打开当前目录下的文件test.txt。之后通过 inFile 调用一些函数就可以操作文件test.txt了。 fstream 函数 由于类 fstream 也可以打开文件用于输入,上面的语句也可以这样写: fstream inFile(“test.txt”, ios::in); 类 fstream 的文件打开方式有: 打开方式 描述 ios::in 打开一个供读取的文件 ios::out 打开一个供写入的文件 ios::app 写入的所有数据将被追加到文件的末尾,此方式需要使用 ios::out ios::ate 写入的数据将追加到文件的末尾,但也可写到其他地方,此方式不需要用 ios::out ios::trunc 废弃当前文件内容 ios::nocreate 如果要打开的文件并不存在,那么以此参数调用 open 函数将无法进行 ios::noreplace 如果要打开的文件已存在,试图用 open 函数打开时将返回一个错误 ios::binary 以二进制的形式打开一个文件 其中适合于文件读的打开方式也可以用于类 ifstream ,适合于文件写的打开方式也可以用于 ofstream,ios::binary 两者都可以用。 读写文件 文件的读取 如果以文本的方式操作文件(没有属性 ios::binary ),则读文件的语法和用 cin 从键盘输入的语法很像。例如下面的语句可以从文件test.txt中读取一个整数和一个浮点数。 int n; float f; inFile >> n >> f; 文件的写入 文件的写入也和输出到屏幕的语法很像。 例如下面的程序将整数100和浮点数3.14写入文件a.txt。 // 声明对象ofile,以读的方式打开文件a.txt ofstream ofile(“a.txt”, ios::out); // 将100、空格、3.14、换行符写入文件a.txt ofile << 100 << " " << 3.14 << endl; // 关闭文件 ofile.close(); 文件关闭 文件的关闭不管是 ifstream、ofstream 还是 fstream 的对象,都可以使用相同的语法关闭文件,即xx.close();。 编程要求 在右侧编辑器中的Begin-End之间补充代码,以实现使用文件流操作文本文件的功能,即统计本月服装的销售情况。具体要求如下: 主函数已经编写完整,只需补充void count(ifstream & fin, ofstream & fout);函数即可。 参数 fin 打开的输入文件,包含每种服装的销售情况,每种服装信息占一行,分别为服装编号,销售件数,每件的销售价格(整型),数据之间用空格隔开。 例如:a001 4 120 125 150 110,表示编号为 a001 的服装销售了4件,每件的销售价格分别为120、125、150、110。 参数 fout 是统计信息的输出文件。函数对文件 fin 中的销售信息进行统计后,将服装编号和销售总额写入文件 fout 中,每种服装统计信息占一行,分别为服装编号,销售总额(整型),中间用一个空格隔开。 如上述服装的统计信息为:a001 505 提示:文件 fin 中包含多少种服装信息不确定。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 特别提示:测试输入是键盘输入,程序将该输入写入文件,你编程操作的是写好的文件。测试输入中第一行的整数帮助程序读入键盘输入,用户操作的输入文件不包含该整数,只包含后面各行内容。 测试输入: 3 a0001 2 120 125 a0004 3 128 230 119 b0003 3 240 256 230 预期输出: a0001 245 a0004 477 b0003 726 测试输入: 4 a1 1 259 a2 2 123 456 b1 3 110 120 115 b9 5 56 67 56 45 78 预期输出: a1 259 a2 579 b1 345 b9 302#include <iostream> #include <fstream> using namespace std; /* 函数count:统计文件fin中每种服装的销售总额,并写入文件fout中 参数fin:文件每种服装的销售情况,fout:每种服装销售总额的写入文件 返回值:无 说明:文件fin中,每种服装信息占一行,分别为服装编号,销售件数,每件的销售价格(整型)。 文件fout:每种服装统计信息占一行,分别为服装编号,销售总额(整型),中间用一个空格隔开。 / void count(ifstream & fin, ofstream & fout) { // 请在此添加代码,补全函数count /********* Begin *********/ /********** End **********/ }
最新发布
05-20
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值