c 學習筆記之安全陣列

2021-06-01 17:24:06 字數 1879 閱讀 4408

當需要想資料庫中插入一些較大的二進位制資料檔案時,通常會選擇用安全陣列來充當儲存資料的媒介。

safearray的主要目的是用於automation中的陣列型引數的傳遞。因為在網路環境中,陣列是不能直接傳遞的,而必須將其包裝成safearray。實質上safearray就是將通常的陣列增加乙個描述符,說明其維數、長度、邊界、元 素型別等資訊。safearray也並不單獨使用,而是將其再包裝到variant型別的變數中,然後才作為引數傳送出去。在variant的vt成員的 值如果包含vt_array|...,那麼它所封裝的就是乙個safearray,它的parray成員即是指向safearray的指標。 safearray中元素的型別可以是variant能封裝的任何型別,包括variant型別本身。 

使用safearray的具體步驟:

方法一:

包裝乙個safearray:

(1). 定義變數,如:

variant varchunk;

safearray *psa;

safearraybound rgsabound[1];

(2). 建立safearray描述符:

uisread=f.read(bval,chunksize);//read array from a file.

if(uisread==0)break;

rgsabound[0].celements =uisread;

rgsabound[0].llbound = 0;

psa = safearraycreate(vt_ui1,1,rgsabound);

(3). 放置資料元素到safearray:

for(long index=0;index乙個乙個地放,挺麻煩的。

(4). 封裝到variant內:

varchunk.vt = vt_array|vt_ui1;

varchunk.parray = psa;

這樣就可以將varchunk作為引數傳送出去了。

讀取safearray中的資料的步驟:

(1). 用safearraygetelement乙個乙個地讀

byte buf[lisread];

for(long index=0;index就讀到緩衝區buf裡了。

方法二:

使用safearrayaccessdata直接讀寫safearray的緩衝區:

(1). 讀緩衝區:

byte *buf;

safearrayaccessdata(varchunk.parray, (void **)&buf);

f.write(buf,lisread);

safearrayunaccessdata(varchunk.parray);

(2). 寫緩衝區:

byte *buf;

::safearrayaccessdata(psa, (void **)&buf);

for(long index=0;index::safearrayunaccessdata(psa);

varchunk.vt = vt_array|vt_ui1;

varchunk.parray = psa;

這種方法讀寫safearray都可以,它直接操縱safearray的資料緩衝區,比用safearraygetelement和 safearrayputelement速度快。特別適合於讀取資料。但用完之後不要忘了呼叫::safearrayunaccessdata (psa),否則會出錯的。

如果safearray中存的是bstr的二維陣列,則**如下:

if(varchunk.vt = vt_array | vt_bstr)

safearrayunaccessdata(varchunk.parray);

}

C 學習筆記之陣列

陣列中存放的資料型別相同,陣列大小固定。初始化陣列時,陣列的維度必須是乙個常量表示式。內建型別在函式外初始化時如果沒有給定值,系統會自動為其賦值,如果實在函式內初始化沒有賦值會出現錯誤,陣列也是一樣的,如果在函式內部定義了某種內建型別的陣列,預設初始化會令陣列含有未定義的值。陣列不能用來初始化另乙個...

學習筆記之C 陣列

具有相同型別的一批資料所構成的整體成為陣列。乙個變數用來表示乙個資料,乙個陣列用來表示一批資料。陣列的名字簡稱為陣列名,陣列中的資料被稱為陣列元素 或陣列分量 用陣列名和下標來標識 區分陣列元素需要乙個順序號稱為一維陣列,區分陣列元素需要兩個順序號稱為二維陣列.一 一維陣列 1.一維陣列的定義 型別...

C 學習筆記之 陣列

定義舉例 int b int c new int 3,3 int d new int 若定義和賦值分開,可以這樣做 int v v new int 2,3 和一維陣列不同,二維陣列的console.write b.length 輸出的值是4,而且不能用這種遍歷 將二維陣列的行和列轉換,並賦值給另乙個...