官术网_书友最值得收藏!

1.2 二進制方式讀寫文件

計算機中的文件都是以二進制方式存儲的,文本文件可以用文本編輯軟件查看和編輯,本質上也是以字節為單位存儲在磁盤上。

因此,學習用二進制方式讀寫文件,有助于理解文件和字符串的關系。同時以字節數組這種數據類型為媒介,可以方便地對文本文件進行拆分和合并。

1.2.1 字符串與字節數組的互換

在VBA中,String和Byte類型的數組可以通過StrConv函數互相轉換,當字符串中的每個字符是英文字母或半角字符時,一個字符占據1個字節(Byte);當出現中文漢字或全角字符時,一個字符會拆分為兩部分,也就是占據2個字節。

下面的代碼把字符串“VBA學習”轉換為字節數組,并在立即窗口打印字節數組的信息,最后再把字節數組轉換為字符串。

代碼分析:“VBA學習”共5個字符,但由于后2個是漢字,所以轉換為字節數組后,數組長度為7,分別從b(0)到b(6),如圖1-16所示。

圖1-16 字符串與字節數組的關系

在運行上述代碼過程中,通過本地窗口可以看到字節數組b的構成,如圖1-17所示。

圖1-17 字節數組的構成

上述過程運行完畢后,在立即窗口打印出字節數組的長度以及每個元素的值,并且把字節數組恢復為字符串,如圖1-18所示。

圖1-18 運行結果

1.2.2 文本文件的寫入

二進制方式打開文件的語句是:

    Open Path For Binary Access Write As #1

使用Put語句向文件中寫入內容。Put語句的語法格式為:

    Put #1,Pos,data

其中,#1是文件號,Pos用于指定文件的寫入位置,如果不指定該參數,則默認在文件結尾處寫入。data是要寫入的內容,可以是字符串或變量,也可以是字節數組。

下面的程序演示了二進制方式向文件中先后寫入兩個字符串。

上述代碼執行后,記事本中的內容為“VBA程序設計”,查看該文件的屬性,可以看到文件大小為11字節。因為“程序設計”4個漢字占據8字節,如圖1-19所示。

圖1-19 文件的大小

1.2.3 文本文件的讀出

二進制方式讀取文件的語句是:

    Open Path For Binary Access Read As #1

使用Get語句從文件中讀入內容。Get語句的語法格式為:

    Get #1,Pos,Byte()

其中,Pos參數用來指定讀取位置,如果不指定,則從上次讀取完畢的位置開始讀。

Byte()是用來存放讀出的數據的字節數組。

在讀取的過程中,有兩點需要注意:一是使用Get讀取過程中,讀取位置也隨之向后移動;二是聲明的字節數組的大小決定讀出內容的多少。

假設一個文本文件中的內容是“VBA程序設計”,共7個字符11個字節。下面的過程分兩次讀取其中的內容。

代碼分析:上述代碼中預先指定了字節數組b1可以存放5個字節,b2可以存放6個字節。因此,當執行Get #1, , b1這句時,b1將獲取文件中的前5個字節,也就是“VBA程”,b2接著獲取其后的剩余部分。

運行上述代碼,立即窗口打印出字符串s1和s2,如圖1-20所示。

以上分批次讀取一個文件的原理,是實現拆分文件的理論基礎。

在實際編程過程中,經常把文件的所有內容讀取到一個字符串變量中,因此改寫為如下過程。

圖1-20 字節數組轉換為字符串

代碼分析:要把文件所有內容獲取到字節數組中,需要事先知道文件的長度,也就是文件的字節數,可以用FileLen直接獲取文件長度,也可以打開文件后用LOF函數獲取。知道了文件的長度,就可重新定義數組的上下界。

運行上述代碼,立即窗口將打印出文件中的所有內容。

1.2.4 文本文件的拆分

如果文本文件中的內容很多,不方便操作時,就需要拆分為若干個小文件,具體拆分為多少個小文件、從什么位置開始拆分,這些基準可以根據實際情況而定。

假設“靜夜思.txt”文本文件里面存放的內容如圖1-21所示。

圖1-21 文件內容

可以看到,里面每一句都是5個漢字再加1個中文標點,也就是說每句占據12個字節,整個文件48字節。現在要求把這個文件拆分為4份,每個小文件保存一句,命名為Part#.txt。

代碼分析:由于每句占據12字節,所以字節數組要規定為b(0 To 11) As Byte,使得每次恰好讀出12字節。

然后在循環體中依次讀取每一行,并且把每次產生的字節數組保存到不同的子文件中。

上述過程運行后,可以看到文件夾中多了4個子文件,如圖1-22所示。

圖1-22 文件的拆分結果

1.2.5 文本文件的合并

平時可能會遇到將很多格式比較相似的記事本文件匯總到同一個文件中的情況。文件合并過程與拆分過程恰好相反,不同的是文件合并過程中,要多次讀取每個子文件,然后寫入總文件中。

下面的實例在打開總體文件的前提下依次打開每個子文件,讀取內容到數組,然后立即寫入總文件。

代碼分析:總文件的文件號是#1,子文件的文件號是#2。

運行上述代碼,計算機中產生一個名為Merged.txt的新文件,該文件內容是一首完整的“靜夜思”。

1.2.6 二進制文件的復制

除了處理文本文件外,還可以使用二進制方式讀寫計算機中的各種類型的文件,假設讀取文件X到字節數組B中,再把字節數組B寫入文件Y中,這樣就實現了文件的復制。

下面的過程把PythonLogo.png這個圖片讀出到數組,然后把數組寫入New.png。

運行上述過程后,將在磁盤中多了一個New.png圖片,這個圖片文件與原始圖片文件完全相同。

上述代碼的源文件為“實例文檔01b.xlsm”。

主站蜘蛛池模板: 安岳县| 深水埗区| 蕲春县| 荣成市| 鄂伦春自治旗| 娄底市| 曲麻莱县| 巫溪县| 黄浦区| 醴陵市| 隆子县| 西藏| 延川县| 屯昌县| 营山县| 鄂州市| 五大连池市| 同德县| 唐河县| 昌吉市| 平潭县| 乳山市| 吉木萨尔县| 西安市| 武汉市| 麻阳| 武平县| 彝良县| 平阴县| 中卫市| 昆山市| 湖南省| 中西区| 乾安县| 宜昌市| 丰台区| 万载县| 疏附县| 正定县| 集贤县| 武城县|