一行入力

getline()、getdelim()

#define _GNU_SOURCE
#include <stdio.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Linuxで使える関数です。
getlineはstreamから一行読み込み、*lineptrに格納します。
必要に応じて勝手に*lineptrを拡張してくれます。自分でバッファを用意するのがめんどくさい人は*lineptrにNULLを入れましょう。
getdelim()は改行以外の区切り文字をdelimに指定できます。

使い方

標準入力から入力されたものを出力します。

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

int main() {
  FILE *file;
  char *line;
  size_t length;
  file=fopen("/dev/stdin","r");
  line=NULL;
  while (getline(&line,&length,file)!=-1) {
    printf(line);
  }
  free(line);
  fclose(file);
  return 0;
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc test.c

fgetln()

#include <stdio.h>
char *fgetln(FILE *stream, size_t *len);

BSD系のOSで使える関数です。
読み込んだ一行を返してくれますが、次の行を読み込んだり、ファイルと閉じたりするとポインタが無効になるので、読み込んだ行を残しておきたい場合は複製する必要があります。また、返ってくる文字はヌル文字で終わっていないので注意が必要です。

使い方

標準入力から入力されたものを出力します。

#include <stdio.h>

int main() {
  FILE *file;
  char *line;
  size_t length;

  file=fopen("/dev/stdin","r");
  while ((line=fgetln(file,&length))!=NULL) {
    int i;

    for (i=0;i<length;i++) {
      putchar(line[i]);
    }
  }
  fclose(file);
  return 0;
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc test.c