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. window下安装zookeeper

    本地zookeeper安装(win7)下载zookeeper-3.3.6.zip文件解压zookeeper-3.3.6.zip文件到d:盘在D:\zookeeper-3.3.6\conf下增添 zoo ...

  2. php引用

    1.需求 了解php引用 2.变量的引用 目前为止看到的引用是变量的引用, 例子1 $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $ ...

  3. Angular2 组件

    1. 组件说明 Angular2 组件是构成Angular2应用程序的核心部分,Angualr2应用程序本质上来说就是一个组件树,Angular2组件一般由模块,注解,元数据以及组件类组成,实现组件类 ...

  4. js指定分隔符连接数组元素join()

    指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. 语法: arrayObject.join(分隔符) 参数说明: 注意:返回 ...

  5. PHP面向对象讲解

    面向对象   类<------>对象 面向对象例题 理解:  减少 变量的重新定义    比如  变量前的  var   $    思路更加明确 class Yuan ----后面不加() ...

  6. Ruby多行字符串,begin/end语句、注释

    #!/usr/bin/ruby #puts "Hello ,Ruby!"; print <<EOF #多行字符串 以<<开头 紧接着为结束字符串标识声明 并 ...

  7. Laravel Homestead安装笔记

    引言: 最近开始学习laravel框架,了解到有个laravel homestead的box,开发起来非常方便快捷,于是就准备开始配置homestead虚拟开发环境了 什么是Homestead 要想学 ...

  8. php多进程

    增加 pcntl扩展pcntl扩展可以支持php的多线程操作(仅限linux系统)加载 pcntl 有两种方式一种重新编译安装,在编译时加,configrue提示加上--enable-pcntl./c ...

  9. 使用脚本自动配置matlab安装libsvm和随机森林工具箱

    前言 支持向量机(SVM)和随机森林 都是用于分类的机器学习算法. 这里我需要对网上的工具箱在matlab中进行配置. 效果演示: 1.双击运行“自动配置.bat” 2.matlab会自动启动,手动配 ...

  10. angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...