utils.c和utils.h里存放的是一些文件打开关闭常用函数,在C语言标准库的函基础上增加异常检查退出功能
这部分涉及两个文件utils.c和utils.h, 其中utils.c还会额外导入ksort.h和kseq.h, 主要定义了和文件打开相关的函数
下面的函数是C自带函数加入了异常判断的改进版, 对应去掉err_
前缀的函数
- 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
为例,原函数fwrite会返回写出的数据量大小,如果写出的实际大小和我们预期的大小不符合就需要跳出异常
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;
}
异常相关函数
- err_fatal: 异常后退出,输出信息多 导致正常进程中止
- err_fatal_core: 异常后中止,输出信息多,导致异常的进程中止
- _err_fatal_simple: 异常后退出,输出信息少, 导致正常进程中止
- _errfatal_simple_core: 异常后中止,输出信息少,导致异常的进程中止
- err_fatal_simple, 封装了_err_fatal_simple
- err_fatal_simple_cores 封装了_err_fatal_simple_core
- xassert 封装了_err_fatal_simple_core
文件打开函数,能够自动处理管道输入和输出
- 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;
}
根据ksort.h里的宏初始化两个排序函数
- ks_introsort_64
- ks_introsort_128
定义了两个定时函数,分别是cputime 和 realtime
此外还定义了一个哈希函数,
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;
}
如何在自己的项目中使用utils.h
, 也就是替换原来的一些函数而已。
#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;
}