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. delphi xe4 ini文件不能读取的解决方法

    今天发现用inifiles下 tinifile.readstring方法突然不能读数据了,结果把ini文件格式由utf-8改成unicode后就能正常读取了.

  2. VisualStudio控制台输出窗口一闪而过

    我用到开发环境是visual studio 2010,写的简单的控制台程序,结果一按control+F5输出窗口出现后立刻就消失了(平时很少这样的呀),按照以往经验,加上了在程序结尾getchar() ...

  3. 几年前做家教写的C教程(之五专讲结构体与文件操作)

    C语言学习宝典(5) 结构体: 将不同类型的数据组合成为一个有机的整体,这个整体就是一个结构体. 例如: Struct student { Int name; Char sex; Float scor ...

  4. Redis相关

    Redis 持久化 1 why 数据需要持久化,当内存数据库使用的情况 防止缓存失效时候的雪崩效应 2 how 两种方式,快照和日志(aof)方式,各有优缺点. Redis的缓存失效策略 1 what ...

  5. CozyRSS开发记录1-原型图与Grid

    CozyRSS开发记录1-原型图与Grid 1.使用MockPlus画出最简陋的原型图 这个界面参考了目前我最常使用的RSS阅读-傲游浏览器的内置RSS阅读器.主体框架划分为上.左下.右下三块,分别是 ...

  6. JS截字符串处理数字,汉字,英文问题

    <script> function suolve( str,sub_length ){ var temp1 = str.replace(/[^\x00-\xff]/g,"**&q ...

  7. [原创]Mac系统下制作OS 10.11安装镜像

    一.所需软件 1.从App Store下载OS X El Capitan 10.11.2 ------------------------------------------------------- ...

  8. HYSBZ 2002 分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意:中文题面 思路:考虑分块,每个位置维护一个跳出该块需要的步数cnt[],和跳出 ...

  9. [spring源码学习]五-BeanPostProcessor的使用

    一.接口描述 spring提供了一个接口类-BeanPostProcessor,我们叫他:bean的加工器,应该是在bean的实例化过程中对bean做一些包装处理,里边提供两个方法 public in ...

  10. 【Unity3d游戏开发】Unity3D中常用的物理学公式

    马三最近在一直负责Unity中的物理引擎这一块,众所周知,Unity内置了NVIDIA公司PhysX物理引擎.然而,马三一直觉得只会使用引擎而不去了解原理的程序猿不是一位老司机.所以对一些常用的物理学 ...