C語言檔案指標偏移的使用(點陣字型檔txt檔案取字)

2021-10-06 22:25:43 字數 2970 閱讀 3338

c語言中檔案讀寫也是相當重要的一塊,在進行二進位制檔案逐字節讀寫時,使用c語言會異常好用。檔案指標也是個讓人抓腦袋的東西,移動檔案指標的函式利用好可以有大作用。

檔案檔案結構體定義在 stdio.h 標頭檔案中,使用fopen開啟檔案後會儲存一些相關資料在結構體中。

typedef

struct

file;

檔案指標操作

檔案指標操作主要有以下幾個函式,在進行位址偏移計算時用得到。

void rewind(file *stream); - 設定檔案位置為給定流 stream 的檔案的開頭。

long int ftell(file *stream); - 返回給定流 stream 的當前檔案位置。

int fseek(file *stream, long int offset, int whence); - 設定流 stream 的檔案位置為給定的偏移 offset,引數 offset 意味著從給定的 whence 位置查詢的位元組數。

目標:從點陣字型檔lishu56.txt檔案中提取某乙個漢字。

實現思路:通過漢字的gb2312機內碼直接定位到檔案中的該漢字起始位置,然後進行迴圈讀寫複製。

上圖即該檔案中的格式,為圖方便,我直接使用二進位制檔案檢視器,定義了幾個基本的偏移量。

#define offset_base 98      

// 檔案首基準位置

#define offset_word 3666

// 這是點陣字型檔中每個字的整體位元組量

#define offset_inner 13

// 這是單個字內部起始到實際字的資料的位置的偏移量

因為該字型檔檔案中收錄的字並不是直接從 a1a1 連續到 f7fe 的,所以不能夠直接求偏移量然後直接偏移,否則使用 fseek 偏移超過檔案指標允許的範圍,程式將會陷入卡死(或死迴圈)的狀態。

以下為演算法流程圖:

注釋:offset_base 是從檔案首到能夠讀取第乙個(curcode後)gb2312碼的位置的偏移量。

offset_word 是讀完這一gb2312碼後到下乙個字能夠讀取gb2312碼的位置的偏移量。

offset_inner 是找到該字後,從讀完這一gb2312碼的位置到能夠讀取點陣文字的首位置的偏移量。

實現**:

該檔案基於windows系統,在windows系統中中文占用為兩個位元組(char),在linux系統中為三個位元組。

// 給單個字定位到指定位置

file*

locatechar

(char

* text, file* src)

else

}return file;

}

定位到漢字所在位置後就可以進行讀取複製操作了。

file* file =

fopen

("bitmap.txt"

,"wb+");

file* src =

fopen

("lishu56.txt"

,"rb");

src =

locatechar

(word, src)

;// 定位漢字

int tick =56*

56, flag;

// 該字型檔點陣尺寸為 56×56,flag用於標記跳出迴圈

size_t size =

sizeof

(char);

char reader;

while

(tick)

if(flag)

break;}

}fclose

(src)

;fclose

(file)

;

生成輸出漢字「洋」示例:命令視窗輸出

found char d1f3

檔案輸出

如果要將多個字合成在乙個檔案中,只需要稍作改動。

不過注意,將 file* 賦值給多個變數分別進行 fseek 定位,然後兩個指標這裡讀幾個字元,那裡讀幾個字元,最後你會發現每個檔案指標指向的都是最後一次呼叫 fseek 定位的那個字,導致最後是好幾個一樣的字合在一起。比如我要合成「洋伊」,最後得到的是:

抽象點說,簡而言之,就是指向檔案內容位置的檔案指標是唯一的。如果要將多個字合成在乙個文字中,可以採用以下思路:

先將要合成的字,每個字存在乙個臨時檔案中,再依次開啟這些檔案,讀取並複製到(合成)同一檔案中。

示例**中引用的部分函式**

// 獲得十六進製制對應字元

char

getx

(int value)

// 直接獲得文字gbk十六進製制機內碼

void

getgbk

(char

* dest,

char

* text)

dest[4]

=0;}

C語言 檔案指標偏移 啟動nfs服務功能

off t lseek int fd,off t offset,int whence 欲將讀寫位置移到檔案開頭時 lseek int fildes,0,seek set 欲將讀寫位置移到檔案尾時 lseek int fildes,0,seek end 想要取得目前檔案位置時 lseek int fi...

C語言中的指標加減偏移量

首先看一段程式 輸出結果為 2,5 第乙個結果好說,a 1後指標指向了陣列中的 2 而第二個為什麼輸出 5 呢。原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。比如,int a int b a 1 則 b a sizeof int char a char b a 1 則b a size...

C語言中的指標加減偏移量

首先看一段程式 cpp nogutter view plain copy include intmain int p int a 1 printf d,d n a 1 p 1 return 0 輸出結果為 第乙個結果好說,a 1後指標指向了陣列中的 2 而第二個為什麼輸出 5 呢。原理是c語言中的指...