サイトマップ / C言語講座出入り口総目次目次:ファイル>fgets( )とputs( )||デモ用

青い直線

fgets( )とputs( )

青い直線

[読み込みモードで開く]←このソース→[印字可能な文字の数を数える]

/* ソースプログラムの説明 */

/* 今日もファイルを読み込みモードで開き、各行に行番号を付けて標準出力に出力します。まず最初にこのファイルを開いて下さい。このページのソースプログラムをコンパイルしてできたexeファイルと、このファイルを同じディレクトリにおいて実行して下さい。その際、このファイルの名前を必ず、”LTest.c”にして下さい。また、このファイルをコピーアンドペーストするときは、必ず最後のリターンコードまでコピーして下さい。そうしないと、正常に動作しません。読者の方、ご指摘ありがとうございました。

前回は、ファイルから1文字読み込むライブラリ関数、getc( ) と、標準出力に1文字出力する関数、putchar( ) を、使いました。今回は、行単位で文字列を読み込む関数と、書き込む関数、fgets( ) と puts( ) を使い、同様に表示させます。

    #include <stdio.h>
    char *fgets(char *s, int n, FILE *fp);

    例:s1 = fgets(s2, n, fp);

    戻り値
    成功した場合        読み込んだ文字列へのポインタ
    失敗した場合        NULL

fgets( ) は、ファイルから、n-1 の文字を読み込み、文字列の末に NULL 文字( '\0' ) を追加します。もし、途中で改行コード( '\n' ) を読み込むと、改行コードの後に、 NULL 文字( '\0' ) を書き込みます。

    #include <stdio.h>
    int  puts(const char *s);

    puts (s);

    戻り値
    成功した場合        0
    失敗した場合        EOF

puts( ) は、NULL 文字( '\0' )に出会うと、改行コード( '\n' ) に変換します。従って、fgets( ) と puts( ) を使うと、fgets( ) が、改行コードの後に、 NULL 文字を書き込み、 puts() が、NULL 文字を改行コードに変換するので、ひとつ余計な改行コードが書き込まれます。このままでは、ソースプログラムがダブルスペースで表示されてしまいます。これを防ぐために、一工夫します。

ファイルの途中で、fgets( ) が改行コードに出会うと、改行コードの後に NULL 文字を書き込みます。

strlen( ) は文字列の長さを返しますが、NULL 文字を数えません。fgets( ) で文字列 string[ ] に読み込んだとします。strlen(string) の戻り値を n とすると、配列の添え字はゼロから始まるので、string[n - 1] はNULL 文字の前にある改行コードになります。そこで、下記のコードで余分な改行コードを取り除くことができます。

    string[n - 1] = '\0';

strlen( ) の簡単な説明を下記に示しました。

    #include <string.h>
    size_t  strlen(const char *s);

    例:n = strlen(s);

    戻り値        文字列 s の長さ

LTest.html を"LTest.c"に変更し、同じホルダーに置いてから、実行して下さい。 */

/* ここからソースプログラム */

#include  <stdio.h>
#include  <stdlib.h>    /* exit(  ) で必要 */
#include  <string.h>    /* strlen(  ) で必要 */

#define MAX_LEN 256     /* 1行の最大文字数 -1 */
 
void main(void);

void main(void)
{
    FILE *fp;
    char string[MAX_LEN];            /* 文字列を読み込む配列 */
    int n = 1;                       /*行番号用カウンタ */
	 	
      /* ファイルを開けなかったら */ 	
    if ((fp = fopen("LTest.c", "r")) == NULL) {
        fprintf(stderr, "ファイルを開けません!\n");
        exit (2);                    /* メッセージを表示して終了 */
    }

      /* ファイルから失敗するまで行単位で文字を読み込み */
    while ((fgets(string, MAX_LEN - 1, fp)) != NULL) {
        string[strlen(string) - 1] = '\0';     /* 余分な改行コードを削除 */
        printf("%d:", n++);                    /*行番号を表示し */
        puts(string);                          /*読み込んだ行を表示 */
    }
    fclose(fp);                                /* ファイルを閉じる */
}

/* ここまでソースプログラム */

[読み込みモードで開く]←このソース→[印字可能な文字の数を数える]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>fgets( )とputs( )||デモ用