程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> CBUILDER中相關流對象的討論

CBUILDER中相關流對象的討論

編輯:關於C++

第一章 概述

在CBUILDER中,存在以下幾種流對象:

TFileStream

TMemoryStream

TStringStream

TWinSocketStream

TBlobStream

TOleStream

TClientBlobStream

TResourceStream

下面是以上各類的繼承關系

TObject

|

TStream

|

+---------------------------+---------------------------+--------------------+-------------------+------------+

|         |         |       |      |    |

THandleStream TCustomMemoryStream TWinsocketStream TBlobStream TOleStream TStringStream

|         |

TFileStream TMemoryStream

|

+-------------------------------------------+

|              |

TClientBlobStream     TResourceStream

第二章 流對象的屬性及方法簡介

關於各屬性和方法的詳細語法請見CBUILDER的幫助

一. TStream介紹

屬性

Position:當前位置指針

Size:流的大小,單位為字節

方法

CopyFrom:從一個流往另一個流拷貝數據

Read:從流中讀取一定字節的數據到緩沖區,返回讀取的字節數

ReadBuffer:從流中讀取一定字節的數據到緩沖區,如不正確則異常

ReadComponent:從流中取出一個組件

ReadComponentRes:以Windows的資源文件格式從流中讀取一組件

Seek:定位流的當前位置指針

SetSize:設置流的大小。

Write:從緩沖區中將一定字節的數據寫入到流中,返回寫入的字節數

WriteBuffer:從緩沖區中將一定字節的數據寫入到流中,失敗則異常

WriteComponent:將一組件寫入到流中

WriteComponentRes:將一組件以Windows資源文件的格式寫入到流中

注意:不能直接建立一個TStream類型的流對象

二. THandleStream介紹

屬性

Handle:流對象要讀寫的通迅資源的句柄

Size:句柄所標識的資源的大小,單位為字節

方法

Read:從流中讀數據到緩沖區中

Seek:設置流的當前位置

SetSize:設置流的大小,不成功則返回一個異常

THandleStream:通過一個打開的句柄建立一個句柄流對象

Write:將數據從緩沖區中寫入到流

可以使用THandleStream流對象來存取如文件、套接字、命名管道、郵槽等打開了句柄的通迅資源。下面是一個使用句柄流對象進行文件操作的片段代碼:

//////////////////////////////////////////////////////////////////////////////////////////////
////將c:\config.sys文件中的內容讀入到一個文本框中
int fileHandle;
THandleStream *fileStream;
fileHandle = FileOpen(“c:\\config.sys”,fmOpenRead);
if(fileHandle == -1) return ; //打開文件出錯
fileStream = new THandleStream(fileHandle);
char buffer[10001];
unsigned long bufferSize;
do
{
   bufferSize = fileStream->Read(buffer, 10000);
   if (bufferSize > 0 )
   {
     buffer[bufferSize] = 0;
     Memo1->Text += buffer;
   }
}while( bufferSize == 10000 );
delete fileStream;
FileClose(fileHandle); //請注意一定要先注銷流對象才能關閉句柄

三. TCustomMemoryStream介紹

屬性

Memory:指向內存流對象的實際內存的指針,可用該指針直接訪問內存流的內存

方法

Read:從流中讀數據到緩沖區中

SaveToFile:將內存流中的數據保存到文件中

SaveToStream:將內存流中的數據保存到其它流對象中

Seek:設置流對象的當前位置

SetPointer:設置與內存流對象相關聯的內存池

注意:該類為純虛類,不能直接建立其對象。應使用TMemoryStream或是TResourceStream。

四. TWinSocketStream介紹

屬性

TimeOut:設置在讀或寫Socket時的超時值,單位:毫秒

方法

Read:從Socket中讀取指定字節的數據到緩沖區中,返回實際讀取的字節數

Seek:沒有意義

TWinSocketStream:根據指定的Socket句柄和超時時間建立一個Socket流對象

WaitForData:確認是否可以通過Socket連接來發送或接收數據了。

Write:通過Socket連接發送緩沖區中指定字節的數據

TWinSocketStream流對象用來在阻塞方式的Socket連接中發送和接收數據,從而避免一般情況下的掛起現象。下面是一個用TWinSocketStream進行收發數據的代碼片段:

