getlineラブ。

アルゴリズムの勉強用にC言語で1行読み込みを作ってみたけど、Rubyの方がずっと早かったorz。原因は、mallocの回数とioのバッファリングにあるような気がして今日はずっとRubyのio.cを眺めてた。ま、よくわからんのでwebを探索。

・・・素敵なライブラリを発見してしまった。

Manpage of GETLINE

なんと、C++のgetlineがC言語にも!!

getline() は stream から 1 行全てを読み込み、テキストが含まれているバッファのアドレスを *lineptr に格納する。

"1行全てを読み込み"

!!

C言語でちゃんと1行読み取るのは結構しんどい。なぜなら、C言語の配列は固定幅だからだ。可変長な文字列を作るためにはmallocして、1文字づつ読んで改行を探して、領域がたりなくなったら、reallocしながら配列を広げるしかない。速度的にもチューンが欠かせないポイント。ライブラリがあるなら、ライブラリを使った方がいい。

早速試した。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    
    while (getline(&line, &len, stdin) != -1) {
        printf("%s", line);
    }
    if (line)
        free(line);
    exit(EXIT_SUCCESS);
}

めっちゃ早い。自動malloc。超便利。素敵過ぎるぞGNU!!

いや、今日からGNU様と呼ぼう。

getline() と getdelim() は、ともに GNU による拡張である。

そらそうだ・・・個人的にはガンガン使おうと思う。便利杉。

あ、デザイン変更しました。