fgets と fputs
一行単位で入出力を行います。
また fgets は、その一行に満たない文字数だけを読み込むこともできます。
fgets( 文字配列 , 読み込みたい文字数+1 , 読み込みたいファイルポインタ
);
fputs( 文字配列 , 書き込みたいファイルポインタ );
のような感じです。
読み込みたい文字数+1 になっていることに注意してください。
その理由は、最後に必ず \0 が付け加えられるからです。(第二章参照)
それでは、次のような a.txt というファイルが存在したとします。
<a.txt>
このようなファイルが存在するとして、次のプログラムを見てください。
<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);
} |
<実行結果>
もし、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);
と書き換えると、どうなるでしょう?
勘違いしやすいのですが、結果は
<実行結果>
ではなく
<実行結果>
となります。
一行に満たない文字数だけ読み込んだら、次の行に移るのではなく、
その続きから読み込むということです。 |
|