一、基礎知識
來源:http://crystaldonna.blog.sohu.com/84162722.html
從檔案編碼的方式來看,檔案可分為ASCII碼檔案和二進位碼檔案兩種:
ASCII檔案也稱為文字檔,這種檔案在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。ASCII碼檔案可在螢幕上按字元顯示,例如來源程式檔案就是ASCII檔案,用DOS命令TYPE可顯示檔案的內容。由於是按字元顯示,因此能讀懂檔案內容。
二進位檔案是按二進位的編碼方式來存放檔案的。例如,數5678的儲存形式為:00010110 00101110 只佔二個位元組。二進位檔案雖然也可在螢幕上顯示,但其內容無法讀懂。C系統在處理這些檔案時,並不區分類型,都看成是字元流,按位元組進行處理。輸入輸出字元流的開始和結束只由程式控制而不受物理符號(如斷行符號符)的控制。因此也把這種檔案稱作“流式檔案”。
流可以分為兩種類型:文字資料流和二進位流。文字資料流是解釋性的,最長可達255個字元,其中斷行符號/換行將被轉換為分行符號“/n”,(如果以"文本"方式開啟一個檔案,那麼在讀字元的時候,系統會把所有的"/r /n"序列轉成"/n",在寫入時把"/n"轉成"/r/n" )。二進位流是非解釋性的,一次處理一個字元,並且不轉換字元。
註:
/n一般會作業系統被翻譯成"行的結束",即LF(Line-Feed)
/r會被翻譯成"斷行符號",即CR(Cariage-Return)
對於文字檔的新行,在UNIX上,一般用/n(LF)來表示,Mac上用/r(CR)來表示,
Windows上是用/n/r(CR-LF)來表示。
在 matlab 中儲存成為二進位還是文字檔取決於fopen的方式,如果用wt,則儲存為文字檔,這樣用記事本開啟就可以正常顯示了;如果用w則儲存為二進位檔案,這樣用記事本開啟會出現小黑方塊,要正常顯示的話,可以用寫字板或UltraEdit等工具開啟。
二、在matlab中讀取二進位檔案
來源:http://blog.sina.com.cn/s/blog_4a0e9d52010091se.html
初學matlab時,總會遇到讀取位元據的問題,下面給出瞭解決辦法. matlab可以直接讀取位元據檔案,並且可以將其加入到矩陣中。如果對c語言十分熟悉的話,應該對fopen,fclose,ftell, fseek,fread,fwrite,feof這些函數非常熟悉了,幸運的是在matlab中仍然可以使用這些函數來讀入實驗資料。 現在假定有一個資料檔案叫data.dat,它的前面2k是存放參數的,我們做資料處理的時候需要跳過去,後面的資料是16位整數類型的,每組資料有512個。現在要把該資料檔案的所有資料讀入一個nx512的矩陣中,n的個數不定,根據資料檔案中的資料而定。用.m指令碼的方式編寫如下:% deal data from specified data file
clear ;
data_fname = 'data.dat' ; % 這裡是檔案名稱
jump_distance = 2048 ; % 這裡是跳過的位元組數% 開啟檔案為二進位開啟,其實'r'就行,matlab是預設二進位形式開啟檔案的file_id = fopen(data_fname, 'rb');% 從檔案開始跳過jump_distance個位元組
fseek(file_id, jump_distance, 'bof');% 先手工構造一個1x512大小的矩陣
raw_data = [1:1:512] ;
while feof(file_id) == 0 % 這就是大名頂頂的fread了,資料類型是int16,每次讀入512個數 % raw_array每次都是512x1的矩陣,ele_count為讀入的數的個數(正常情況下應為512)
[row_array, ele_count] = fread(file_id, 512, 'int16') ;
if ele_count < 512 % elecount < 512代表資料不夠,已經到了檔案的結尾
break ;
else % 將512x1的row_array轉置一下,變為1x512的矩陣
row_array = row_array' ; % 然後,將row_array追加到raw_data中
raw_data = [raw_data; row_array] ;
end
end
% get off the first line [1:1:512]% 這裡就是要把raw_data的第一行資料手工構造的那行資料給去掉,剩下的就都是檔案中的資料了
raw_data(1,:)=[] ;% 關閉檔案
fclose(file_id);% delete other usless vars% 這裡是把用過的變數都刪除掉,免得workspace裡面亂七八糟的什麼都有,這是個好習慣,呵呵。
clear data_fname jump_distance file_id fid ele_count i m n row_array ans;