[c] _ c語言的數(shù)據(jù)文件操作

文件是程序設計的一個重要的概念,在C語言中,常常將處理數(shù)據(jù)的程序,和要處理的數(shù)據(jù)分離開來.提高程序的方便性和實用性.

  • 文件的基本概念:數(shù)據(jù)流,緩沖區(qū),文件類型,文件存取方式
  • 文件的打開和關閉: fopen,fclose
  • 文本文件讀寫操作: fgetc,fputc,fgets,fputs,fscanf,fprintf 函數(shù)
  • 二進制文件讀寫操作: fwrite,fread 函數(shù)
  • 文件的定位函數(shù): rewind,fseek,ftell 函數(shù)
  • 文件檢測函數(shù): feof,ferror,clearerr 函數(shù)

文件具有多樣性,存在磁盤的叫磁盤文件,計算機相連的設備是設備文件,存放數(shù)據(jù)的是數(shù)據(jù)文件.而已二進制存儲的是二進制文件,存放程序的是源文件.

數(shù)據(jù)文件指一組相關的有序集合.存儲在外部介質上,并用文件名作為其文件標志.在程序執(zhí)行期間,必須先調入內存.每次讀寫都需要讀取磁盤數(shù)據(jù)文件就非常費時,于是為了加速文件存取速率.系統(tǒng)使用緩沖區(qū)進行數(shù)據(jù)的暫存.從文件中讀寫變成從緩沖區(qū)中讀寫.

  • 二進制文件與ASCll碼文件

ASCll碼文件也就是文本文件,在計算機中以字節(jié)存儲,每個字符對應一個字節(jié).二進制文件,采用二進制編碼.
但在c系統(tǒng)中處理文件時,并不區(qū)分其類型.都看做字符流.按字節(jié)處理.

  • 緩存區(qū)是程序執(zhí)行時,系統(tǒng)提供的額外內存.用來存儲準備執(zhí)行的數(shù)據(jù).它的設置是為了提高存取效率.內存的存取比磁盤驅動器快多了.c語言標準i/o函數(shù)(包含在stdio,h中).系統(tǒng)會自動設置緩存區(qū).

文件的讀寫操作都是先對緩存區(qū)進行操作的,只有在關閉文件后才會寫入磁盤

  • 文件的存取方式主要分兩種;順序存取和隨機存取

  • 文件類型指針

在緩沖文件系統(tǒng)中,針對每個被使用的文件在內存中開辟一個區(qū)域,用來存放文件的有關信息(名字,文件狀態(tài),當前位置等).這些信息封裝在一個文件結構體類型中.每個文件的信息都保存在一個文件結構體指針變量中.

文件結構體是系統(tǒng)定義的,c語言規(guī)定該類型為FIILE類型.

typedef struct{

short level;  // 緩沖區(qū)滿或空的程度
unsigned flags; //文件狀態(tài)的標志
char fd; //文件描述符
unsigned char hold; // 如沒有緩沖區(qū)則不讀取文件
short bsize; // 緩沖區(qū)大小
unsigned char* buffer; // 數(shù)據(jù)緩沖區(qū)的位置
unsigned ar* curp; //指針,當前的指向
unsigned istemp; //臨時文件
short token; // 用于有效性檢查.
}

可以引用文件類型定義文件類型變量來實現(xiàn)對文件的操作.

  • 打開文件
FILE *fp;
fopen_s(&fp,"test.txt","w");
  • 關閉文件
fclose(fp);

文件的打開關閉需要配套使用.

文件的使用方式

r只讀(打開),r+讀寫(不存在返回空,讀寫從頭開始,寫時覆蓋).
w只寫(打開或建立文件,內容全部消失).w+讀寫(打開或新建,讀寫可以通過位置函數(shù)定義)
a追加數(shù)據(jù).(打開或新建),a+(讀寫,位置可以定義) 以上都對文本文件進行操作.
rb,rb+,wb,wb+,ab,ab+都是對二進制文件操作.


文件的讀寫

  • fgetc 逐字符讀取.fputc逐字符寫入:
// 逐字符讀取文件
void R_filechar(const char* ch){

    FILE* pfile;
    fopen_s(&pfile, ch, "r");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
        char cha = fgetc(pfile);
        while (cha != EOF) {
            putchar(cha);
            cha = fgetc(pfile);
        }
        fclose(pfile);
    }
}
  • fgets與fputs 逐字符串讀取函數(shù):
// 字符串讀取文件
void R_filestr(const char* ch) {
    char a[20];
    FILE* pfile;
    fopen_s(&pfile,ch,"r");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
        int i = 0;
        fgets(a,20,pfile);
        while (i<4)
        {
            printf("%s\n",a);
            fgets(a, 20, pfile);
            i++;
        }
        fclose(pfile);
    }
}
  • fwrite與fread函數(shù),以數(shù)據(jù)塊為單位的二進制文件讀取函數(shù).和格式化讀寫函數(shù):fscanf,fprintf:(比較常用的)
