こんにちは、もがちゃんです
C言語でテキストファイルから入力する際に、よく利用するのがfgets関数です
fgets関数は、ファイルからの入力時に利用されるので
fopen関数、fclose関数と一緒に使用されます
この記事では
fgets関数の使い方を簡単なサンプルソースとともに説明します
目次
fgetsの構文
#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
fgetsの説明
fgetsは、streamで指定されたファイルポインタに紐づくファイルから文字列を取得する関数です
一回のfgets関数呼び出しで、ファイルから取得できる最大サイズは、n-1バイトですが、途中に改行文字が出現した場合は、改行文字までを取得します
ファイルの終わりが検出された場合は、ファイルの終わりまで取得します
ファイルから取得した文字列の最後には、NULL文字が付加されます
fgets関数は、streamが指すストリームから文字の列を読み取り、sが指す配列に格納する。
JISX3010 プログラム言語C
このとき、n-1を読み取る文字数の最大値とする。改行文字を読み取ったとき、又はファイルの終わりを検出したときに、文字の読取りは終了する(読み取った改行文字も配列に格納する。)。そして,最後に配列に格納した文字の後にナル文字を書き込む。
streamで指定されたファイルから、文字列を取得する際、取得した文字列を格納する領域の先頭ポインタを指定します
sで指定する領域の最大サイズは、nバイト以上にする必要があります
streamで指定されたファイルから、一度に取得するバイト数+1を指定します
sで指定する領域のサイズ以下にする必要があります
通常は、sで指定する領域のサイズを指定します
読み取りたいファイルに紐づくファイルポインタを指定します
(fopen関数の返却値を指定します)
ファイルからの読み取りに
成功した場合は、sを返します
ファイルの終わりを検出し、1文字も取得できなかった場合は、NULLを返します
失敗した場合は、NULLを返します
fgets関数は、成功するとsを返す。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、配列の内容を変化させずに残し、空ポインタを返す。読取りエラーが発生した場合も空ポインタを返すが、この場合の配列の内容は、不定とする。
JISX3010 プログラム言語C
fgetsの使い方サンプル
テキストファイルから文字列を取得する簡単なサンプルプログラムを紹介します
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
#include <stdio.h>
int main(int argc, char *argv[]) {
// "r"モードで test1.txt ファイルをオープン
FILE *fp = fopen("test1.txt","r");
if(fp != NULL) {
// ファイルオープンが成功したら
char buffer[512];
//1行ずつbufferに読み込み標準出力へ出力する
while(fgets(buffer, 11, fp) != NULL) {
printf("%s\n", buffer);
}
// ファイルをクローズする
int ret = fclose(fp);
if(ret != 0) {
printf("fclose()に失敗しました![%d]\n", ret);
}
}
}
![nが1行のバイト数未満のサンプルプログラムと動作結果](https://mogachan.net/wp-content/uploads/2020/07/22b0423599cbf9525b3e60cf7577b0ee.jpg)
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
#include <stdio.h>
int main(int argc, char *argv[]) {
// "r"モードで test1.txt ファイルをオープン
FILE *fp = fopen("test1.txt","r");
if(fp != NULL) {
// ファイルオープンが成功したら
char buffer[512];
//1行ずつbufferに読み込み標準出力へ出力する
while(fgets(buffer, 512, fp) != NULL) {
printf("%s\n", buffer);
}
// ファイルをクローズする
int ret = fclose(fp);
if(ret != 0) {
printf("fclose()に失敗しました![%d]\n", ret);
}
}
}
![nが1行のバイト数超のサンプルプログラムと動作結果](https://mogachan.net/wp-content/uploads/2020/07/3b0e68dbe1788f43332383f47e01a0bc.jpg)
fgetsのまとめ
fgets関数は、fopen関数、fclose関数とセットで使用する
fgets関数で指定する s の領域は、最低 n バイト以上の領域を用意する
fgets関数で指定する n の値は、s の領域サイズ以下で指定する
fgets関数で取得した文字列の最後には、NULLが付加される
1回のfgets関数呼び出しで取得できる文字列は以下の通り
- n – 1バイトまで
- 改行まで
- ファイルの終わりまで