サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>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言語講座−それ自体コンパイルできる教材を使った講座です−