私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
🌟🌟著者ホームページ:一時的なもの__
🌟🌟所属欄:C言語
プログラムを作成するとき、多くの場合、データを変数に格納します。プログラムが終了してメモリが再利用されると、これらのデータは失われます。それでは、このデータを永続的に保存して、プログラムを再度開いたときにデータがまだ存在するようにする方法はあるのでしょうか?答えは「はい」です。これでできることは次のとおりです。ファイル操作。
プログラムのデータは外部機器に出力する必要があり、また、外部機器からデータを入力する必要があります。デバイスが異なれば、入力方法と出力方法も異なります。さまざまな入出力デバイスでの操作を容易にするために、「ストリーム」という非常に抽象的な概念があります。 C言語では、ファイルや画面、キーボードなどの入出力操作はすべて「ストリーム」を通じて行われます。一般に、データの書き込みまたは読み取りを行う場合は、ストリームを開く必要があります。
C 言語プログラムを起動すると、デフォルトで次のようになります。3つの流れすでにオープンしています:
標準入力--標準入力ストリーム。ほとんどの場合、キーボードから入力します。
標準出力-- 標準出力ストリーム。ほとんどの場合、モニターに出力されます。
標準エラー出力-- 標準エラー ストリーム。ほとんどの場合、モニターに出力されます。
これら 3 つのストリームはデフォルトで開かれているため、scanf や printf などの関数を使用して入出力操作を直接実行できます。
これら 3 つのストリームには次のタイプもあります。ファイルポインタ(FILE*) 。ファイル操作を実行するときに、ファイル ポインター変数は、それに関連付けられているファイルを間接的に見つけることができます。。
データの編成方法に応じて、データ ファイルは次のように呼ばれます。テキストファイルまたはバイナリーファイル 。 データはバイナリ形式でメモリに保存されます。変換せずに外部記憶ファイルに出力した場合は、バイナリーファイル。
外部ストレージに ASCII コードで保存する必要がある場合は、保存前に変換する必要があります。ASCII 文字の形式で保存されたファイルは、テキストファイル。
データはどのようにファイルに保存されるのでしょうか?
文字は常に ASCII 形式で保存され、数値データは ASCII 形式またはバイナリ形式で保存できます。たとえば、整数 10000 がある場合、ASCII コード形式でディスクに出力すると、ディスク上で 5 バイト (1 文字につき 1 バイト) を占有しますが、バイナリ形式で出力すると、ディスク上で 5 バイトを占有します。ディスク上で占有するのは 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 関数の場合、そのパラメーターはファイル ポインターであり、ファイル ポインターが指すファイルを閉じるために使用されます。
次に、ファイルを開いて閉じてみます。
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");
- if (pf == NULL)//文件打开失败则退出程序
- {
- perror("fopen");
- return 0;
- }
- printf("文件打开成功n");
- fclose(pf);
- pf = NULL;//避免出现野指针,及时制空
- return 0;
- }
開くメソッドが「w」であるため、「test.txt」という名前のファイルがパスに表示されることがわかります。
次に、いくつかの機能を紹介します。ファイルへのデータの読み取りまたは書き込み。
関数名 | 関数 | 適用対象 |
fgetc | 文字入力機能 | すべての入力ストリーム |
fputc | 文字出力機能 | すべての出力ストリーム |
取得する | テキスト行入力機能 | すべての入力ストリーム |
出力 | テキスト行出力機能 | すべての出力ストリーム |
fscanf | フォーマット入力機能 | すべての入力ストリーム |
fprintf | フォーマット出力機能 | すべての出力ストリーム |
読む | バイナリ入力 | ファイル入力ストリーム |
書き込み | バイナリ出力 | ファイル出力ストリーム |
次に使ってみますfscanfそしてfprintf関数:
これら 2 つの関数の最初のパラメーターはファイル ポインターで、ファイル データの読み取りと書き込みに使用されます。後続のパラメータは、scanf 関数および printf 関数と同じです。
- #include <stdio.h>
-
- int main()
- {
- FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fprintf(pf, "123456");//向文件中写入数据
- fclose(pf);
- pf = NULL;
- return 0;
- }
ご覧のとおり、データがファイルに書き込まれています。次に、 fscanf 関数を使用してファイル データを画面に出力します。
- #include <stdio.h>
-
- int main()
- {
- char str[20] = { 0 };
- FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
- if (pf == NULL)
- {
- perror("fopen");
- return 0;
- }
- fscanf(pf, "%s", str);//读取数据到str当中
- printf(str);
- fclose(pf);
- pf = NULL;
- return 0;
- }
fseek関数の機能は、ファイル ポインタの位置とオフセットに基づく位置ファイルポインタ 。そのプロトタイプは次のとおりです。
int fseek ( FILE * ストリーム、 long int オフセット、 int origin );
最初のパラメータはファイル ポインタ、2 番目のパラメータは設定位置を基準としたオフセット、3 番目のパラメータは設定位置です。
C言語では次の3つが定義されています。大きい、これらの 1 つを 3 番目のパラメータとして選択できます。
SEEK_SET: ファイルの開始位置
SEEK_CUR: ファイルポインタの現在位置
SEEK_END: ファイルの終わり
ファイル ポインタを見つけたら、ファイルの指定された場所で読み取りまたは書き込みを行うことができます。
ftell 関数を使用して返す開始位置を基準としたファイル ポインタのオフセット 。関数プロトタイプ:
long int ftell ( FILE * ストリーム );
巻き戻し機能が使用されるのは、ファイルポインタの位置をファイルの先頭に戻します 。その関数プロトタイプ:
void rewind ( FILE * ストリーム );
1. のためにテキストファイル、最初に使用できますfgetcこの関数は、EOF が読み取られるまでファイル内の文字をループします。ファイル読み込み終了。
2. のためにバイナリーファイル、を使用しております読む関数は戻り値を決定します。実際に読み込む数値よりも小さいのでしょうか? 。未満の場合読書が終わります。
上記 2 つの場合、ファイル読み終わりに、引き続き判断できますファイル読み込みが終了した理由 。 2 つの関数を紹介します。フェオフそして恐怖。
フェオフに使用される関数ファイル読み取りの終了を判断する理由かどうかファイルの終わりに遭遇しました 。そのプロトタイプは次のとおりです。
int feof ( FILE * ストリーム );
ファイルの原因が次の場合ファイルの終わりまで読み取る読み出しが完了した場合は EOF を返し、それ以外の場合は 0 を返します。
恐怖に使用される関数ファイル読み取りの終了を判断する理由かどうかI/Oエラーが発生しました 。プロトタイプは次のとおりです。
int ferror ( FILE * ストリーム );
ファイルの原因が次の場合I/Oエラーが発生しました読み取りが完了した場合は 0 以外の値が返され、それ以外の場合は 0 が返されます。
次に、ファイル読み取りの終了を判断するコードを記述してみます。
- #include <stdio.h>
-
- int main()
- {
- int c = 0;
- FILE* fp = fopen("test.txt", "r");
- if (fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
- {
- putchar(c);
- }
- //判断读取结束的原因
- if (ferror(fp))
- puts("I/O错误n");
- else if (feof(fp))
- puts("文件读取结束n");
- fclose(fp);
- fp = NULL;
- return 0;
- }
今日は、ファイルの操作、ファイルの開閉、ファイルへのデータの書き込みまたは読み取りの方法、ファイルポインタを調整する関数、ファイルの読み取り終了を判断する関数について学びました。ブロガーの発言が良いと思ったら、小さな「いいね!」を残して、サポートに感謝してください❤❤❤