app c++ ios out
2019-03-03 20:56:20 weixin_42333471 阅读数 510

1 学习资料

资料1:C++ 文件和流
资料2:ofstream之ios::ate,ios::app,ios::in,ios::out

2 学习思路

2.1 所需实现功能

实现网页1所说的写入姓名与年龄功能,但是稍作修改,分两次打开文件,第一次写入姓名,第二次写入年龄。

2.2 第一次尝试 默认

#include<fstream>
#include<iostream>
using namespace std;
int main()
{
	char data[100];
	
	//第一次打开文件
	ofstream outfile;
	outfile.open("D:\\afile.dat");
	cout << "Writing to the file" << endl;
	cout << "Enter your name:";
	cin.getline(data, 100);
	outfile << data << endl;
	outfile.close();
	
	//第二次打开文件
	ofstream outfile2;
	outfile2.open("D:\\afile.dat");//**待修改语句**
	cout << "Enter your age:";
	cin >> data;
	outfile2 << data << endl;
	outfile2.close();//第二次关闭文件
	
	return 0;
}

输入:
Wu Mingtang
25
输出文件内容为:
默认打开
第一次打开文件写入的姓名内容没有了,说明默认方式打开会覆盖原始文件。

2.3 第二次尝试 ios::app

根据资料1所说,使用ios::app模式进行第二次打开,即将待修改语句改为:

	outfile2.open("D:\\afile.dat", ios::app);

运行结果为:
打开模式为ios::app
结果满足预期,说明ofstream对象使用ios::app模式打开文件可以在文件末尾添加新内容。

2.4 第三次尝试 ios::ate

根据资料1所说,ios::ate可以定位到文件末尾,是否可以直接使用该模式打开文件,直接在文件末尾添加新内容?
代码修改为:

	outfile2.open("D:\\afile.dat", ios::ate);

输出文件为:
ios::ate模式打开结果
说明,以上思路行不通,ios::ate并不能直接在文件尾进行写入操作。

2.5 第四次尝试 ios::ate|ios::in

根据资料2所说,可以使用ios::ate|ios::in模式打开,代码修改为:

	outfile2.open("D:\\afile.dat", ios::ate|ios::in);

输出文件内容为:
ios::ate|ios::in模式打开
可见ios::ate|ios::in模式与ios::app模式效果一致。

2.6 第五次尝试 0x05

  • 看到操作符“|”就很容易想到这是利用位“或”进行的计算,因此其本质应该是二进制数的“或”操作。
  • 转到ios::in的定义,其源代码为:
	static constexpr _Openmode in = (_Openmode)0x01;
	static constexpr _Openmode out = (_Openmode)0x02;
	static constexpr _Openmode ate = (_Openmode)0x04;
	static constexpr _Openmode app = (_Openmode)0x08;
	static constexpr _Openmode trunc = (_Openmode)0x10;

说明每一种模式是一个由二进制数转化为_Openmode类型的常量

  • _Openmode类型定义为为:
	enum _Openmode
		{	// constants for file opening options
		_Openmask = 0xff};
  • open函数接收的参数就是openmode变量:
	void open(const char *_Filename,
		ios_base::openmode _Mode = ios_base::out,
		int _Prot = (int)ios_base::_Openprot)
  • openmode类型其实就是int型
	typedef int openmode;
  • 归根结底,输出模式其实就是一个int型的变量,只是被各种包装掩盖了其真实面目,因此根据ios::ate|ios::in = 0x05,可以推知将0x05作为open()函数的参数,可以得到同样的结果。
  • 修改代码为:
	outfile2.open("D:\\afile.dat", 0x05);
  • 输出文件为:
    0x05
    可见结果与使用ios::app或者ios::ate|ios::in一致,上面的推论没有问题。

小问题

为什么枚举类型值可以和定义的不一样,基础知识有点不牢固,望各位赐教。

	enum _Openmode
		{	// constants for file opening options
		_Openmask = 0xff};
	static constexpr _Openmode in = (_Openmode)0x01;
