getlineラブ。
アルゴリズムの勉強用にC言語で1行読み込みを作ってみたけど、Rubyの方がずっと早かったorz。原因は、mallocの回数とioのバッファリングにあるような気がして今日はずっとRubyのio.cを眺めてた。ま、よくわからんのでwebを探索。
・・・素敵なライブラリを発見してしまった。
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 による拡張である。
そらそうだ・・・個人的にはガンガン使おうと思う。便利杉。
あ、デザイン変更しました。