記事ディレクトリ
1 はじめに
前回の記事では、動的メモリ開発の関連知識を学び、動的メモリ機能を使用してアドレス帳を最適化しましたが、アドレス帳にはまだ改善の余地があります。連絡先を常に保存できる 個人情報は、終了後に消去されるのではなく、実際にアドレス帳を保存する必要があります。
次に、ファイルと C 言語を使用してファイルを操作する方法を紹介します。
2.ファイル操作
2.1 ファイルとは
ディスク上のファイルはファイルです。しかし、プログラム設計では、通常、プログラム ファイル、データ ファイルの 2 種類のファイルについて説明します。
プログラム ファイル: ソース プログラム ファイル (接尾辞 .c)、オブジェクト ファイル (Windows 環境接尾辞。環境接尾辞は .exe) を含みます。
データファイル: ファイルの内容は必ずしもプログラムではなく、プログラムがデータを読み取る必要があるファイルや、内容を出力するファイルなど、プログラムの実行時に読み書きされるデータです。
ファイル名は、ファイル パス + ファイル名トランク + ファイル サフィックスの 3 つの部分で構成されます。
例: c:\code\test.txt
この記事は、主にデータ ファイルに関するものです。
これまでは、データ処理の入出力はすべて端末ベース、つまり端末のキーボードからデータを入力し、実行結果をモニターに表示するというものでした。実際、アドレス帳を保存するなどの情報をディスクに出力し、必要に応じてディスクからメモリにデータを読み込んで使用することもあり、ここでディスク上のファイルが処理されます。
2.2 ファイルバッファ
The ANSIC standard uses the "buffer file system" to process data files. いわゆるバッファー ファイル システムとは、プログラムで使用される各ファイルに対して、システムがメモリ内に "ファイル バッファー" を自動的に作成することを意味します。
メモリからディスクへのデータ出力は、最初にメモリ内のバッファに送信され、バッファがいっぱいになった後にまとめてディスクに送信されます。
ディスクからコンピュータにデータを読み込む場合、ディスク ファイルから読み込んだデータをメモリ バッファに入力し(バッファがいっぱい)、バッファからプログラム データ領域(プログラム変数など)にデータを送信します。 。) 一つずつ。バッファーのサイズは、C コンパイル システムによって決定されます。
2.3 ファイルポインタ
キャッシュファイルシステムでは、キーとなる概念は「ファイルポインタ」と呼ばれる「ファイルタイプポインタ」です。
使用された各ファイルは、メモリ内に対応するファイル情報領域を開き、ファイルの関連情報 (ファイルの名前、ファイルの状態、ファイルの現在の場所など) を格納するために使用されます。 )。
この情報は構造体変数に格納されます。構造体型はシステムによって宣言され、FILE という名前は通常、FILE ポインターを介して維持され、この FILE 構造体の
変数 FILE* pf を維持します。pfは、FILE 型データを指すポインター変数として定義します。pf は、あるファイルのファイル情報領域を指すようにすることができます(構造体変数です)。ファイルは、ファイル情報領域の情報を介してアクセスできます。つまり、それに関連付けられているファイルは、ファイル ポインター変数を介して見つけることができます。
2.4 ファイルのオープンとクローズ
ファイルは読み書きする前に開き、使用後に閉じる必要があります。
開く:
FILE* fopen(const char* filename, const char* mode); モードは開く方法です 閉じる
:
int fclose(FILE* stream);
ファイルを開く方法はたくさんあります。ここでは、参考のために 1 つずつリストします。
文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 出错
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件
使用例:
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
int ch = 0;
fputc('w', pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
2.5 ファイルの順次読み書き
文字入力関数 - fgetc - すべての入力ストリーム
文字出力関数 - fputc -
すべての出力ストリーム テキスト行入力関数
- fgets - すべての入力ストリーム テキスト行出力関数 - fputs - すべての出力ストリーム フォーマット
入力関数 - fscanf - すべての入力ストリームフォーマット
出力関数- fprintf - すべての出力ストリーム
バイナリ入力 - fread - ファイル
バイナリ出力 - fwrite - ファイル
3. アドレス帳を最適化する
すべての人にファイル操作を導入した後、ファイル操作を使用してアドレス帳を最適化し、終了するたびにアドレス帳をディスク上のファイルに保存し、再起動するたびに保存できるようにします.ファイルはアドレス帳に読み込まれ、すべての連絡先を直接印刷できます。
3.1 アドレス帳の保存
ファイル操作を使用して、アドレス帳の連絡先の情報を txt ファイルに保存します。
void SaveContact(const contact* pc)
{
FILE* pf = fopen("contact.dat", "w");
if (pf == NULL)
{
perror("fopen");
return;
}
int i = 0;
for (i = 0; i < pc->count; i++)
{
fprintf(pf, "%s %s %d %s %s", pc->date->name, pc->date->sex, pc->date->age, pc->date->tele, pc->date->address);
}
fclose(pf);
pf = NULL;
}
3.2 アドレス帳の読み込み
プログラムに入るたびに連絡先情報をファイルに自動的にロードする必要があるため、この関数はアドレス帳を初期化する関数内に配置できます。
void LoadContact(contact* pc)
{
FILE* pf = fopen("contact.dat", "r");
if (pf == NULL)
{
perror("fopen");
return;
}
people tmp = {
0};
while (fread(&tmp, sizeof(people), 1, pf))
{
CheckCapacity(pc);
pc->date[pc->count] = tmp;
pc->count++;
}
fclose(pf);
pf = NULL;
}
このようにして、連絡先の情報をディスク上のアドレス帳に永続的に保存することができ、以前に保存した情報をいつでも直接印刷することができます。
4.エンディング
この記事の時点で、アドレス帳管理システムを実装するための C 言語の使用は完全に最適化されています. 主な目的は、この小さなプログラムを通じてさまざまな知識を学び、独自のコードを最適化することです. アイデアは最も重要なことです. ありがとうございました.お待ちいただきありがとうございます. 読んでください, ご不明な点がございましたら, コメント欄にメッセージを残すか、ブロガーに個人的な手紙を送ることができます. ブロガーが良い友達を書いたと思われる場合, あなたはそれを3回サポートすることができます, ありがとうあなた。