/////////////////////////////////////////////////////////////////////////////////////////////////////
//在一單獨的線程中通過阻塞式Socket連接發送數據
void __fastcall TMyClientThread::Execute()
{
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket1->Socket, 60000);
try
    {
   while (!Terminated && ClientSocket1->Active)
       {
        try
        {
           char buffer[10];
           GetNextRequest(buffer); // GetNextRequest must be a thread-safe method
// write the request to the server
     pStream->Write(buffer, strlen(buffer) + 1);
           // continue the communication (eg read a response from the server)
     ...
}
catch (Exception &E)
{
     if (!E.ClassNameIs("EAbort"))
     //you must write HandleThreadException
           Synchronize(HandleThreadException());
        }
}
}
__finally
    {
       delete pStream;
    }
}

五. TBlobStream介紹

方法

Read:讀取數據到緩沖區中

Seek:定位流的當前位置

TBlobStream:根據一個TBlobField字段建立一個流對象

Truncate:從當前位置截短流對象

Write:將緩沖區中的數據寫入到流對象中

TBlobStream流對象只用於對TblobField進行操作,注意,當改變了數據集對象的當前記錄時,要重新建立TBlobStream對象並在使用完後將之刪除。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//讀取Blob字段的數據
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MemSize;
char *Buffer;
TBlobStream *Stream;
if (!Query1->Eof)
Query1->Next();
Stream = new TBlobStream((TBlobField *)Query1->FieldByName("Notes"), bmRead);
    try
    {
       MemSize = Stream->Size + 1; // add one for null terminator
       Buffer = new char[MemSize]; // Allocate the memory.
       try
       {
        Stream->Read(Buffer, MemSize); //Read Notes field into buffer.
        Memo1->SetTextBuf(Buffer); // Display the buffer's contents.
       }
       catch (...)
       {
         delete Buffer;
        throw;
       }
delete Buffer;
}
    catch (...)
    {
       delete Stream;
       throw;
    }
    delete Stream;
}

六. TOleStream介紹

方法

TOLEStream:通過一個流界面建立Ole流對象

Read:從流對象中讀數據到緩沖區中

Seek:定位流的當前位置

Write:從緩沖區中將數據寫入到流對象中

七. TStringStream介紹

屬性

DataString:流對象的實際存儲字符串

Size:流對象大小

方法

Read:從流對象中讀數據到緩沖區中

ReadString:以字符串形式返回流中指定數據

Seek:定位流的當前位置

TStringStream:根據一個字符串建立字符串流對象

Write:從緩沖區中將數據寫入到流對象中

WriteString:將字符串中數據寫入到流中

八. TFileStream介紹

方法

TFileStream:根據文件名建立或打開一個文件,並建立相應的文件流對象

例:TFileStream *fsBootINI = new TFileStream(“c:\\boot.ini”,fmOpenRead);

九. TMemoryStream介紹

方法

Clear:清除流對象中所有數據

LoadFromFile:從文件中讀入數據到流對象中

LoadFromStream:從其它流中讀入數據

SetSize:設置流對象的大小

Write:從緩沖區中寫數據到內存流中

十. TClientBlobStream介紹

方法

TClientBlobStream:根據TblobField對象建立一個流對象

Truncate:截短流

Write:將緩沖區中數據寫入到流中

該流對象用來操作TClientDataSet數據集中的BLOB類型的字段

十一. TResourceStream介紹

方法

TResourceStream:根據EXE文件名柄或DLL文件句柄和資源描述生成流對象

Write:不支持寫操作,產生異常

十二. 與流對象相關的對象介紹

TFilter

+--------------------------+

|         |

TReader    TWriter

以上對象用於將組件寫入到流對象中或是從流對象生成組件

流對象中的方法ReadComponent 和WriteComponent在實現時就是使用TReader和TWriter來實際操作的。

十三. 與流對象相關的函數

extern PACKAGE void __fastcall ObjectTextToBinary(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectBinaryToText(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectTextToResource(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectResourceToText(TStream* Input, TStream* Output);

以上函數都是針對存儲對象的流而言的,在流之間轉換流中所存儲對象的描述方式。

第三章 流對象的應用領域

一. 使用統一的流的概念來操作各種不同類型的資源。

二. 通過流將資源保存到不同的介質上,如將組件保存到文件中,將ICON資源調入內存等。

三. 簡化一些對象的操作,如TBlobStream和TClientBlobStream

四. 實現一些原來不好實現的功能,如TWinSocketStream實現超時操作

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved