C++ I/O stream
C++ I/O stream
Ø The first, you should understand following:
...
Ø Text:
Ø Version:
Visual studio 2015
Ø What is the C++ I/O stream?
"流"就是"流动",是物质从一处向另一处流动的过程。C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为"流"。
Ø What is its function?
为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能。根据一个流类定义的对象也时常被称为流。如根据文件流类fstream定义的一个对象fio,可称作为fio流或fio文件流,用它可以同磁盘上一个文件相联系,实现对该文件的输入和输出,fio就等同于与之相联系的文件。它具体的功能为:
l 与用户交互,如从键盘获得数据,并把数据显示到显示器上.
l 控制格式,如显示右对齐,从键盘获得整型值.
l 格式化内存.
Ø Why does exist stream?
l 为了实现信息的内外流动.
- 如果数据要显示到屏幕上或打印输出,则要用我们可以看懂的字符序列形式.
- 如果数据要经过通信通道传递到不同系统环境的其它介质,则要用便携数据交换格式表示.它不可读,但接收方却是可以理解的.
- 如果数据要存储在在储存设备上,节省空间很重要,那么可以用压缩数据表示,这种也是不可读的.
看了上面的说明,那我们知道了:数据在每个存储介质上,它的表示方式可能是不一样的.那么就出现了问题了,数据在传递的过程中要转换成接收方能理解的数据格式才行.这就是stream的意义了.
不同的介质有各自的数据格式,我们可以看下面的例子:
// 1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}
//To add the code.
char szChar[] = "1234.5678";
double dNumber = 1234.5678;
//可以看到我们在内存中定义了2个变量,它们在内存中的格式是怎么样的呢?
int* i = NULL;
i = (int*)szChar;
cout << i << endl;
//可以得到szChar[]的地址为0018FF18,这10个字节的内容为:0018FF18 31 32 33 34 2E 35 36 37 38 00可以看出来在内存中字符的格式了.
i = (int*)&dNumber;
cout << i << endl;
//可以得到dNumber的地址为0018FF10,这8个字节的内容为:0018FF10 AD FA 5C 6D 45 4A 93 40可以看出来在内存中double的格式了.
//那我们输出它又是什么格式呢?当然是我们看的懂的了.
cout << szChar << endl;
cout << cout.precision(8)
<< dNumber << endl;
/*
Hello from MFC!
0018FF18
0018FF10
1234.5678
1234.5678
Press any key to continue
*/
return nRetCode;
}
Ø We can assort the I/O stream: typical I/O stream and standard I/O stream.
l typical I/O stream: 外部数据与内部数据间的转换与传递.
l standard I/O stream: 主要是为文本流的输入输出而设计.
Ø typical I/O stream
Ø standard I/O stream
C++支持2种文件格式:
l 文本
l 二进制
C++的文件操作主要分3个阶段:
打开文件 / 操作文件 / 关闭文件
Ø 打开文件:
为了支持文件的I/O操作, C++流类库提供了3个文件流类:
|
name |
description |
function |
be included |
|
ifstream |
输入文件流类 |
用于文件的输入 |
fstream |
|
ofstream |
输出文件流类 |
用于文件的输出 |
|
|
fstream |
输入/输出文件流类 |
用于文件的输入/输出 |
C++文件的打开模式如下:
|
name |
description |
|
app(append) |
to seek to the end of a stream before each insertion. |
|
ate(at end) |
to seek to the end of a stream when its controlling object is first created. (out)不管文件是否存在,都相当于新建文件了.(in)文件尾追加. |
|
binary |
to read a file as a binary stream, rather than as a text stream. |
|
in |
to permit extraction from a stream. |
|
out |
to permit insertion to a stream. |
|
trunc |
to delete contents of an existing file when its controlling object is created. 不管文件是否存在,都相当于新建文件了. |
在使用这些模式时,首先必须确定是ios::in or ios::out or ios::in | ios::out.其它模式只能和它们组合使用,而不能单独使用.
fstream fs("D:\\4.txt",ios::in | ios::app);
不管怎么样,都会失败,可能是不能有这个组合.理解是:从文件中读内容,app模式不是添加文件模式么?
fstream fs("D:\\4.txt",ios::out | ios::app);
文件不存在时会append文件.文件存在时,文件尾追加.
fstream fs("D:\\4.txt",ios::in | ios::ate);
文件不存在时会会fail.文件存在时,文件尾追加.理解是:从文件中读内容,文件不存在读什么,就算创建个新文件,读什么?
fstream fs("D:\\5.txt",ios::out | ios::ate);
文件不存在时会append文件.文件存在时会截断文件.理解是:从内存中输出内容,不管文件是否存在,都相当于新建文件了.
fstream fs("D:\\5.txt",ios::in | ios::trunc);
不管文件是否存在:我要读文件,你截断是什么意思?
fstream fs("D:\\6.txt",ios::out | ios::trunc);
文件不存在时会append文件.文件存在时会截断文件.理解是:从内存中输出内容,不管文件是否存在,都相当于新建文件了.
有点乱,总结一下:
|
creation |
appending at end |
trunction |
|
|
ios::in | ios::app |
false |
--- |
--- |
|
ios:out | ios::app |
true |
true |
--- |
|
ios::in | ios::ate |
false |
true |
--- |
|
ios:out | ios::ate |
ture |
--- |
true |
|
ios::in | ios::trunc |
false |
--- |
--- |
|
ios:out | ios::trunc |
true |
--- |
true |
好像还有一些多线程之间的区别,以后再说了.
为了支持打开文件, C++流类库为3个类分别定义了open(),其语法如下:
void fstream::open( const char* szName, int nMode, int nProt = filebuf::openprot );
void ifstream::open( const char* szName, int nMode = ios::in, int nProt = filebuf::openprot );
void ofstream::open( const char* szName, int nMode = ios::out, int nProt = filebuf::openprot );
打开文件有2种方式:
- fstream fs;
fs.open(“D:\\1.text”, ios::in | ios::out);
- fstream fs(“D:\\1.text”, ios::in | ios::out);
Ø 操作文件
Ø 流状态检查与is_open():
cin与cout对象包含一个描述流状态的数据成员,该数据成员是从类ios_base那里继承.流状态被定义为iostate类型,它由eofbit/
badbit/failbit 3个ios_base元素组成,其中每个元素占1位,可以是1 or 0,与它相关的成员函数如下:
|
member |
description |
|
badbit |
Records a loss of integrity of the stream buffer. |
|
eofbit |
Records end-of-file while extracting from a stream. |
|
failbit |
Records a failure to extract a valid field from a stream. |
|
goodbit |
All state bits clear. |
|
member function |
description |
|
bad() |
Indicates a loss of integrity of the stream buffer. |
|
eof() |
Indicates if the end of a stream has been reached. |
|
fail() |
Indicates failure to extract a valid field from a stream. |
|
good() |
Indicates the stream is in good condition. |
|
rdstate() |
Reads the state of bits for flags. |
|
clear |
Clears all error flags. (iostate s=goodbit) |
|
setstate(iostate s) |
Sets additional flags. |
检查文件是否成功打开的常见方式:
- if (!fs.bad())
- if (fs.good())
- if (fs)
但是无法检测到这样1种情况:试图以不合适的文件模式打开文件时失败.方法is_open()能检测到这种错误.
bool is_open( ) const;
Ø 读取文件
Ø 关闭文件
fstream fs(“D:\\1.text”, ios::in | ios::out);
fs.close();
Ø Attributes:
Ø Name
Ø Version:
Ø Introduce:
Ø Syntax:
Ø Members:
Ø Remarks:
Ø Requirements:
Ø Methods:
Ø Name
Ø Version:
Ø Introduce:
Ø Syntax:
Ø Parameters:
Ø Return value:
Ø Remarks:
Ø Requirements:
Ø English corner:
...
C++ I/O stream的更多相关文章
- SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)
前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
- node中的Stream-Readable和Writeable解读
在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...
- nodejs中流(stream)的理解
nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...
- Node学习笔记(一):stream流操作
NodeJs中谈及较多的可能就是Stream模块了,先写一个简单的ajax回调 $.post("index.php",{data:'aaa',order:'ccc'},functi ...
- Stream
Stream的好处 1.Stream AP的引入弥补了JAVA函数式编程的缺陷.2.Stream相比集合类占用内存更小:集合类里的元素是存储在内存里的,Stream里的元素是在访问的时候才被计算出来. ...
- Stream流
在Node中,存在各式各样不同的数据流,Stream(流)是一个由不同对象实现的抽象接口.例如请求HTTP服务器的request是一个 流,类似于stdout(标准输出):包括文件系统.HTTP 请求 ...
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
- [LeetCode] Moving Average from Data Stream 从数据流中移动平均值
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- [LeetCode] Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
随机推荐
- ASP.NET Web API学习 (一)
开发环境:win10,使用VS2015社区版和SQLSERVER2012开发 1.打开VS2015应用程序,点击左上角按钮:文件--新建--项目,弹出窗口中选择ASP.NET Web应用程序, 2.点 ...
- Python 开发轻量级爬虫08
Python 开发轻量级爬虫 (imooc总结08--爬虫实例--分析目标) 怎么开发一个爬虫?开发一个爬虫包含哪些步骤呢? 1.确定要抓取得目标,即抓取哪些网站的哪些网页的哪部分数据. 本实例确定抓 ...
- vux 中popup 组件 Mask 遮罩在最上层问题的解决
1. 问题描述:popup弹出层在遮罩层下面的 2.原因:因为滚动元素和mask遮罩层在同一级,vux框架默认把遮罩层放在body标签下的 3.解决方法:更改一下源码,把mask遮罩层放在popup同 ...
- NEFU 561 方块计算
题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespac ...
- [jquery]模仿radio单项选择
今天写了个小功能,模仿radio单选, //单选收货地址 $(".wuliu-table-to").find(".called").click(function ...
- 【XLL 框架库函数】 TempActiveRef/TempActiveRef12
[XLL 框架库函数] TempActiveRef/TempActiveRef12 创建一个包含所有激活工作表引用区域 XLOPER/XLOPER12 LPXLOPER TempActiveRef(B ...
- Tensorflow二分类处理dense或者sparse(文本分类)的输入数据
这里做了一些小的修改,感谢谷歌rd的帮助,使得能够统一处理dense的数据,或者类似文本分类这样sparse的输入数据.后续会做进一步学习优化,比如如何多线程处理. 具体如何处理sparse 主要是使 ...
- 网络知识学习4---(DNS的作用)
1.DNS 简介 DNS是域名解析协议 在互联网中通过IP 地址来进行通信.但是IP 地址的表示形式是数字,很难进行记忆(比如116.213.120.232),所以为每个 IP取一个人类更易记忆的域名 ...
- 解决VS2015启动界面卡在白屏的处理方法
最后,通过还原初始配置的方法:使用命令devenv /ResetSettings
- [转载]使用PyQt来编写第一个Python GUI程序
转载自:http://python.jobbole.com/81276/ 英文版出处:http://pythonforengineers.com/your-first-gui-app-with-pyt ...