第十七章 fgets,fputs


fgets と fputs                                                                                                      
一行単位で入出力を行います。
また fgets は、その一行に満たない文字数だけを読み込むこともできます。
 fgets( 文字配列 , 読み込みたい文字数+1 , 読み込みたいファイルポインタ );
 fputs( 文字配列 , 書き込みたいファイルポインタ );
のような感じです。
読み込みたい文字数+1 になっていることに注意してください。
その理由は、最後に必ず \0 が付け加えられるからです。(第二章参照

それでは、次のような a.txt というファイルが存在したとします。                       
<a.txt>
aaaaaa
bbbbbb

このようなファイルが存在するとして、次のプログラムを見てください。

<fgets,fputs>
#include<stdio.h>
#include<stdlib.h>

main()
{
    FILE *fp;
    char str_1[256];
    char str_2[256];

/* a.txt ファイルを読み込みモードで開く */
    if((fp=fopen("a.txt","r"))==NULL)
    {
        printf("ファイルを開けません\n");
        exit(1);
    }
    fgets(str_1,256,fp); /* ファイルから255文字読み込みstr_1に保存 */
    fgets(str_2,256,fp); /* ファイルから255文字読み込みstr_2に保存 */
    fclose(fp);

/* b.txt ファイルを書き込みモードで開く */
   if((fp=fopen("b.txt","w"))==NULL)
    {
        printf("ファイルを開けません\n");
        exit(1);
    }
    fputs(str_1,fp);  /* ファイルへstr_1の値を書き込む */
    fputs(str_2,fp);  /* ファイルへstr_2の値を書き込む */
    fclose(fp);
}
<実行結果>
<a.txt>
aaaaaa
bbbbbb
<b.txt>
aaaaaa
bbbbbb

もし、b.txt というファイルが実行前にあったならば、getc ,putc のときと同様に、
前の内容は消されます。

ここで、なぜ fgets が 255 文字読み込みなのに大丈夫なのかというと、
fgets は \n が入力された時点で読み込みを終了するからです。

つまり、プログラムにとっては、 a.txt に aaaaaa\n と書いてあることになるので、
256 文字読み込めても、その時点で読み込みをやめてしまうのです。

では、もし
   fgets(str_1,256,fp);  ⇒   fgets(str_1,3,fp); 
   fgets(str_1,256,fp);  ⇒   fgets(str_1,3,fp); 
と書き換えると、どうなるでしょう?

勘違いしやすいのですが、結果は
<実行結果>
<a.txt>
aaaaaa
bbbbbb
<b.txt>
aa
bb
ではなく
<実行結果>
<a.txt>
aaaaaa
bbbbbb
<b.txt>
aaaa
となります。
一行に満たない文字数だけ読み込んだら、次の行に移るのではなく、
その続きから読み込むということです。

<前に戻る  |目次|  次へ進む>