1. 前言
上一篇文章我們學(xué)習(xí)了動態(tài)內(nèi)存開辟的相關(guān)知識點,并用動態(tài)內(nèi)存函數(shù)優(yōu)化了我們的通訊錄,但通訊錄還有需要改進(jìn)的地方,比如,正常情況下的通訊錄,應(yīng)該可以一直保存聯(lián)系人信息,而不是退出就清空了,這就需要我們實實在在的保存下來一個通訊錄。
接下來我會給大家介紹文件以及如何用C語言來操作文件。
2. 文件操作
2.1 什么是文件
磁盤上的文件是文件。但是在程序設(shè)計中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件
程序文件:包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
數(shù)據(jù)文件:文件的內(nèi)容不一定是程序,而是程序運(yùn)行時讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如:c:\code\test.txt
本文主要討論的是數(shù)據(jù)文件。
以前我們處理數(shù)據(jù)的輸入輸出都是以終端為對象的,即從終端的鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果顯示到顯示器上。其實有時候我們會把信息輸出到磁盤上,就比如通訊錄的保存,當(dāng)需要的時候再從磁盤上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤上的文件。
2.2 文件緩沖區(qū)
ANSIC 標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動地在內(nèi)存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區(qū)”。
從內(nèi)存向磁盤輸出數(shù)據(jù)會先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤上。
如果從磁盤向計算機(jī)讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根據(jù)C編譯系統(tǒng)決定的。
2.3 文件指針
緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”。
每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。
這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE
一般都是通過一個FILE的指針來維護(hù)這個FILE結(jié)構(gòu)的變量
FILE* pf;
定義pf是一個指向FILE類型數(shù)據(jù)的指針變量??梢允筽f指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。
通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件。
2.4 文件的打開與關(guān)閉
文件在讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。
打開:
FILE* fopen(const char* filename, const char* mode); mode是打開方式
關(guān)閉:
int fclose(FILE* stream);
文件的打開方式有很多種,這里我給大家一一列舉出來供大家參考使用:
文件使用方式 含義 如果指定文件不存在
“r”(只讀) 為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件 出錯
“w”(只寫) 為了輸出數(shù)據(jù),打開一個文本文件 建立一個新的文件
“a”(追加) 向文本文件尾添加數(shù)據(jù) 出錯
“rb”(只讀) 為了輸入數(shù)據(jù),打開一個二進(jìn)制文件 出錯
“wb”(只寫) 為了輸出數(shù)據(jù),打開一個二進(jìn)制文件 建立一個新的文件
“ab”(追加) 向一個二進(jìn)制文件尾添加數(shù)據(jù) 出錯
“r+”(讀寫) 為了讀和寫,打開一個文本文件 出錯
“w+”(讀寫) 為了讀和寫,建議一個新的文件 建立一個新的文件
“a+”(讀寫) 打開一個文件,在文件尾進(jìn)行讀寫 建立一個新的文件
“rb+”(讀寫) 為了讀和寫打開一個二進(jìn)制文件 出錯
“wb+”(讀寫) 為了讀和寫,新建一個新的二進(jìn)制文件 建立一個新的文件
“ab+”(讀寫) 打開一個二進(jìn)制文件,在文件尾進(jìn)行讀和寫 建立一個新的文件
舉例使用:
int main()
{
//打開文件
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//寫文件
int ch = 0;
fputc('w', pf);
//關(guān)閉文件
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);
}
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
2.5 文件的順序讀寫
字符輸入函數(shù) – fgetc – 所有輸入流
字符輸出函數(shù) – fputc – 所有輸出流
文本行輸入函數(shù) – fgets – 所有輸入流
文本行輸出函數(shù) – fputs – 所有輸出流
格式化輸入函數(shù) – fscanf – 所有輸入流
格式化輸出函數(shù) – fprintf – 所有輸出流
二進(jìn)制輸入 – fread – 文件
二進(jìn)制輸出 – fwrite – 文件
3. 優(yōu)化通訊錄
在為大家介紹完文件操作以后,我們就可以來利用文件操作來優(yōu)化我們的通訊錄,使通訊錄在每次退出都可以保存到磁盤上的一個文件里,而且每次重新啟動的時候都會把這個文件再加載進(jìn)通訊錄中,讓我們可以直接打印出所有聯(lián)系人。
3.1 保存通訊錄
利用文件操作來把通訊錄里聯(lián)系人的信息保存在一個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 加載通訊錄
我們需要每次進(jìn)入程序的時候都自動加載好文件中的聯(lián)系人信息,所以這個函數(shù)可以放在初始化通訊錄函數(shù)的內(nèi)部。
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;
}
這樣我們就可以永久的保存通訊錄里聯(lián)系人的信息在磁盤上,什么時候打開都能直接打印之前保存好的信息。文章來源:http://www.zghlxwxcb.cn/news/detail-403411.html
4. 結(jié)尾
到本文章為止,使用C語言實現(xiàn)通訊錄管理系統(tǒng)已經(jīng)完成全部優(yōu)化,主要目的是通過這個小程序來學(xué)習(xí)各種知識,并優(yōu)化自己的代碼,思路才是重中之重,非常感謝大家的耐心閱讀,如有問題可以評論區(qū)留言或者私信博主,覺得博主寫的不錯的朋友,可以三連支持一下,感謝各位。文章來源地址http://www.zghlxwxcb.cn/news/detail-403411.html
到了這里,關(guān)于文件操作介紹及C語言實現(xiàn)通訊錄管理系統(tǒng)3.0最終版(文件操作版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!