技術共有

【C言語】ファイル操作で遊ぶ

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🌟🌟著者ホームページ:一時的なもの__

🌟🌟所属欄:C言語

目次

導入

1. ファイルの開閉

1. 流れ

2. 標準フロー

3. テキストファイルとバイナリファイル

4. ファイルのオープンとクローズを制御する関数

2. ファイルのシーケンシャルな読み取りと書き込み

3. ファイルのランダムな読み取りと書き込み

1.fseek関数

2.ftell関数

3.巻き戻し機能

4. ファイル読み込み終了の判定

要約する


導入

プログラムを作成するとき、多くの場合、データを変数に格納します。プログラムが終了してメモリが再利用されると、これらのデータは失われます。それでは、このデータを永続的に保存して、プログラムを再度開いたときにデータがまだ存在するようにする方法はあるのでしょうか?答えは「はい」です。これでできることは次のとおりです。ファイル操作

1. ファイルの開閉

1. 流れ

プログラムのデータは外部機器に出力する必要があり、また、外部機器からデータを入力する必要があります。デバイスが異なれば、入力方法と出力方法も異なります。さまざまな入出力デバイスでの操作を容易にするために、「ストリーム」という非常に抽象的な概念があります。 C言語では、ファイルや画面、キーボードなどの入出力操作はすべて「ストリーム」を通じて行われます。一般に、データの書き込みまたは読み取りを行う場合は、ストリームを開く必要があります。

2. 標準フロー

C 言語プログラムを起動すると、デフォルトで次のようになります。3つの流れすでにオープンしています:

標準入力--標準入力ストリーム。ほとんどの場合、キーボードから入力します。

標準出力-- 標準出力ストリーム。ほとんどの場合、モニターに出力されます。

標準エラー出力-- 標準エラー ストリーム。ほとんどの場合、モニターに出力されます。

これら 3 つのストリームはデフォルトで開かれているため、scanf や printf などの関数を使用して入出力操作を直接実行できます。

これら 3 つのストリームには次のタイプもあります。ファイルポインタ(FILE*) 。ファイル操作を実行するときに、ファイル ポインター変数は、それに関連付けられているファイルを間接的に見つけることができます。

3. テキストファイルとバイナリファイル

データの編成方法に応じて、データ ファイルは次のように呼ばれます。テキストファイルまたはバイナリーファイル 。 データはバイナリ形式でメモリに保存されます。変換せずに外部記憶ファイルに出力した場合は、バイナリーファイル
外部ストレージに ASCII コードで保存する必要がある場合は、保存前に変換する必要があります。ASCII 文字の形式で保存されたファイルは、テキストファイル
データはどのようにファイルに保存されるのでしょうか?
文字は常に ASCII 形式で保存され、数値データは ASCII 形式またはバイナリ形式で保存できます。たとえば、整数 10000 がある場合、ASCII コード形式でディスクに出力すると、ディスク上で 5 バイト (1 文字につき 1 バイト) を占有しますが、バイナリ形式で出力すると、ディスク上で 5 バイトを占有します。ディスク上で占有するのは 4 バイトだけです。

4. ファイルのオープンとクローズを制御する関数

この前提知識を理解したら、ファイルを開いたり閉じたりするという本題に進みましょう。 C 言語には、ファイルを開くおよび閉じる役割を担う 2 つの関数が用意されています。プロトタイプは次のとおりです。

ファイルを開きます:
ファイル * 開く ( const char * ファイル名、 const char * モード );
ファイルを閉じます。
整数 閉じる ( FILE * ストリーム );

fopen 関数には 2 つのパラメータがあります。最初のパラメータは文字列形式で表現されます。ファイル名、2番目のパラメータはファイルですオープンメソッド、文字列で表される 。この関数を使用するときは、ファイルポインタ変数受信時、ファイルを開くことができなかった場合はヌルポインタを返します。開封方法については、以下のとおりです。

オープンメソッド意味指定したファイルが存在しない場合
「r」(読み取り専用)
データを入力するには、既存のテキスト ファイルを開きます
NULLポインタを返します
「w」(書き込みのみ)
データを出力するには、テキスト ファイルを開きます
新しいファイルを作成する
「a」(追加)テキストファイルの末尾にデータを追加します新しいファイルを作成する
「rb」(読み取り専用)データを入力するには、バイナリ ファイルを開きますNULLポインタを返します
「wb」(書き込みのみ)データを出力するには、バイナリ ファイルを開きます新しいファイルを作成する
「ab」(追加)バイナリファイルの末尾にデータを追加する新しいファイルを作成する
「r+」(読み取りおよび書き込み)読み取りと書き込みの場合は、テキスト ファイルを開きますNULLポインタを返します
「w+」(読み取りおよび書き込み)読み取りと書き込みの場合は、新しいテキスト ファイルを作成します新しいファイルを作成する
「a+」(読み取りおよび書き込み)ファイルを開き、ファイルの最後で読み取りと書き込みを行う新しいファイルを作成する
「rb+」(読み取りおよび書き込み)バイナリ ファイルを読み書き用に開きます。NULLポインタを返します
「wb+」(読み取りおよび書き込み)
読み取りと書き込みの場合は、新しいバイナリ ファイルを作成します新しいファイルを作成する
「ab+」(読み取りおよび書き込み)
バイナリ ファイルを開き、ファイルの最後で読み取りと書き込みを行う新しいファイルを作成する

