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  为了实现信息的内外流动.

  1. 如果数据要显示到屏幕上或打印输出,则要用我们可以看懂的字符序列形式.
  2. 如果数据要经过通信通道传递到不同系统环境的其它介质,则要用便携数据交换格式表示.它不可读,但接收方却是可以理解的.
  3. 如果数据要存储在在储存设备上,节省空间很重要,那么可以用压缩数据表示,这种也是不可读的.

看了上面的说明,那我们知道了:数据在每个存储介质上,它的表示方式可能是不一样的.那么就出现了问题了,数据在传递的过程中要转换成接收方能理解的数据格式才行.这就是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种方式:

  1. fstream fs;

fs.open(“D:\\1.text”, ios::in | ios::out);

  1. 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.

检查文件是否成功打开的常见方式:

  1. if (!fs.bad())
  2. if (fs.good())
  3. 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的更多相关文章

  1. SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)

    前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...

  2. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  3. node中的Stream-Readable和Writeable解读

    在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...

  4. nodejs中流(stream)的理解

    nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...

  5. Node学习笔记(一):stream流操作

    NodeJs中谈及较多的可能就是Stream模块了,先写一个简单的ajax回调 $.post("index.php",{data:'aaa',order:'ccc'},functi ...

  6. Stream

    Stream的好处 1.Stream AP的引入弥补了JAVA函数式编程的缺陷.2.Stream相比集合类占用内存更小:集合类里的元素是存储在内存里的,Stream里的元素是在访问的时候才被计算出来. ...

  7. Stream流

    在Node中,存在各式各样不同的数据流,Stream(流)是一个由不同对象实现的抽象接口.例如请求HTTP服务器的request是一个 流,类似于stdout(标准输出):包括文件系统.HTTP 请求 ...

  8. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  9. [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 ...

  10. [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 ...

随机推荐

  1. C++中使用初始化列表的情况

    http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...

  2. migration integer limit option

    https://gist.github.com/stream7/1069589 :limit Numeric Type Column Size Max value 1 tinyint 1 byte 1 ...

  3. bzoj3674 可持久化并查集

    我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...

  4. 构建高可用ZooKeeper集群(转载)

    ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...

  5. spring quartz分布式任务计划

    spring quartz分布式任务计划 环境: 通过maven管理的spring mvc工程,且已经成功连接数据库. 数据库表结构 /*Table structure for table `qrtz ...

  6. php5.2.3连接sqlserver2008

    1,下载驱动 下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=20098 我下载的是:SQLSRV20.EXE ,因为我的p ...

  7. Python网络编程之线程,进程

    一. 线程: 基本使用 线程锁 线程池 队列(生产者消费者模型) 二. 进程:  基本使用  进程锁 进程池 进程数据共享 三. 协程: gevent greenlet 四. 缓存: memcache ...

  8. Android笔记:HTTP相关

    发送HTTP请求 HttpURLConnection.HttpClient XML解析 Pull 解析.SAX 解析.DOM 解析 解析JSON 格式数据 官方提供的JSONObject.谷歌的开源库 ...

  9. 在db2数据库上模拟死锁场景 还是z上的

    如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁……简单,粗暴,直接……很好…… LOCK T ...

  10. Day20160425

    技术要求: 1.git使用 pull.push.cheakout.master.clone(本地提交有优势) 2.Maven(依赖init.install.compile.package.clean. ...