BWA學(xué)習(xí)筆記之utils

utils.c和utils.h里存放的是一些文件打開關(guān)閉常用函數(shù),在C語言標(biāo)準(zhǔn)庫的函基礎(chǔ)上增加異常檢查退出功能

這部分涉及兩個文件utils.c和utils.h, 其中utils.c還會額外導(dǎo)入ksort.h和kseq.h, 主要定義了和文件打開相關(guān)的函數(shù)

下面的函數(shù)是C自帶函數(shù)加入了異常判斷的改進(jìn)版, 對應(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會返回寫出的數(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ù),能夠自動處理管道輸入和輸出

  • 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里的宏初始化兩個排序函數(shù)

  • ks_introsort_64
  • ks_introsort_128

定義了兩個定時函數(shù),分別是cputime 和 realtime

此外還定義了一個哈希函數(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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容