fclose 関数の場合、そのパラメーターはファイル ポインターであり、ファイル ポインターが指すファイルを閉じるために使用されます。

次に、ファイルを開いて閉じてみます。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");
  5. if (pf == NULL)//文件打开失败则退出程序
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. printf("文件打开成功n");
  11. fclose(pf);
  12. pf = NULL;//避免出现野指针,及时制空
  13. return 0;
  14. }
操作結果:

開くメソッドが「w」であるため、「test.txt」という名前のファイルがパスに表示されることがわかります。

2. ファイルのシーケンシャルな読み取りと書き込み

次に、いくつかの機能を紹介します。ファイルへのデータの読み取りまたは書き込み

関数名関数適用対象
fgetc文字入力機能すべての入力ストリーム
fputc文字出力機能すべての出力ストリーム
取得するテキスト行入力機能すべての入力ストリーム
出力テキスト行出力機能すべての出力ストリーム
fscanfフォーマット入力機能すべての入力ストリーム
fprintfフォーマット出力機能 すべての出力ストリーム
読むバイナリ入力ファイル入力ストリーム
書き込みバイナリ出力ファイル出力ストリーム

次に使ってみますfscanfそしてfprintf関数:

これら 2 つの関数の最初のパラメーターはファイル ポインターで、ファイル データの読み取りと書き込みに使用されます。後続のパラメータは、scanf 関数および printf 関数と同じです。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
  5. if (pf == NULL)
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. fprintf(pf, "123456");//向文件中写入数据
  11. fclose(pf);
  12. pf = NULL;
  13. return 0;
  14. }

ご覧のとおり、データがファイルに書き込まれています。次に、 fscanf 関数を使用してファイル データを画面に出力します。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[20] = { 0 };
  5. FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
  6. if (pf == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. fscanf(pf, "%s", str);//读取数据到str当中
  12. printf(str);
  13. fclose(pf);
  14. pf = NULL;
  15. return 0;
  16. }
操作結果:

3. ファイルのランダムな読み取りと書き込み

1.fseek関数

fseek関数の機能は、ファイル ポインタの位置とオフセットに基づく位置ファイルポインタ 。そのプロトタイプは次のとおりです。

int fseek ( FILE * ストリーム、 long int オフセット、 int origin );

最初のパラメータはファイル ポインタ、2 番目のパラメータは設定位置を基準としたオフセット、3 番目のパラメータは設定位置です。

C言語では次の3つが定義されています。大きい、これらの 1 つを 3 番目のパラメータとして選択できます。

SEEK_SET: ファイルの開始位置

SEEK_CUR: ファイルポインタの現在位置

SEEK_END: ファイルの終わり

ファイル ポインタを見つけたら、ファイルの指定された場所で読み取りまたは書き込みを行うことができます。

2.ftell関数

ftell 関数を使用して返す開始位置を基準としたファイル ポインタのオフセット 。関数プロトタイプ:

long int ftell ( FILE * ストリーム );

3.巻き戻し機能

巻き戻し機能が使用されるのは、ファイルポインタの位置をファイルの先頭に戻します 。その関数プロトタイプ:

void rewind ( FILE * ストリーム );

4. ファイル読み込み終了の判定

1. のためにテキストファイル、最初に使用できますfgetcこの関数は、EOF が読み取られるまでファイル内の文字をループします。ファイル読み込み終了

2. のためにバイナリーファイル、を使用しております読む関数は戻り値を決定します。実際に読み込む数値よりも小さいのでしょうか? 。未満の場合読書が終わります。

上記 2 つの場合、ファイル読み終わりに、引き続き判断できますファイル読み込みが終了した理由 。 2 つの関数を紹介します。フェオフそして恐怖

フェオフに使用される関数ファイル読み取りの終了を判断する理由かどうかファイルの終わりに遭遇しました 。そのプロトタイプは次のとおりです。

int feof ( FILE * ストリーム );

ファイルの原因が次の場合ファイルの終わりまで読み取る読み出しが完了した場合は EOF を返し、それ以外の場合は 0 を返します。

        恐怖に使用される関数ファイル読み取りの終了を判断する理由かどうかI/Oエラーが発生しました 。プロトタイプは次のとおりです。

int ferror ( FILE * ストリーム );

ファイルの原因が次の場合I/Oエラーが発生しました読み取りが完了した場合は 0 以外の値が返され、それ以外の場合は 0 が返されます。

次に、ファイル読み取りの終了を判断するコードを記述してみます。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int c = 0;
  5. FILE* fp = fopen("test.txt", "r");
  6. if (fp == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
  12. {
  13. putchar(c);
  14. }
  15. //判断读取结束的原因
  16. if (ferror(fp))
  17. puts("I/O错误n");
  18. else if (feof(fp))
  19. puts("文件读取结束n");
  20. fclose(fp);
  21. fp = NULL;
  22. return 0;
  23. }

要約する

今日は、ファイルの操作、ファイルの開閉、ファイルへのデータの書き込みまたは読み取りの方法、ファイルポインタを調整する関数、ファイルの読み取り終了を判断する関数について学びました。ブロガーの発言が良いと思ったら、小さな「いいね!」を残して、サポートに感謝してください❤❤❤