//數(shù)據(jù)塊寫入文件(struct)
void W_filestu(const char* ch,Student* pstu) {
    FILE* pfile;
    fopen_s(&pfile, ch, "wb+");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
         fwrite(pstu,sizeof(Student),2,pfile);
        // fprintf(pfile,"%s%d%d%s",pstu->name,pstu->num,pstu->age,pstu->addr);
        fclose(pfile);
    }
}
void R_filestu(const char* ch, Student* qstu) {
    FILE* pfile;
    fopen_s(&pfile, ch, "rb");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
         fread(qstu, sizeof(Student), 2, pfile);
        // fscanf(pfile, "%s\t%d\t%d\t%s",qstu->name,&qstu->num,&qstu->age,qstu->addr);
        for (int i = 0; i < 2; i++, qstu++)
        {
            printf("%s\t%d\t%d\t%s\n", qstu->name, qstu->num, qstu->age, qstu->addr);
        }
        fclose(pfile);
    }
}

當然,最常使用的還是fwrite,fread函數(shù),對結構體進行存取.


文件定位函數(shù)

  • rewind(文件指針): 返回當文件頭部.

  • fseek(文件指針,位移量,起始點), 位移量指的是以字節(jié)為單位.起始點表示從何處計算位移量:

起始點 表示符號 數(shù)字表示
文件首 SEEK_SET 0
當前位置 SEEK_SET 1
文件尾 SEEK_SET 2
  • ftell函數(shù),用來得到文件位置指針當前位置相對于文件首偏移的字節(jié)數(shù).通常配合fseek函數(shù).

文件檢測函數(shù)

  • feof()函數(shù). 用來檢測文件位置指針是否處于文件結束位置.通常用來做遍歷文件的判斷條件.是一個經(jīng)常使用到的函數(shù).到達返回true,否則返回false.

  • feeror(),讀寫文件是否出錯的檢測函數(shù),返回0表示未出錯,否則有錯.


2019.12.25
17:07

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末稽亏,一起剝皮案震驚了整個濱河市贺氓,隨后出現(xiàn)的幾起案子辽装,更是在濱河造成了極大的恐慌洋只,老刑警劉巖蹬铺,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件察纯,死亡現(xiàn)場離奇詭異闸拿,居然都是意外死亡,警方通過查閱死者的電腦和手機亩歹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門聘裁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悼瘾,“玉大人停士,你說我怎么就攤上這事迟隅。” “怎么了躲惰?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵致份,是天一觀的道長。 經(jīng)常有香客問我础拨,道長氮块,這世上最難降的妖魔是什么绍载? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滔蝉,結果婚禮上击儡,老公的妹妹穿的比我還像新娘。我一直安慰自己蝠引,他們只是感情好阳谍,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螃概,像睡著了一般矫夯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吊洼,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天训貌,我揣著相機與錄音,去河邊找鬼冒窍。 笑死递沪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的综液。 我是一名探鬼主播款慨,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼意乓!你這毒婦竟也來了樱调?” 一聲冷哼從身側響起约素,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤届良,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圣猎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體士葫,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年送悔,在試婚紗的時候發(fā)現(xiàn)自己被綠了慢显。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡欠啤,死狀恐怖荚藻,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洁段,我是刑警寧澤应狱,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站祠丝,受9級特大地震影響疾呻,放射性物質發(fā)生泄漏除嘹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一岸蜗、第九天 我趴在偏房一處隱蔽的房頂上張望尉咕。 院中可真熱鬧,春花似錦璃岳、人聲如沸年缎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦款。三九已至,卻和暖如春枚冗,著一層夾襖步出監(jiān)牢的瞬間缓溅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工赁温, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坛怪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓股囊,卻偏偏與公主長得像袜匿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稚疹,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • [轉]C/C++ 文件讀寫操作總結 在編程的過程中居灯,文件的操作是一個經(jīng)常用到的問題,在C++Builder中内狗,可以...
    天之道天知道閱讀 5,199評論 0 7
  • 第十三章 文件 一怪嫌,C文件概述 從用戶的角度看,文件可分為 普通文件 和 設備文件 柳沙;設備文件 為 顯示器岩灭、打印機...
    堅持到底v2閱讀 876評論 0 2
  • C/C++輸入輸出流總結 前兩天寫C++實習作業(yè),突然發(fā)現(xiàn)I/O是那么的陌生赂鲤,打了好長時間的文件都沒有打開噪径,今天終...
    LuckTime閱讀 1,731評論 0 6
  • 所謂“文件”是指一組相關數(shù)據(jù)的有序集合,該數(shù)據(jù)的集合的名字就是文件名数初。文件可以分為很多類找爱,如源程序文件、目標文件泡孩、...
    一葉之界閱讀 476評論 0 0
  • 歐美市場的榨汁機车摄,美國著名廚具品牌ERGO CHEF的my juicer。機子杯體采用Tritan塑料,不含BPA...
    莊艷閱讀 218評論 0 0