fgets関数のサンプルコード

2024-04-02

C言語におけるファイル入出力とfgets関数

ヘッダーファイルのインクルード

まず、ファイル入出力を行うためには、stdio.hヘッダーファイルをインクルードする必要があります。

#include <stdio.h>

ファイルのオープン

次に、fopen関数を使ってファイルを開きます。fopen関数は、以下の3つの引数を受け取ります。

  • ファイル名: 読み込むファイルの名前を文字列で指定します。
  • モード: ファイルを開くモードを指定します。"r"は読み込みモード、"w"は書き込みモード、"a"は追記モードを表します。
  • ファイルポインタ: ファイル操作のためのポインタを格納するための変数を指定します。
FILE *fp;

fp = fopen("test.txt", "r");

if (fp == NULL) {
  printf("ファイルを開けません\n");
  return 1;
}

ファイルの読み込み

fgets関数を使って、ファイルから1行ずつ文字列を読み込みます。fgets関数は、以下の3つの引数を受け取ります。

  • バッファ: 読み込んだ文字列を格納するためのバッファを指定します。
  • バッファサイズ: バッファのサイズを指定します。
  • ファイルポインタ: ファイル操作のためのポインタを指定します。

fgets関数は、読み込んだ文字列のポインタを返します。読み込みに失敗した場合は、NULLを返します。

char buf[1024];

while (fgets(buf, sizeof(buf), fp) != NULL) {
  printf("%s", buf);
}

ファイルのクローズ

最後に、fclose関数を使ってファイルを閉じます。fclose関数は、ファイル操作のためのポインタを1つの引数として受け取ります。

fclose(fp);

以下のコードは、test.txtファイルの内容を1行ずつ読み込み、標準出力に出力するサンプルコードです。

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp) != NULL) {
    printf("%s", buf);
  }

  fclose(fp);

  return 0;
}

補足

  • fgets関数は、改行文字('\n')を含む1行を読み込みます。
  • fgets関数は、読み込んだ文字列の末尾にヌル文字('\0')を追加します。
  • fgets関数は、EOF(ファイルの終端)に達すると、NULLを返します。
  • バッファサイズよりも長い行を読み込む場合は、fgets関数はバッファサイズ-1文字までしか読み込みません。

参考資料

  • [C言語入門】ファイルの読み込み方法まとめ(fopen, fgets) | 侍エンジニアブログ (URL 侍エンジニアブログ)
  • fgets() — ストリングの読み取り - IBM (URL IBM)


fgets関数のサンプルコード

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp) != NULL) {
    printf("%s", buf);
  }

  fclose(fp);

  return 0;
}

ファイルの内容を逆順に出力する

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];
  int i, len;

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp) != NULL) {
    len = strlen(buf);
    for (i = len - 1; i >= 0; i--) {
      putchar(buf[i]);
    }
  }

  fclose(fp);

  return 0;
}

ファイルから特定の文字列を検索する

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];
  char *p;

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp) != NULL) {
    p = strstr(buf, "検索したい文字列");
    if (p != NULL) {
      printf("%s", buf);
    }
  }

  fclose(fp);

  return 0;
}

ファイルの内容を別のファイルにコピーする

#include <stdio.h>

int main() {
  FILE *fp1, *fp2;
  char buf[1024];

  fp1 = fopen("test.txt", "r");
  fp2 = fopen("copy.txt", "w");

  if (fp1 == NULL || fp2 == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp1) != NULL) {
    fputs(buf, fp2);
  }

  fclose(fp1);
  fclose(fp2);

  return 0;
}

ファイルの内容を大文字に変換する

#include <stdio.h>
#include <ctype.h>

int main() {
  FILE *fp;
  char buf[1024];
  int i;

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  while (fgets(buf, sizeof(buf), fp) != NULL) {
    for (i = 0; i < strlen(buf); i++) {
      buf[i] = toupper(buf[i]);
    }
    printf("%s", buf);
  }

  fclose(fp);

  return 0;
}

これらのサンプルコードは、fgets関数の基本的な使い方を理解するのに役立ちます。



fgets関数以外のファイル読み込み方法

fread関数は、バイナリデータを読み込む関数です。fgets関数と異なり、改行文字などの制御文字も読み込むことができます。

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];
  size_t n;

  fp = fopen("test.txt", "rb");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  n = fread(buf, 1, sizeof(buf), fp);

  if (n < sizeof(buf)) {
    printf("読み込みエラー\n");
    return 1;
  }

  fclose(fp);

  return 0;
}

fscanf関数は、書式指定付きでファイルからデータを読み込む関数です。fgets関数と異なり、数値や文字列などのデータ型を指定して読み込むことができます。

#include <stdio.h>

