コンテンツ
ファイルを使用する理由
先ほど書いた名簿ですが、人数を足してプログラムを終了するとデータが消えます。このとき、データはメモリに保存されます。次にアドレス帳プログラムを実行するときに、データを再入力する必要があります。このようなアドレス帳を使用するのは非常に不快です。
そのため、ファイル操作が始まりました。
データを永続化するには、次の2つの方法があります。1。データをディスクファイルに保存する2.データベースに
保存するファイルを使用して、データをコンピューターのハードディスクに直接保存できるため、データの永続性を実現できます。
ファイルとは
しかし、プログラミングでは、一般的に、プログラムファイルとデータファイル(ファイル関数の観点から分類された)の2種類のファイルについて話します。
プログラムファイル:ソースプログラムファイル(.cが付加されている)、オブジェクトファイル(Windows環境では.objが付加されている)、および実行可能プログラム(Windows環境では.exeが付加されている)が含まれます。
データファイル:ファイルの内容は必ずしもプログラムではありませんが、プログラムがデータを読み取る必要のあるファイルや、内容が出力されるファイルなど、プログラムの実行時に読み書きされるデータです。
前章で処理したデータの入出力はすべて端末をベースにしています。つまり、端末のキーボードからデータを入力し、操作結果をディスプレイに表示します。
実際、ディスクに情報を出力し、必要に応じてディスクからメモリにデータを読み込んで使用する場合があります。ディスク上のファイルはここで処理されます。
ファイル名
ファイルには、ユーザーの識別と参照のために一意のファイル識別子が必要です。
ファイル名は、ファイルパス+ファイル名トランク+ファイルサフィックスの3つの部分で構成されます
。例:c:\ code \ test.txt
便宜上、ファイル識別子はファイル名と呼ばれることがよくあります。
ファイルに関するいくつかの概念
ファイルポインタ:バッファファイルシステムでは、重要な概念は文件类型指针
「ファイルポインタ」と呼ばれる「」です。
ファイル情報領域:使用される各ファイルには、メモリ内に対応するファイル情報領域があり、ファイルの関連情報(ファイルの名前、ファイルのステータス、ファイルの現在の場所など)を格納するために使用されます。等。)。この情報は構造変数に格納されます。構造タイプは体系的に宣言され、FILEという名前が付けられます。
VS2013コンパイル環境で提供されるstdio.hヘッダーファイルには、次のファイルタイプ宣言があります。
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
ファイルが開かれるたびに、システムはファイルの状況に応じてFILE構造の変数を自動的に作成し、情報を入力します。ユーザーは詳細を気にする必要はありません。
FILEポインター:通常、FILE構造体の変数は、より便利なFILEポインターを介して維持されます。
次に、FILE*のポインタ変数を作成できます。
FILE* pf;//文件指针变量
pfを、タイプFILEのデータへのポインター変数として定義します。pfがファイルのファイル情報領域を指すようにすることができます(これは構造変数です)。ファイルには、ファイル情報領域の情報からアクセスできます。つまり、それに関連付けられているファイルは、ファイルポインタ変数を介して見つけることができます
規定:ファイルは読み書きの前に開く必要があり、ファイルは使用終了後に閉じる必要があります。
プログラムを作成するとき、ファイルを開くとき、ファイルを指すFILE *ポインター変数を返します。これは、ポインターとファイルの間の関係を確立することにも相当します。
ANSICは、fopen関数を使用してファイルを開き、fcloseを使用してファイルを閉じることを規定しています。
まず、読み取りと書き込みの意味を理解します。
ファイルの書き込み:メモリ内のデータをファイルまたは画面に出力します。
ファイルの読み取り:ファイルまたはキーボードデータをメモリに入力します。
ファイル機能
fopen
関数プロトタイプ:
FILE *fopen( const char *filename, const char *mode );
関数:
ファイル
を開くこの関数の関数はファイルを開くことです。関数の最初のパラメーターは開きたいファイルのファイル名であり、2番目のパラメーターはファイルを開く形式です。
戻り値:これらの各関数は、開いているファイルへのポインタを返します。nullポインタ値は、エラーを示します。
ファイルへのポインタを返します。開いているエラーが発生した場合は、nullポインタを返します。
注:fopenの戻り値の有効性を確認する必要があります
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return;//失败返回
}
fclose
関数プロトタイプ:
int fclose( FILE *stream );
関数
ストリームを閉じます(fclose)。
ストリームを閉じます
戻り値
fcloseは、ストリームが正常に閉じられた場合は0を返します。EOFを返し、エラーを示します。ストリームが正常に閉じられた場合は0を返し
、失敗した場合はEOF(-1)を返します。
サンプルコード
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;//失败返回
}
絶対パス
絶対パスは、特定のファイルの場所です。
例えば:
D:\ c-language \ c yuyan \ c yuyan \ data.txt
FILE* pf = fopen("D:\\c-language\\c yuyan\\c yuyan\data.txt", "r");
ただし、文字列内の「\」以降の文字が全体としてエスケープ文字と見なされないようにするには、各「\」の後に「\」を追加する必要があります。
ファイルを開く方法
最初の3つは一般的に使用される方法です。
ルール:
ファイルを開く方法 | 意味 |
---|---|
「r」(読み取り専用) | 入力用にファイルを開きます。存在しない場合は、エラーが報告されます。 |
「w」(書き込み専用) | データを出力するには、テキストファイルを開きます。存在する場合は、その中のデータをクリアして出力します。存在しない場合は、新しいファイルが作成されます。 |
「a」(追加) | テキストファイルの最後にデータを追加します。ファイルが存在しない場合は作成します。 |
「rb」(読み取り専用) | データを入力するには、バイナリファイルを開きます。存在しない場合はエラーになります。 |
「wb」(書き込みのみ) | データを出力するには、バイナリファイルを開きます。存在しない場合は、新しいファイルを作成します。 |
“ab”(追加) | バイナリファイルの最後にデータを追加します。存在しない場合はエラーになります。 |
「r+」(読み取りおよび書き込み) | 更新用のファイルを開きます(入力と出力)。存在しない場合はエラー。 |
「w+」(読み取りおよび書き込み) | 空のファイルを作成し、更新用に開きます(入力と出力)。同じ名前のファイルがすでに存在する場合、その内容は破棄され、ファイルは新しい空のファイルとして扱われます。 |
「a+」(読み取りおよび書き込み) | ファイルの最後で読み取りと書き込みのためにファイルを開きます。存在しない場合は、新しいファイルを作成します。 |
ファイル操作プロセス
以下は、ファイル操作の一般的なフローです。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
//打开文件
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//对文件进行一系列操作
......
.....
//关闭文件
fclose(pf);
pf = NULL;置空
return 0;
}