13 May 2004
gfs_pio_readline 3 Gfarm
gfs_pio_readline 一行読み込み

    #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

`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