一、fseek函數基本介紹
fseek函數是Matlab中常用的文件操作函數之一,能夠實現文件內讀取位置的指定。
fid = fopen('test.txt', 'r');
fseek(fid, offset, origin);
其中,’test.txt’是待操作文件名稱,’r’表示以只讀方式打開文件;
offset是需要移動的位元組數,可以為正數、負數或零;
origin是移動的起始位置,可以是三個值:
- SEEK_SET:表示從文件之始開始偏移;
- SEEK_CUR:表示從當前位置開始偏移;
- SEEK_END:表示從文件之末開始偏移。
這樣就可以方便地對文件流進行跳躍定位,比如在讀取文件時,我們可以跳過前面若干位元組的無用信息,定位到讀取所需信息的位置。
二、fseek函數的使用方法
1. 文件指針的創建與移動
下面我們以圖像文件為例,演示使用fseek函數定位到特定像素點的方法。
% 打開圖片並進行處理
img = imread('peppers.png');
figure, imshow(img), title('Original image');
% 創建文件指針
fid = fopen('peppers.txt', 'w');
% 將圖片數據寫入指針所指定的文件
fwrite(fid, img, 'uint8');
% 將指針指向特定位置,即第400行,第1列
fseek(fid, 400 * size(img,1) + 1, 'bof');
% 從當前位置開始,讀取指定數量的數據
data = fread(fid, 10);
% 關閉文件指針
fclose(fid);
% 顯示讀取的數據
disp(data);
在上面的代碼中,我們使用了Matlab自帶的peppers.png圖片作為輸入數據源,並把該圖片的像素信息寫入名為peppers.txt的文件中。
接着,我們利用fseek函數將文件指針定位到第400行第1列的位置,即第400行首像素。
最後,我們使用fread函數從定位位置開始,讀取10個數據,並打印輸出。
2. 移動多個數據塊
基於fseek函數的定位操作,我們也可以一次性定位到多個數據塊,並進行連續讀取。
% 創建文件指針
fid = fopen('data.txt', 'w');
% 寫入數據
data = 1:20;
fwrite(fid, data, 'uint16');
% 將指針移動至第1個數據塊
offset = 4;
fseek(fid, offset, 'bof');
% 從當前位置開始連續讀取3個數據塊並打印輸出
data = fread(fid, 3, 'uint16');
fclose(fid);
% 打印讀取的數據
disp(data);
本例中,我們創建了一個名為data.txt的文件,並寫入包含1~20個數值的數據塊。接着,我們將文件指針向後移動4個數據塊,即從第5個到第8個數據塊的位置,然後再讀取3個數據塊的內容。
3. 跨文件移動指針
fseek函數不僅可以移動文件內部的指針,也可以用於跨文件移動指針。
% 創建兩個文件指針
fid1 = fopen('data1.txt', 'w');
fid2 = fopen('data2.txt', 'w');
% 在文件1中寫入數據
data = 1:5;
fwrite(fid1, data, 'uint8');
% 在文件2中寫入數據
data = 'CADT';
fwrite(fid2, data, 'char');
% 移動文件指針到文件2的起始位置
fseek(fid2, 0, 'bof');
% 把文件1中的數據複製到文件2
data = fread(fid1, inf, 'uint8');
fwrite(fid2, data, 'uint8');
% 關閉文件指針
fclose(fid1);
fclose(fid2);
% 讀出文件2中的所有數據
fid2 = fopen('data2.txt', 'r');
data = fread(fid2, inf, 'char');
fclose(fid2);
% 打印讀取的數據
disp(data);
本例中,我們分別創建了data1.txt和data2.txt兩個文件,並在各自的文件中寫入了數據。然後我們利用fseek函數將文件指針從data1.txt跳轉到data2.txt,並把data1.txt中的數據複製到data2.txt中。
最後,我們讀取data2.txt中的所有數據,並打印出來。
三、fseek函數的錯誤處理
在使用fseek函數時,可能面臨文件無法打開、指針越界等問題。這時需要及時處理錯誤信息,確保程序順利運行。
% 打開文件
fid = fopen('nus.txt', 'r');
% 如果成功打開文件,就將指針移動到末尾
if fid ~= -1
fseek(fid, 0, 'eof');
fileSize = ftell(fid);
fprintf('File size is %d bytes.\n', fileSize);
% 關閉文件指針
fclose(fid);
else
fprintf('File could not be opened.\n');
end
在上面的例子中,我們利用fopen函數打開名為nus.txt的文件,並檢查文件是否成功打開。如果成功打開,則移動指針到末尾,獲取文件大小並關閉文件指針;如果文件無法打開,則輸出錯誤信息。
四、fseek函數實際應用場景
fseek函數的跳躍定位功能,在實際應用中十分重要。我們可以利用fseek函數實現對大型文件的逐塊讀取,實現更高效的文件讀寫操作。
下面以讀取文本文件的方式為例,演示fseek函數實際應用。
function readData(filename, blockSize)
% 打開文件
fid = fopen(filename, 'r');
% 如果成功打開文件,就開始讀取
if fid ~= -1
% 獲取文件總大小
fseek(fid, 0, 'eof');
fileSize = ftell(fid);
% 從文件開始處開始讀取
fseek(fid, 0, 'bof');
blockNum = ceil(fileSize / blockSize);
% 逐塊讀取文件
for i = 1:blockNum
curBlock = fread(fid, blockSize, '*char');
fprintf('%s', curBlock);
fseek(fid, blockSize, 'cof');
end
% 關閉文件
fclose(fid);
else
fprintf('File could not be opened.\n');
end
在上述代碼中,我們定義了一個名為readData的函數,用於按塊讀取文本文件。函數有兩個輸入參數,filename表示文件名稱,blockSize表示每個數據塊的大小。
首先,我們打開文件並檢查是否成功打開。如果打開成功,就通過fseek函數獲取文件總大小,並將指針移動到文件的開始位置。
接着,我們設定塊數與文件大小之間的關係,並逐塊讀取文件。對於每個數據塊,我們使用fread函數從文件中讀取blockSize大小的數據,並用fprintf函數將讀取的數據打印到屏幕上。
最後,我們使用fseek函數將文件指針移動至下一塊數據所在位置,繼續讀取數據。如果讀取完畢,則關閉文件。
五、總結
本文從fseek函數的基本介紹、使用方法、錯誤處理和實際應用場景等多個方面對Matlab fseek進行了詳細的闡述。fseek函數的跳躍定位功能,為我們處理大型文件和數據流提供了便利,值得熟練掌握。
原創文章,作者:CWRKB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/362662.html