2016-11-23 16:47:35 cabbage2008 阅读数 12888

ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么在文件尾追加。
以ios::app|ios::in打开,不管有没有文件,都是失败。
以ios::ate打开(或者”ios::ate|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么清空该文件
以ios::ate|ios::in打开,如果没有文件,那么打开失败;如果有文件,那么定位到文件尾,并可以写文件,但是不能读文件

ifstream流,以ios::app打开(“ios::app|ios::out”),不管有没有文件,打开都是失败。
以ios::ate打开(“ios::ate|ios::out”),如果没有文件,打开失败
如果有文件,打开成功,并定位到文件尾,但是不能写文件

fstream流,默认是ios::in,所以如果没有文件,ios::app和ios::ate都是失败,
以ios::app|ios::out,如果没有文件则创建文件,如果有文件,则在文件尾追加
以ios::ate|ios::out打开,如果没有文件则创建文件,如果有,则清空文件。
以ios::ate|ios::out|ios::in打开,如果没有文件,则打开失败,有文件则定位到文件尾

可见:ios::app不能用来打开输入流,即不能和ios::in相配合
而ios::ate可以和ios::in配合,此时定位到文件尾;如果没有ios::in相配合而只是同ios::out配合,那么将清空原文件
(ios::ate|ios::in–>在原文件尾追加内容;ios::ate—>清空原文件,ios::out是默认必带的,可加上也可不加,对程序无影响)
可以在《C++ 输入输出流及本地化》1.4.2中找到更详细的描述:(大意)以ios::app方式打开文件,即使修改文件指针,也只能输出到文件尾。实际上以ios::app打开的文件的写入,和文件指针五关。
(这里就指出了ate和app的关键区别,app只能在尾部追加,ate可以配合指针修改文件中的部分内容。)
奇怪的是:《C++ 输入输出流及本地化》和《C++编程思想》都说以ios::ate打开的文件,文件指针都会定位到文件尾且不清空文件,但是我发现ios::ate如果不和ios::in配合的话,将清空原文件

2015-04-10 16:39:01 awkwardgirl 阅读数 2941
转自:http://chengchuange.blog.163.com/blog/static/1798164232014827984347/

ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么在文件尾追加。

以ios::app|ios::in打开,不管有没有文件,都是失败。
以ios::ate打开(或者”ios::ate|ios::out”),如果没有文件,那么生成空文件;如果有文件,那么清空该文件
以ios::ate|ios::in打开,如果没有文件,那么打开失败;如果有文件,那么定位到文件尾,并可以写文件,但是不能读文件

ifstream流,以ios::app打开(“ios::app|ios::out”),不管有没有文件,打开都是失败。
以ios::ate打开(“ios::ate|ios::out”),如果没有文件,打开失败
如果有文件,打开成功,并定位到文件尾,但是不能写文件


fstream流,默认是ios::in,所以如果没有文件,ios::app和ios::ate都是失败,
以ios::app|ios::out,如果没有文件则创建文件,如果有文件,则在文件尾追加
以ios::ate|ios::out打开,如果没有文件则创建文件,如果有,则清空文件。
以ios::ate|ios::out|ios::in打开,如果没有文件,则打开失败,有文件则定位到文件尾

可见:ios::app不能用来打开输入流,即不能和ios::in相配合
而ios::ate可以和ios::in配合,此时定位到文件尾;如果没有ios::in相配合而只是同ios::out配合,那么将清空原文件
(ios::ate|ios::in-->在原文件尾追加内容;ios::ate--->清空原文件,ios::out是默认必带的,可加上也可不加,对程序无影响)
可以在《C++ 输入输出流及本地化》1.4.2中找到更详细的描述:(大意)以ios::app方式打开文件,即使修改文件指针,也只能输出到文件尾。实际上以ios::app打开的文件的写入,和文件指针五关。
(这里就指出了ate和app的关键区别,app只能在尾部追加,ate可以配合指针修改文件中的部分内容。)
奇怪的是:《C++ 输入输出流及本地化》和《C++编程思想》都说以ios::ate打开的文件,文件指针都会定位到文件尾且不清空文件,但是我发现ios::ate如果不和ios::in配合的话,将清空原文件


补充
ofstream的使用方法 
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;  
在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:  
1、插入器(<<)  
  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<’\n’;就表示把字符串"Write Stdout"和换行字符(’\n’)输出到标准输出流。  
2、析取器(>>)  
  从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。  
  在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。  
一、打开文件  
  在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:  
void open(const char* filename,int mode,int access);  
参数:  
filename:  要打开的文件名  
mode:    要打开文件的方式  
access:   打开文件的属性  
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:  
ios::app:   以追加的方式打开文件  
ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性  
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文  
ios::in:    文件以输入方式打开(文件数据输入到内存)  
ios::out:   文件以输出方式打开(内存数据输出到文件)  
ios::nocreate: 不建立文件,所以文件不存在时打开失败  
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败  
ios::trunc:  如果文件存在,把文件长度设为0 
 

2014-11-23 19:12:54 think_ma 阅读数 440


场景 在本地打包之后,运行xcode后发现的问题   ios process lunch filed timed out waiting for app to lunch 启动项目后一直是这个错误

网上看了一下:说是证书出现的错误,然后我将code中证书改为ios development,运行程序ok,

然后在该回到我的证书下面 运行就好了   。。。 好奇怪啊。。





没有更多推荐了,返回首页