在用c寫(xiě)程序時(shí),很多時(shí)候需要存儲(chǔ)一些簡(jiǎn)單的數(shù)據(jù),如果為此而用mysql數(shù)據(jù)庫(kù)就有些
大才小用了,可以把這些數(shù)據(jù)以結(jié)構(gòu)的形寫(xiě)入文件,然后再需要時(shí)讀取文件,取出數(shù)據(jù)。
如下是定義函數(shù)的源文件和頭文件:
源文件struct.c:
#include "struct.h"
//第一個(gè)參數(shù)是要寫(xiě)入的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
第四個(gè)參數(shù)是打開(kāi)文件流的形態(tài),返回TRUE表示寫(xiě)入成功,返回FALSE表示寫(xiě)入失敗
int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode){
int ret;
FILE *fileID = NULL;
fileID = fopen(fileName,mode);
if (fileID == NULL){
perror("fopen");
goto writeEnd;
}
rewind(fileID);
ret = fwrite(buffer,bufferLen,1,fileID);
if (ret <= 0){
perror("fwrite");
goto writeEnd;
}
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return TRUE;
writeEnd:
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return FALSE;
}
//第一個(gè)參數(shù)是要讀取的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
第四個(gè)參數(shù)是打開(kāi)文件流的形態(tài),返回TRUE表示讀取成功,返回FALSE表示讀取失敗
int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode){
int ret;
FILE *fileID = NULL;
fileID = fopen(fileName,mode);
if (fileID == NULL){
perror("fopen");
goto readEnd;
}
rewind(fileID);
memset(buffer,0,sizeof(buffer));
ret = fread(buffer,bufferLen,1,fileID);
if (ret >= 0){
strcat(buffer,"\0");
}else{
perror("fread") ;
goto readEnd;
}
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return TRUE;
readEnd:
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return FALSE;
}
頭文件struct.h:
#ifndef OWNSTRUCT_H_
#define OWNSTRUCT_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
//第一個(gè)參數(shù)是要寫(xiě)入的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
第四個(gè)參數(shù)是打開(kāi)文件流的形態(tài),返回TRUE表示寫(xiě)入成功,返回FALSE表示寫(xiě)入失敗
int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
//第一個(gè)參數(shù)是要讀取的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
第四個(gè)參數(shù)是打開(kāi)文件流的形態(tài),返回TRUE表示讀取成功,返回FALSE表示讀取失敗
int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
#endif
為了使用方便,可以把這兩個(gè)函數(shù)接口定義為動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接庫(kù)。用動(dòng)態(tài)鏈接庫(kù)
編譯生成的可執(zhí)行文件需調(diào)用.so文件方可正常運(yùn)行,靈活但稍顯麻煩;用靜態(tài)鏈接庫(kù)編
譯生成的可執(zhí)行文件可直接運(yùn)行,不用再調(diào)用如.so般的依賴(lài)庫(kù)文件,簡(jiǎn)單但不靈活。
靜態(tài)鏈接庫(kù):
1、編譯生成目標(biāo)文件
gcc -c struct.c
2、創(chuàng)建靜態(tài)庫(kù)
ar cqs libstruct.a struct.o (順序不能亂)
3、鏈接靜態(tài)鏈接庫(kù),生成可執(zhí)行文件
gcc main.c -static -L. -ltest -o main
動(dòng)態(tài)鏈接庫(kù):
1、編譯成動(dòng)態(tài)鏈接庫(kù)
gcc struct.c -fPIC -shared -o libstruct.so
2、鏈接動(dòng)態(tài)鏈接庫(kù),生成可執(zhí)行文件
gcc main.c -L. -lstruct -o main
3、設(shè)置庫(kù)文件的環(huán)境路徑
1)在bashrc或profile文件里用LD_LIBRARY_PATH定義,然后用source加載。
2)把庫(kù)路徑添加到ld.so.conf文件中,然后用ldconfig加載。
3)ldconfig /home/user/lib,僅能暫時(shí)性使用,若下次ldconfig時(shí)此目錄下的動(dòng)態(tài)鏈
接庫(kù)就不能被共享了。
gcc一些參數(shù)解析
-shared:指定生成動(dòng)態(tài)鏈接庫(kù)。
-static:指定生成靜態(tài)鏈接庫(kù)。
-fPIC:表示編譯為位置獨(dú)立的代碼,用于編譯共享庫(kù)。目標(biāo)文件需要?jiǎng)?chuàng)建成位置無(wú)關(guān)
碼,概念上就是在可執(zhí)行程序裝載它們的時(shí)候,它們可以放在可執(zhí)行程序的內(nèi)存里的任
何地方。
-L.:表示要連接的庫(kù)在當(dāng)前目錄中。
-l:指定鏈接時(shí)需要的動(dòng)態(tài)庫(kù)。編譯器查找動(dòng)態(tài)連接庫(kù)時(shí)有隱含的命名規(guī)則,即在給出
的名字前面加上lib,后面加上.so來(lái)確定庫(kù)的名稱(chēng)。
-Wall:生成所有警告信息。
-ggdb:此選項(xiàng)將盡可能的生成gdb的可以使用的調(diào)試信息。
-g:編譯器在編譯的時(shí)候產(chǎn)生調(diào)試信息。
-c:只激活預(yù)處理、編譯和匯編,也就是把程序做成目標(biāo)文件(.o文件)。
-Wl,options:把參數(shù)(options)傳遞給鏈接器ld。如果options中間有逗號(hào),就將
options分成多個(gè)選項(xiàng),然后傳遞給鏈接程序。