C語(yǔ)言文件操作詳情(一)
前言:
文件操作重要嗎?
當(dāng)然重要:如果我們想讓自己的程序擁有記憶功能,那就需要把要記憶的信息和數(shù)據(jù)存入到一個(gè)外部文件里,以便下次提取。
一、文件是什么
磁盤(pán)上的文件是文件。但在程序設(shè)計(jì)中,我們一般談的文件有兩種:程序文件、數(shù)據(jù)文件
- 程序文件:包括源程序文件(后綴 .c),目標(biāo)文件(后綴 .obj)可執(zhí)行程序(windows環(huán)境后綴為 .exe)。
- 數(shù)據(jù)文件:文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件,或則輸出內(nèi)容的文件。
VS編譯器上所處理的數(shù)據(jù)的輸入和輸出都是以終端為對(duì)象的,即從終端的鍵盤(pán)上輸入輸入數(shù)據(jù),運(yùn)行結(jié)果顯示到顯示器上。但在有時(shí)候我們會(huì)把數(shù)據(jù)輸出到磁盤(pán)上,在需要的時(shí)候再?gòu)拇疟P(pán)上把數(shù)據(jù)讀取到內(nèi)存中使用,這里就是處理的磁盤(pán)上的文件。
文件包含三部分:文件路勁+文件名主干+文件后綴
例如:c:\code\test.txt
二、文件類(lèi)型
根據(jù)數(shù)據(jù)的組織形式數(shù)據(jù)文件被稱(chēng)為文本文件和二進(jìn)制文件
- ASCII文件也稱(chēng)為文本文件,這種文件在磁盤(pán)中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼
- 數(shù)據(jù)在內(nèi)存中以二進(jìn)制的形式存儲(chǔ),如果不加轉(zhuǎn)換的輸出到外層,就是二進(jìn)制文件
例如,數(shù)1000的存儲(chǔ)形式為:
ASCLL碼形式: 00110001 00110000 00110000 00110000 00110000 占5個(gè)字節(jié)
二進(jìn)制形式存儲(chǔ):00000000 00000000 00100111 00010000 占4個(gè)字節(jié)
三、文件緩沖區(qū)
我們?cè)趯W(xué)習(xí)C語(yǔ)言文件操作時(shí)我們也要簡(jiǎn)單的了解一下C語(yǔ)言的文件緩沖區(qū)概念:
- 緩沖區(qū)(
Buffer
)又稱(chēng)為緩存(Cache),是內(nèi)存空間的一部分。也就是說(shuō),計(jì)算機(jī)在內(nèi)存中預(yù)留了一定的存儲(chǔ)空間,用來(lái)暫時(shí)保存輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)(緩存)。 - 在程序數(shù)據(jù)區(qū)到磁盤(pán)之間有輸出緩沖區(qū)和輸入緩沖區(qū),這些有興趣的可以去深入了解一下
緩沖區(qū)是為了讓低速的輸入輸出設(shè)備和高速的用戶(hù)程序能夠協(xié)調(diào)工作,并降低輸入輸出設(shè)備的讀寫(xiě)次數(shù)。
四、文件指針
緩沖文件系中:關(guān)鍵的概念是“文件類(lèi)型指針”,簡(jiǎn)稱(chēng)**“文件指針”**
每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟了一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息(如:文件的名字,狀態(tài)及文件當(dāng)前的位置等)。這些信息保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體變量是有系統(tǒng)申明的取名:FILE
在使用的vs2013編譯器的頭文件stdio.h有以下的文件類(lèi)型聲名:
不同c編譯器的FILE所包含的內(nèi)容不完全相同,但是大同小異,
每當(dāng)打開(kāi)一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)構(gòu)的變量,并 填充其中的信息。
一般都是通過(guò)一個(gè)FILE的指針來(lái)維護(hù)這個(gè)結(jié)構(gòu)的變量。
FILE* pf;//文件指針變量
定義pf是一個(gè)指向FILE類(lèi)型數(shù)據(jù)的指針變量,可以使pf指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過(guò)該文件信息區(qū)中的信息就可以訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量能夠找到與它關(guān)聯(lián)的文件
五、文件的打開(kāi)和關(guān)閉
文件在讀寫(xiě)之前應(yīng)該先打開(kāi)文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件
編寫(xiě)程序時(shí),在打開(kāi)文件的同時(shí),都會(huì)返回一個(gè)FILE的指針變量指向該文件相當(dāng)于建立了指針與文件的關(guān)系。
- fopen 函數(shù)打開(kāi)文件,fclose 來(lái)關(guān)閉文件
FILE *fopen(const char *filename, const char *mode); int fclose(FILE *stream);
打開(kāi)文件一般有兩種方式:
- 當(dāng)前路勁下(相對(duì)路徑)打開(kāi)文件
- 絕對(duì)路徑打開(kāi)
//以讀的方式打開(kāi) //當(dāng)前路勁下(相對(duì)路徑)打開(kāi)文件test.txt fopen("test.txt", "r"); //絕對(duì)路徑打開(kāi) fopen("E:\\C++file\\file\\test.txt", "r");
打開(kāi)方式如下:
- “r”(只讀) 為輸入打開(kāi)一個(gè)已經(jīng)存在的文本文件
- “w”(只寫(xiě)) 為輸出打開(kāi)一個(gè)文本文件
- “a”(追加) 向文件文件尾添加數(shù)據(jù)
- “rb”(只讀) 為輸入打開(kāi)一個(gè)二進(jìn)制文件
- “wb”(只寫(xiě)) 為輸出打開(kāi)一個(gè)二進(jìn)制文件
- “r+”(讀寫(xiě)) 為讀寫(xiě)打開(kāi)一個(gè)文本文件
- “w+”(讀寫(xiě)) 為讀寫(xiě)建立一個(gè)新的文本文件
- “a+”(讀寫(xiě)) 為讀寫(xiě)打開(kāi)一個(gè)文本文件
- “rb+”(讀寫(xiě)) 為讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件
- “wb+”(讀寫(xiě)) 為讀寫(xiě)建立一個(gè)新的二進(jìn)制文件
- “ab+”(讀寫(xiě)) 為讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件
注意:
- 用 “r” 方式打開(kāi)的文件,不能向其輸入數(shù)據(jù),并且該文件已存在,否則出錯(cuò);
- 用 “w” 方式打開(kāi)的文件,只能向該文件輸入數(shù)據(jù),如果所打開(kāi)的文件不存在,則在打開(kāi)時(shí)新建一個(gè)以指定的名字命名的文件;如果指定文件存在,則在打開(kāi)時(shí)將該文件刪去,然后新建一個(gè)新的文件;
- 如果函數(shù) fopen 打開(kāi)文件出錯(cuò),則fopen返回一個(gè)空指針值 NULL;
- 在程序開(kāi)始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開(kāi)3個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出(stdout),標(biāo)準(zhǔn)出錯(cuò)輸 出(stderr)。如果要使用輸入輸出終端,則不需要打開(kāi),可以直接使用,如fputc(stdout,‘a’);向屏幕輸出字符a。
- 以讀的形式打開(kāi)文件文件必須存在
- 以寫(xiě)的形式打開(kāi)的文件,只能向該文件輸入數(shù)據(jù),如果所打開(kāi)的文件不存在,則在打開(kāi)時(shí)新建一個(gè)以指定的名字命名的文件;如果指定文件存在,則在打開(kāi)時(shí)將該文件刪去,然后新建一個(gè)新的文件;
到此這篇關(guān)于C語(yǔ)言文件操作詳情(一)的文章就介紹到這了,更多相關(guān)C語(yǔ)言文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言字母轉(zhuǎn)換大小寫(xiě)的3種方法圖文詳解
我們?cè)贑語(yǔ)言入門(mén)的時(shí)候都會(huì)遇到要求寫(xiě)大小寫(xiě)轉(zhuǎn)換的題目,所以下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字母轉(zhuǎn)換大小寫(xiě)的3種方法,文中給了詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問(wèn)題解析
這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問(wèn)題解析,本文通過(guò)案例來(lái)解析了C語(yǔ)言計(jì)算結(jié)構(gòu)體內(nèi)存的方式和方法,需要的朋友可以參考下2021-07-07C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法示例
這篇文章主要介紹了C++簡(jiǎn)單實(shí)現(xiàn)的全排列算法,結(jié)合實(shí)例形式分析了C++排序操作的實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07Qt自定義控件實(shí)現(xiàn)多彩色儀表盤(pán)
這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)多彩色儀表盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12