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)



Morrow County, Oregon, United States の天気予報: 曇り、華氏50度

用途typeof_unqual は、主に以下の用途で使用されます。型の情報を取得するマクロやテンプレートの定義型のエイリアスの作成型推論の補助構文typeof_unqual の構文は以下の通りです。ここで、expression は、型の情報が必要な式または名前です。



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

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


C言語プログラミング:forループを使いこなしてレベルアップ!

構文各要素の説明初期化式: ループ開始時に実行される式です。一般的に、ループカウンタ変数の初期化に使用されます。条件式: ループ継続の可否を判断する式です。式が真の場合、ループは継続されます。偽の場合、ループは終了します。処理内容: ループ内で繰り返し実行される処理です。


switch文を使いこなせばプログラミングも楽々!C言語の分岐処理をマスター

一般的に、if文の入れ子構造よりも簡潔で読みやすく、効率的な分岐処理を実現できます。解説switch (式): 式の値を評価します。式は整数型または文字列型である必要があります。case 値1:: 各分岐条件を示します。複数のcaseラベルを並べて記述できます。


C言語における評価順序とは?

C言語には、以下の 演算子グループ と 優先順位 が定められています。例この式の場合、* 演算子の優先順位が + 演算子よりも高いため、まず 20 * 3 が計算され、その結果 (60) が 10 と加算されます。シーケンスポイント は、式の評価順序が明確に定義されている箇所です。C言語には、以下の箇所がシーケンスポイントとなります。



アイレスプログラミングとは?C言語の数値処理を安全かつ効率的に行うための手法

アイレスプログラミングは、C言語の数値処理をより効率的に、より安全に行うためのプログラミング手法です。具体的には、以下の3つの柱を中心に構成されています。型安全性アイレスプログラミングでは、数値の型を厳密にチェックすることで、オーバーフローやアンダーフローなどのエラーを防ぎます。また、const 修飾子などを活用することで、意図しない値の変更を防ぎ、コードの信頼性を向上させます。


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

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


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

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


aligned_alloc の代替手段:malloc と posix_memalign の組み合わせ、およびハードウェア固有関数

aligned_alloc は C 言語で動的にメモリを割り当てる際に、特定のアライメント要件を満たすメモリブロックを割り当てるための関数です。これは、ハードウェアや特定のデータ構造の要件を満たす必要がある場合に役立ちます。aligned_alloc は、以下の 3 つの引数を取ります。


C言語プログラミング:wcsrtombs_s 関数を使いこなすための包括的ガイド

この関数は、以下の 3 つの引数を受け取ります。wcstr: ワイド文字列を含むポインタmbstr: マルチバイト文字列を格納するバッファへのポインタdstsz: マルチバイト文字列用バッファのサイズwcsrtombs_s 関数は、以下の処理を行います。