C言語:使いまわせそうな単機能処理コード (ファイル読み込み、可変長引数の読み込み)

[C言語] 使いまわせそうな単機能処理コード (ファイル読み込み、可変長引数の読み込み)



ファイルの読み込み

man

man 2 open
man 2 read


ポイント

  • openでファイルを開く
    • fdは負の数でエラー
    • 読み込みだけなら第2引数はO_RDONLY
  • readで読む
    • 第2引数の変数に第3引数バイト分読む
    • ファイルサイズが大きければ何度も読むと続きから読める
    • 読み込めたバイト数を戻り値で返してくれる


コード

#include <unistd.h>
#include <fcntl.h>

static int  ft_strlen(char *s)
{
    int i;

    i = 0;
    if (!*s)
        return (0);
    while (s[i] != '\0')
        i++;
    return (i);
}

int    main(int argc, char **argv)
{
    int     fd;
    char    buf[100];
    int     ret;

    if (argc >= 2)
    {
        fd = open(argv[1], O_RDONLY);
        if (fd < 0)
            return (-1);
        ret = read(fd, buf, 99);
        if (ret != 0)
            write(1, buf, ft_strlen(buf));
        close(fd);
    }
}


可変長引数の読み込み

man

man va_start


ポイント

  • va_list型の変数を宣言しておく
  • 最初にva_startを呼び出す
  • 続いてva_argを必要な回数呼び出す
    • 第2引数に読み込むデータの型を渡す
  • 最後にva_endを呼んで終わり


コード

#include <stdarg.h>

int     printarg(const char *exp, ...)
{
    va_list        args;
    int            i;

    va_start(args,exp);
    
    i = va_arg(args, int);
    printf("%d\n", i);
    i = va_arg(args, int);
    printf("%d\n", i);
    
    va_end(args);

    return (0);
}

int     main(void)
{
    printarg("%d%d", 1, 3);
    return (0);
}