int main() {
  FILE *fp;
  int num;
  char str[100];

  fp = fopen("test.txt", "r");

  if (fp == NULL) {
    printf("ファイルを開けません\n");
    return 1;
  }

  fscanf(fp, "%d %s", &num, str);

  printf("%d %s\n", num, str);

  fclose(fp);

  return 0;
}

mmap関数は、ファイルをメモリにマッピングする関数です。ファイル全体をメモリに読み込むため、fgets関数よりも高速に読み込むことができます。

#include <sys/mman.h>
#include <stdio.h>

int main() {
  int fd;
  char *p;
  size_t len;

  fd = open("test.txt", O_RDONLY);

  if (fd == -1) {
    printf("ファイルを開けません\n");
    return 1;
  }

  len = lseek(fd, 0, SEEK_END);

  p = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);

  if (p == MAP_FAILED) {
    printf("メモリマッピングに失敗しました\n");
    return 1;
  }

  // ファイルの内容を処理

  munmap(p, len);

  close(fd);

  return 0;
}

これらの方法は、それぞれ異なる利点と欠点があります。状況に合わせて適切な方法を選択する必要があります。

  • fread() — バイナリデータの読み取り - IBM (URL IBM)
  • fscanf() — 書式指定付き入力 - IBM (URL IBM)
  • mmap() — メモリへのファイルマッピング - IBM (URL IBM)



C言語とFortran:メモリ管理、処理速度、並列処理の比較

C言語とFortranには、多くの共通するキーワードがあります。以下に、いくつかの例を示します。制御構文: if else for while do endifelseforwhiledoendデータ型: integer real character logical



typeof_unqual の代替方法:型キャスト、マクロ、C++ の std::decay

C言語における typeof_unqual キーワードは、オペランドの型を 修飾子なしの型名 で取得するために使用されます。これは、型推論やジェネリックプログラミングなどの高度なプログラミング技法を可能にする強力なツールです。typeof_unqual の役割


C言語におけるスレッドストレージ期間:詳細リファレンス

C言語では、スレッドローカル変数のストレージ期間は、以下の2種類に分類されます。静的スレッドストレージ期間: 変数はプログラムの開始から終了まで存続します。自動スレッドストレージ期間: 変数は関数呼び出しの間のみ存続します。静的スレッドストレージ期間を持つ変数は、以下の特徴を持ちます。


マルチスレッドプログラミングにおけるメモリモデル:競合状態を防ぎ、共有メモリを安全に使用するための秘訣

C言語のメモリモデルは、以下の理由で重要です。プログラムの動作を予測可能にする: メモリモデルは、プログラムがメモリにアクセスし、データを書き込む方法を定義することで、プログラムの動作を予測可能にします。これは、マルチスレッドプログラムで競合状態を回避したり、共有メモリを安全に使用したりするのに役立ちます。


C言語 switch-case文の使い方:数値、文字列で複数条件分岐

1 変数switch文で評価する変数です。整数型、文字型、enum型など、様々な型が使用できます。2 case各条件を表します。caseの後に評価する値を記述します。3 処理各条件に合致した場合に実行される処理を記述します。複数の文を記述したい場合は、{ }で囲みます。



C言語における extern キーワードのサンプルコード

extern の役割:オブジェクトの宣言: extern は、オブジェクトの存在を宣言しますが、その定義は別のソースファイルで行います。スコープの制御: extern は、オブジェクトのスコープをファイル全体に拡張します。重複定義の防止: extern は、異なるソースファイルでオブジェクトを重複定義することを防ぎます。


wctype 以外の文字列処理方法:標準ライブラリ、正規表現、自作関数

wctypeの役割wctypeは、ワイド文字を特定のカテゴリに分類するためのハンドルを取得します。カテゴリには、以下のようなものがあります。英数字 (alnum)文字 (alpha)空白文字 (blank)制御文字 (cntrl)数字 (digit)


C言語で文字列を数値に! atoll 関数の使い方を徹底解説

atoll の使い方は非常に簡単です。以下のコード例のように、変換したい文字列を atoll 関数の引数として渡すだけです。このコード例では、文字列 "1234567890" を atoll 関数で変換し、結果を num 変数に格納しています。その後、printf 関数を使って num 変数の値を出力しています。


C言語 Numerics ライブラリの remquol 関数のサンプルコード

remquol関数は、以下の形式で呼び出します。numerator: 割られる数denominator: 割る数quotient: 商を格納するポインタこの関数は、以下の2つの値を返します。numerator / denominator: 商


C言語プログラマー必見!「towctrans」関数でロケール設定に基づいた大文字・小文字変換

機能概要:引数として渡されたワイド文字を、ロケール設定に基づいて対応する大文字または小文字に変換します。大文字から小文字、小文字から大文字、またはその他のケース変換を行うことができます。変換後の文字は、wchar_t 型の値として返されます。