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. Eclipse 代码显示不全的问题

    Eclipse中的"Show Source of Selected Element Only"功能引起的, 定位到: Window->Customize Perspectiv ...

  2. Android 全局获取 Context 与使用 Intent 传递对象

    =====================全局获取 Context======================== Android 开发中很多地方需要用到 Context,比如弹出 Toast.启动活 ...

  3. BZOJ 4723: [POI2017]Flappy Bird

    Description 从一个点到一条直线,每次纵坐标只能增加或减少1,有些位置有障碍,求最少增加步数. Sol 贪心. 或许是贪心吧...反正在可到达的范围内,纵坐标尽量小... 做的时候维护一下两 ...

  4. Python基础四

    1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集   2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元组,比如身 ...

  5. java26

    1:网络编程(理解)    (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享    (2)网络编程模型    (3)网络编程的三要素        A:IP地址           ...

  6. python第14天

    Python之前端web: HTML CSS 一. 什么是HTML: html为超文本语言,使用标签来描述网页. html标签格式: HTML 标签是由尖括号包围的关键词,比如 <html> ...

  7. Python:如何删除文件中的空白行?

    def delblankline(infile,outfile): infopen = open(infile,'r') outfopen = open(outfile,'w') lines = in ...

  8. Bravebeart

    E - Bravebeart Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Sub ...

  9. 踩个猴尾不容易啊 Canvas画个猴子

    踩个猴尾不容易啊  Canvas画个猴子 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  10. hive创建索引

    索引是hive0.7之后才有的功能,创建索引需要评估其合理性,因为创建索引也是要磁盘空间,维护起来也是需要代价的 创建索引 hive> create index [index_studentid ...