c语言采用文件存储数据,C语言读写文件大全 之 基础篇
一直想著把C語言和C++關(guān)于文件操作的相關(guān)內(nèi)容總結(jié)一下,這樣在使用的時候就可以順手拈來,嗯,這就是好記性不如爛筆頭。既然是文件操作,那么開篇就從“文件”的介紹開始。
1、文件
文件指存儲在外部介質(zhì)上的相關(guān)數(shù)據(jù)的集合。存放文件的外部介質(zhì)有磁帶、磁盤、光盤等外部存儲器。數(shù)據(jù)包括:數(shù)字、文字、圖形、圖象、聲音、視頻等。每個文件都有一個名字,叫做文件名。計算機操作系統(tǒng)就是根據(jù)文件名對各種文件進(jìn)行存取和處理的。
輸入輸出可以使屏幕等(標(biāo)準(zhǔn)輸出文件指針:stdout)為輸出設(shè)備,以鍵盤(標(biāo)準(zhǔn)輸入文件指針:stdin)為輸入設(shè)備。而程序運行有時需要把數(shù)據(jù)存放到磁盤中,從磁盤中輸入最后在輸出到磁盤上,這就要用到磁盤文件。文件的輸入輸出時是這里介紹的重點。
1.1文件的分類
(1)文件按存放設(shè)備可分為磁盤文件和設(shè)備文件兩種。
磁盤文件:存放在磁盤上的數(shù)據(jù)文件,包括硬盤和軟盤等等。
設(shè)備文件:操作系統(tǒng)與外部設(shè)備(例如,磁帶驅(qū)動器,磁盤驅(qū)動器,打印機,終端,modern)是通過一種被稱為設(shè)備文件的文件來進(jìn)行通信。UNIX輸入輸出到外部設(shè)備的方式和輸入輸出到一個文件的方式是相同的。在UNIX?同一個外部設(shè)備進(jìn)行通訊之前,這個設(shè)備必須首先要有一個設(shè)備文件存在。例如,每一個終端都有自己的設(shè)備文件來供UNIX寫數(shù)據(jù)(出現(xiàn)在終端屏幕上),和讀取數(shù)據(jù)(用戶通過鍵盤輸入)。
設(shè)備文件和普通文件不一樣,設(shè)備文件中并不包含任何數(shù)據(jù)。操作系統(tǒng)通過設(shè)備文件來與一個設(shè)備進(jìn)行通訊。設(shè)備文件存在于/dev目錄下。由于UNIX操作系統(tǒng)為你創(chuàng)建所有的設(shè)備文件,所以在你存取一個外部設(shè)備的時 候,你需要知道這個設(shè)備對應(yīng)的設(shè)備文件名。有時候你會需要自己創(chuàng)建一個設(shè)備文件。如果你永久地去掉一個外部設(shè)備,你應(yīng)該刪除它對應(yīng)的設(shè)備文件。
(2)文件按數(shù)據(jù)的組織形式又可分為ASCII碼文件(或稱文本文件)和二進(jìn)制文件兩種。
ASCII文件(或稱文本文件):ASCII碼文件可在屏幕上按字符顯示,此種存儲形式便于輸出顯示。以ASCII碼或者其他文字語言的交換編碼存儲的文件,可以直接在屏幕或者打印機輸出為人們識別的信息。ASCII文件在磁盤中存放時,每個字符對應(yīng)一個字節(jié),用于存放對應(yīng)的ASCII碼。如:整型十進(jìn)制數(shù)12345,按ASCII文件存放則需要占用5個字節(jié)。可在屏幕上顯示,但占用空間較大,讀寫操作要轉(zhuǎn)換。
ASCII碼文件特點:存儲量大、速度慢、便于對字符操作
二進(jìn)制文件:二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。二進(jìn)制文件中的數(shù)據(jù)與該數(shù)據(jù)的二進(jìn)制形式是一致的。即對不同的數(shù)據(jù)類型,按其實際占用內(nèi)存字節(jié)數(shù)存放,與其在內(nèi)存的存儲形式相同,原樣輸出到磁盤上存放。如:整型十進(jìn)制數(shù)12345,按二進(jìn)制文件存放只需要2個字節(jié)。屏幕顯示為亂碼,但占用空間小,讀寫操作效率高。
二進(jìn)制文件特點:存儲量小、速度快、適于存放中間結(jié)果。
不同的文件格式文件的存儲方式是不同的,我們都應(yīng)該注意加以區(qū)分,因為無論是通常的使用還是編程都是至關(guān)重要的,例如:
*.C?? ??? C語言的源程序??? ASCII碼文件
*.OBJ ?? 目標(biāo)文件????????????? 二進(jìn)制文件
*.EXE ?? 可執(zhí)行文件?????????? 二進(jìn)制文件
(3) 按讀寫方式文件可分為順序文件和隨機文件。
對順序文件來說,讀寫必須從頭開始。對隨機文件來說,讀寫的過程是隨機的。
2、C語言文件操作
要了解Linux C文件的處理方式首先要了解流(Stream)的概念。C語言把文件看作是一個字符(字節(jié))的序列,即由一個一個的字符或字節(jié)的數(shù)據(jù)順序組成。換句話說,C語言是把每一個文件都看作是一個有序的字節(jié)流。
流是文件和程序之間的通道。一個C程序可以創(chuàng)建文件和對文件內(nèi)容進(jìn)行更新、修改,在程序中所需的數(shù)據(jù)也可以從另一個文件中獲得。
流是程序輸入或輸出的一個連續(xù)的數(shù)據(jù)序列,常用設(shè)備(如鍵盤、顯示器和打印機等)的輸入/輸出都是通過流來處理的。在C語言中,所有的流均以文件的形式出現(xiàn),包括設(shè)備文件。流實際上是文件輸入/輸出的一種動態(tài)形式,C文件就是一個字節(jié)流或二進(jìn)制流。流作為連續(xù)數(shù)據(jù)序列不是由記錄組成的。C文件輸入/輸出的字節(jié)流或二進(jìn)制流僅受程序控制而不受物理符號(如回車換行符)控制。也就是說,文件輸入/輸出時不會考慮記錄的界限,這種文件通常可以稱為流文件。
C中有兩種處理文件的方法:一種是“緩沖文件系統(tǒng)”;另一種是“非緩沖文件系統(tǒng)”。 ??????? 緩沖文件系統(tǒng)又稱為標(biāo)準(zhǔn)文件系統(tǒng)或高層文件系統(tǒng),它與具體機器無關(guān),通用性好,功能強,使用方便。系統(tǒng)自動地在內(nèi)存區(qū)為每個正在使用的文件開辟一個緩沖區(qū),文件的存取都是通過緩沖區(qū)進(jìn)行的。緩沖區(qū)相當(dāng)于一個中轉(zhuǎn)站,它的大小由具體的C版本規(guī)定,一般為512字節(jié)。當(dāng)從內(nèi)存向磁盤輸出數(shù)據(jù)時,先將數(shù)據(jù)送到內(nèi)存緩沖區(qū),待緩沖區(qū)裝滿后,再一起送到磁盤文件保存;當(dāng)從磁盤文件讀入數(shù)據(jù)時,則一次從磁盤文件中將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)。如圖所示。
非緩沖文件系統(tǒng)又稱為低層文件系統(tǒng)與機器有關(guān),使用較為困難但節(jié)省內(nèi)存,執(zhí)行效率較高。系統(tǒng)不自動開辟一個內(nèi)存緩沖區(qū),而由用戶根據(jù)所處理數(shù)據(jù)量的大小在程序中設(shè)置數(shù)據(jù)緩沖區(qū)。
緩沖文件系統(tǒng)原來用于處理文本文件,而非緩沖文件系統(tǒng)原來用于處理二進(jìn)制文件。ANSI C不再采用非緩沖文件系統(tǒng),而只采用緩沖文件系統(tǒng),在處理二進(jìn)制文件時,也通過緩沖文件系統(tǒng)進(jìn)行。ANSI C通過擴充緩沖文件系統(tǒng),使緩沖文件系統(tǒng)既能處理文本文件,又能處理二進(jìn)制文件。但是我們在學(xué)習(xí)Linux C編程時不僅要重點學(xué)習(xí)ANSIC標(biāo)準(zhǔn)的文件處理方法,同樣要學(xué)習(xí)Linux系統(tǒng)自身所有所有的文件與設(shè)備處理方法。因為非緩沖I/O是系統(tǒng)直接的輸入和輸出,它不經(jīng)過“緩沖區(qū)”,所以從速度和效率方面來說就顯得快一些了。在某些要求效率的特定情況下我們可能需要這一特性。
通常我們所操作的都是緩沖文件,因此本文章僅針對緩沖文件進(jìn)行闡述。
3、文件類型指針和文件描述符
在緩沖文件系統(tǒng)(高級I/O系統(tǒng))通過文件指針訪問文件,而非緩沖文件系統(tǒng) (低級磁盤I/O系統(tǒng))則沒有文件型指針,不是靠文件指針來訪問文件,而是用一個整數(shù)代表一個文件(相當(dāng)于 FORTRAN 等語言的 “文件號” ),這個整數(shù)稱為“文件說明符”。下面我們將分別學(xué)習(xí)文件指針與文件說明符的概念及使用方法。
文件類型指針
文件類型指針是相對于緩沖文件系統(tǒng)的概念。在緩沖文件系統(tǒng)中,系統(tǒng)為每個被使用的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件名、文件狀態(tài)、緩沖區(qū)狀態(tài)及文件當(dāng)前位置等信息,這些信息被C語言系統(tǒng)保存在一個稱作FILE的結(jié)構(gòu)體中,它在stdio.h頭文件中定義內(nèi)。FILE結(jié)構(gòu)體的內(nèi)容為(在使用文件操作時,一般不用關(guān)心FILE內(nèi)部成員信息):
typedef struct
{
shortlevel;? ?????????????????????? ????/*緩沖區(qū)“滿”或者“空”的程度*/
unsignedflags;? ???????????????? ????/*文件狀態(tài)標(biāo)志*/
charfd;? ??????????????????????????? ????/*文件描述符*/
unsignedchar hold;? ?????????? ????/*如果無緩沖區(qū)則不讀取字符*/
shortbsize;? ?????????????????????? ????/*緩沖區(qū)的大小*/
unsignedchar*buffer;? ??????? ????/*數(shù)據(jù)緩沖區(qū)的位置*/
unsignedchar*curp;? ????????? ????/*指針,當(dāng)前的指向*/
unsignedistemp;? ?????????????? ????/*臨時文件指示器*/
shorttoken;? ????????????????????? ????/*用于有效性檢查*/
}? FILE;
對于每一個要操作的文件,都必須定義一個指針變量,并使它指向該文件結(jié)構(gòu)體變量,這個指針稱為文件指針。通過文件指針找到被操作文件的描述信息,就可對它所指的文件進(jìn)行各種操作。定義文件指針的一般形式為:
FILE* 指針變量標(biāo)識符;
如:FILE? *fp;? 表示fp是一個指向FILE類型結(jié)構(gòu)體的指針變量。可以使fp指向某一個文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。
FILE是用typedef聲明的文件信息結(jié)構(gòu)體的別名,由C系統(tǒng)定義,用戶只能使用,不能修改,并且FILE必須大寫。
對文件的操作一般步驟包括:聲明一個文件指針、通過文件名打開文件、為文件指針賦值、通過文件指針對文件進(jìn)行存取、通過文件指針關(guān)閉文件。
*注:本文章部分內(nèi)容來自《Linux C程序設(shè)計基礎(chǔ)》,轉(zhuǎn)載請注明出處。
阿科
2012年9月18日于北京郵電大學(xué)學(xué)八樓629
總結(jié)
以上是生活随笔為你收集整理的c语言采用文件存储数据,C语言读写文件大全 之 基础篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟服务器声卡,怎么在Win7系统Hyp
- 下一篇: 农村产权交易服务平台二次开发html源码