Cでthrowもどき

Rubyのopenブロックは美しい。

open("input.txt", "r") do |handle|
  while x = handle
    ...
  end
end

とすると,whileブロックをどう抜けようが,確実にcloseされる。 これがない言語が最近つらい。close を書くなら一箇所にしたいなあ。 ならこういうのはどうじゃ。

FILE *fp = NULL; char buf[BUFLEN];
while (1) {
  if (NULL == (fp=fopen("input.txt", "r"))) break;
  while (fgets(buf, sizeof buf, fp)) {
    処理処理処理;
    if (条件) break;
    処理処理処理;
  }
  break;
}
if (fp) fclose(fp);

これなら素直にgoto使えってか。