# gfs_pio_readline

## Name

gfs_pio_readline -- 一行読み込み

## Synopsis

    #include <gfarm/gfarm.h>

```char *gfs_pio_readline``(GFS_File `f`, char **`bufp`, size_t *`sizep`, size_t *`lenp`);`

## DESCRIPTION

ファイル `gf` から、一行読み込みます。

引数 `bufp` は、最初は NULL で初期化されたポインタ変数のアドレスを指定します。 関数 `gfs_pio_readline()` は、入出力に用いる バッファを動的に割り当て、そのアドレスをこのポインタ変数に記録します。 引数 `sizep` は、0 で初期化した size_t 型の変数 のアドレスを指定します。この変数は、バッファのサイズを記録するために 使われます。 あるいは、malloc(3) で割り当てたバッファを指すポインタのアドレスを 引数 `bufp` に指定することもできます。この場合、 引数 `sizep` は、割り当てたバッファのサイズで初期化しておきます。 行の長さがバッファのサイズを越える場合には、バッファは自動的に realloc(3) され、 引数 `bufp` および 引数 `sizep` で指定された変数もそれに従って更新されます。 ファイルを読み終わったら、このポインタを free(3) で解放する必要が あります。

引数 `lenp` の指す変数には、読み込んだ長さを返します。 この長さには、行末記号の分も含みます。

関数 gfs_pio_gets(3) と同様、この関数は行末の改行記号を削除しません。 また、文字列の終わりを示す '\0' 文字を、常に付加します。 また、 引数 `lenp` の指す変数に返った値を使えば、文字 '\0' を含む行を扱うこともできます。

EOF は、入力の長さが 0 文字であることで判断します。

この関数は、gfs_pio_readdelim(f, bufp, sizep, lenp, "\n", 1) と 等価です。

## RETURN VALUES

`NULL`

  正常終了を示します。

`GFARM_ERR_NO_MEMORY`

  メモリ不足のため処理を中止しました。

  この場合も、`bufp` の指すポインタ変数の 指す領域を free(3) する必要がありますから注意してください。

その他

  上記以外のエラーが生じたことを示します。

## EXAMPLES

Example 1. `gfs_pio_readline` 関数の使用例

    #include <stdio.h>
    #include <stdlib.h>
    #include <gfarm/gfarm.h>

    int
    main(int argc, char **argv)
    {
    	char *e;
    	GFS_File gf;
    	size_t bufsize = 0, len;
    	char *buffer = NULL;

    	e = gfarm_initialize(&argc, &argv);
    	if (e != NULL) {
    		fprintf(stderr, "gfarm_initialize: %s\n", e);
    		return (EXIT_FAILURE);
    	}
    	if (argc <= 1) {
    		fprintf(stderr, "missing gfarm filename\n");
    		return (EXIT_FAILURE);
    	}
    	e = gfs_pio_open(argv[1], GFARM_FILE_RDONLY, &gf);
    	if (e != NULL) {
    		fprintf(stderr, "%s: %s\n", argv[1], e);
    		return (EXIT_FAILURE);
    	}
    	e = gfs_pio_set_view_global(gf, 0);
    	if (e != NULL) {
    		fprintf(stderr, "%s: gfs_pio_set_view_global: %s\n",
    		    argv[1], e);
    		return (EXIT_FAILURE);
    	}

    	while ((e = gfs_pio_readline(gf, &buffer, &bufsize, &len))
    	    == NULL && len > 0) {
    		printf("<%6d/%6d >%s", len, bufsize, buffer);
    	}
    	if (buffer != NULL)
    		free(buffer);
    	if (e != NULL) {
    		fprintf(stderr, "ERROR: %s\n", e);
    		return (EXIT_FAILURE);
    	}
    	e = gfs_pio_close(gf);
    	if (e != NULL) {
    		fprintf(stderr, "gfs_pio_close: %s\n", e);
    		return (EXIT_FAILURE);
    	}
    	e = gfarm_terminate();
    	if (e != NULL) {
    		fprintf(stderr, "gfarm_initialize: %s\n", e);
    		return (EXIT_FAILURE);
    	}
    	return (EXIT_SUCCESS);
    }

## SEE ALSO

gfs_pio_open(3), gfs_pio_getline(3), gfs_pio_gets(3), gfs_pio_readdelim(3)