C語言由淺入深講解文件的操作上篇
為什么使用文件
前面寫的通訊錄,增加人數(shù)退出程序后,數(shù)據(jù)就會消失。此時數(shù)據(jù)是存放在內(nèi)存中,下次運行通訊錄程序的時候,數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就很難受。
所以文件操作就應(yīng)運而生。數(shù)據(jù)持久化的方法有兩種:1.把數(shù)據(jù)存放在磁盤文件2.存放到數(shù)據(jù)庫使用文件我們們可以將數(shù)據(jù)直接存放在電腦的硬盤上,做到了數(shù)據(jù)的持久化。
什么是文件
但是在程序設(shè)計中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件(從文件功能的角度來分類的)。
程序文件:包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
數(shù)據(jù)文件:文件的內(nèi)容不一定是程序,而是程序運行時讀寫的數(shù)據(jù),比如程序運行需要從中讀取數(shù)據(jù)的文件,或者輸出內(nèi)容的文件。
在以前各章所處理數(shù)據(jù)的輸入輸出都是以終端為對象的,即從終端的鍵盤輸入數(shù)據(jù),運行結(jié)果顯示到顯示器上。
其實有時候我們會把信息輸出到磁盤上,當(dāng)需要的時候再從磁盤上把數(shù)據(jù)讀取到內(nèi)存中使用,這里處理的就是磁盤上文件。
文件名
一個文件要有一個唯一的文件標(biāo)識,以便用戶識別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:\code\test.txt
為了方便起見,文件標(biāo)識常被稱為文件名。
關(guān)于文件的一些概念
文件指針:緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”。
文件信息區(qū):每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名FILE.
VS2013編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型申明;
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
每當(dāng)打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。
FILE指針:一般都是通過一個FILE的指針來維護這個FILE結(jié)構(gòu)的變量,這樣使用起來更加方便。
下面我們可以創(chuàng)建一個FILE*的指針變量:
FILE* pf;//文件指針變量
定義pf是一個指向FILE類型數(shù)據(jù)的指針變量??梢允筽f指向某個文件的文件信息區(qū)(是一個結(jié)構(gòu)體變量)。通過該文件信息區(qū)中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關(guān)聯(lián)的文件

規(guī)定:文件在讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。
在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當(dāng)于建立了指針和文件的關(guān)系。
ANSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件
首先理解 讀和寫 是什么意思。
寫文件:將內(nèi)存的數(shù)據(jù) 輸出 到文件或屏幕上。
讀文件:將文件或鍵盤的數(shù)據(jù) 輸入 到內(nèi)存中。

文件函數(shù)
fopen
函數(shù)原型:
FILE *fopen( const char *filename, const char *mode );
函數(shù)功能:Open a file.
該函數(shù)的功能就是打開一個文件,函數(shù)的第一個參數(shù)是你要打開的文件的文件名,第二個參數(shù)是打開這個文件的形式。
返回值:Each of these functions returns a pointer to the open file. A null pointer value indicates an error.
返回一個指向文件的指針,如果打開錯誤返回空指針。
注意:需要檢查fopen返回值的有效性
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return;//失敗返回
}
fclose
函數(shù)原型:
int fclose( FILE *stream );
函數(shù)功能
Closes a stream (fclose) .
關(guān)閉一個流
返回值:fclose returns 0 if the stream is successfully closed.return EOF to indicate an errorreturn 0
如果流成功關(guān)閉,返回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");
但是為了防止字符串中的’\‘及其后面的字符被整體視為為轉(zhuǎn)義字符,所以需要在每個’\‘后面再加一個’\’。
文件的打開方式
前三個是常用的方式。
規(guī)則:
| 文件打開方式 | 含義 |
|---|---|
| “r” (只讀) | 打開文件進行輸入操作。如不存在將會報錯。 |
| “w” (只寫) | 為了輸出數(shù)據(jù),打開一個文本文件。如存在,則清空里面的數(shù)據(jù)并輸出。如不存在將建立一個新的文件。 |
| “a” (追加) | 向文本文件尾添加數(shù)據(jù)。如果文件不存在,則創(chuàng)建該文件。 |
| “rb”(只讀) | 為了輸入數(shù)據(jù),打開一個二進制文件。如不存在,則出錯。 |
| “wb”(只寫) | 為了輸出數(shù)據(jù),打開一個二進制文件。如不存在,則建一個新文件。 |
| “ab”(追加) | 向一個二進制文件尾添加數(shù)據(jù)。如不存在,則出錯。 |
| “r+”(讀寫) | 打開一個文件進行更新(輸入和輸出)。如不存在則出錯。 |
| “w+”(讀寫) | 建一個空文件并打開它以進行更新(輸入和輸出)。如果同名文件已經(jīng)存在,則將丟棄其內(nèi)容,并且該文件將被視為新的空文件。 |
| “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;
}
//對文件進行一系列操作
......
.....
//關(guān)閉文件
fclose(pf);
pf = NULL;置空
return 0;
}到此這篇關(guān)于C語言由淺入深講解文件的操作上篇的文章就介紹到這了,更多相關(guān)C語言 文件操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++報錯 XX does not name a type;
這篇文章主要給大家介紹了C++報錯 XX does not name a type;field `XX’ has incomplete type解決方案,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2023-08-08
QT實現(xiàn)將兩個時間相加的算法[hh:?mm?+?hh:?mm]的示例代碼
本文主要介紹了QT實現(xiàn)將兩個時間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C語言數(shù)據(jù)結(jié)構(gòu)之隊列算法詳解
這篇文章介紹了C語言數(shù)據(jù)結(jié)構(gòu)之隊列的算法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
C++利用MySQL API連接和操作數(shù)據(jù)庫實例詳解
這篇文章主要介紹了C++利用MySQL API連接和操作數(shù)據(jù)庫實例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01

