utils.c和utils.h里存放的是一些文件打開關(guān)閉常用函數(shù)西饵,在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)的函基礎(chǔ)上增加異常檢查退出功能
這部分涉及兩個(gè)文件utils.c和utils.h, 其中utils.c還會(huì)額外導(dǎo)入ksort.h和kseq.h, 主要定義了和文件打開相關(guān)的函數(shù)
下面的函數(shù)是C自帶函數(shù)加入了異常判斷的改進(jìn)版, 對(duì)應(yīng)去掉err_
前綴的函數(shù)
- err_fwrite
- err_fread_noeof
- err_gzread
- err_fseek
- err_rewind, 封裝了 err_fseek
- err_ftell
- err_fprintf
- err_printf
- err_fputs
- err_puts
- err_fflush
- err_fclose
- err_gzclose
我們以err_fwrite
為例哨坪,原函數(shù)fwrite會(huì)返回寫出的數(shù)據(jù)量大小瞳筏,如果寫出的實(shí)際大小和我們預(yù)期的大小不符合就需要跳出異常
size_t err_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t ret = fwrite(ptr, size, nmemb, stream);
if (ret != nmemb)
_err_fatal_simple("fwrite", strerror(errno));
return ret;
}
異常相關(guān)函數(shù)
- err_fatal: 異常后退出舌涨,輸出信息多 導(dǎo)致正常進(jìn)程中止
- err_fatal_core: 異常后中止蛛株,輸出信息多蜘犁,導(dǎo)致異常的進(jìn)程中止
- _err_fatal_simple: 異常后退出翰苫,輸出信息少, 導(dǎo)致正常進(jìn)程中止
- _errfatal_simple_core: 異常后中止,輸出信息少这橙,導(dǎo)致異常的進(jìn)程中止
- err_fatal_simple, 封裝了_err_fatal_simple
- err_fatal_simple_cores 封裝了_err_fatal_simple_core
- xassert 封裝了_err_fatal_simple_core
文件打開函數(shù)奏窑,能夠自動(dòng)處理管道輸入和輸出
- err_xopen_core: 打開普通文件
- err_xreopen_core: 重新打開普通文件
- err_xzopen_core: 打開壓縮文件
- xopen 封裝了err_xopen_core
- xreopen 封裝了 err_xreopen_core
- xzopen 封裝了 err_xzopen_core
我們以err_xopen_core為例
FILE *err_xopen_core(const char *func, const char *fn, const char *mode)
{
FILE *fp = 0;
if (strcmp(fn, "-") == 0)
return (strstr(mode, "r"))? stdin : stdout;
if ((fp = fopen(fn, mode)) == 0) {
err_fatal(func, "fail to open file '%s' : %s", fn, strerror(errno));
}
return fp;
}
根據(jù)ksort.h里的宏初始化兩個(gè)排序函數(shù)
- ks_introsort_64
- ks_introsort_128
定義了兩個(gè)定時(shí)函數(shù),分別是cputime 和 realtime
此外還定義了一個(gè)哈希函數(shù),
static inline uint64_t hash_64(uint64_t key)
{
key += ~(key << 32);
key ^= (key >> 22);
key += ~(key << 13);
key ^= (key >> 8);
key += (key << 3);
key ^= (key >> 15);
key += ~(key << 27);
key ^= (key >> 31);
return key;
}
如何在自己的項(xiàng)目中使用utils.h
, 也就是替換原來的一些函數(shù)而已屈扎。
#include "utils.h"
int main(int argc, char const *argv[])
{
FILE *fn;
fn = xopen(argv[1], "w");
fprintf(fn, "hell world !\n");
err_fclose(fn);
return 0;
}