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語言中的指...