1. 程式人生 > >C++的File類檔案操作

C++的File類檔案操作

語言檔案系統稱為流檔案(Stream),正文流(正文檔案),二進位制流(二進位制檔案)

緩衝與非緩衝檔案
順序操作檔案與隨機操作檔案
順序檔案:讀/寫第K個數據塊之前必須讀/寫第1至K-1個數據塊;
隨機檔案:可直接讀/寫第K個數據塊;
正文檔案的操作一般是順序檔案;
二進位制檔案的操作都是隨機檔案。


一、檔案操作的一般過程
定義檔案指標 FILE *
開啟檔案 fopen
對檔案進行讀寫  

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

二、系統已定義的與檔案操作有關的資料結構全都在stdio.h中

FILE 結構體

   FILE *fr,*fp,*fw;

FILE* 指標作為檔案控制代碼,是檔案訪問的唯一標識,它由fopen函式建立,fopen開啟檔案成功,則返回一個有效的FILE*指標,否則返回空指標NULL


標準檔案指標

   FILE *stdin,*stdout,*stderr,
   stdin 指鍵盤輸入
   stdout 指顯示器
   stderr 指出錯輸出裝置,也指顯示器

這些變數已成功初始化,可直接使用.
三、常用操作函式

fopen

格式:FILE *fopen(檔名字串,開啟方式串)

例:FILE *fr; fr=fopen("c://user//abc.txt","r");

字串操作:

1)"r"或"rt":正文檔案只讀方式開啟。檔案不存在,則開啟失敗(順序讀)"w"或"wt":正文檔案只寫方式開啟。若檔案不存在,則建立檔案;若檔案存在,則刪除檔案內容,重建空檔案(順序寫);(擷取檔案長度為0)

2) "a"或"at":正文檔案新增方式。檔案不存在,則建立檔案(順序新增寫)

3) "r+"或"rt++":正文檔案讀寫開啟,檔案不存在,則開啟失敗(順序讀/寫、隨機讀/寫,含改寫與新增);

4) "w+"或"w++":正文檔案讀寫方式開啟,檔案不存在,則建立檔案;否則擷取檔案長度為0(順序讀/寫,隨機讀/寫,對寫入的內容可以讀或改寫或新增)

5) ~b:正文檔案→二進位制檔案
  順序讀→順序/隨機讀(“rb”)

  eg:"r"或"rt"→"rb"
   順序寫("wb")
   順序新增寫("ab")
   順...,隨...,含...("rb+")
   順...,新增("wb+")
   順...,新增("ab+")

使用fopen時,但凡含r字母的開啟方式,一定要加判斷,檔案是否開啟成功,否則程式不會報告錯誤,會執行下去。

如:FILE *fr;
fr=fopen("abc.txt","r");
if(fr==NULL){
printf("File not open!/n");
return; /*或exit(1);*/


檔案關閉

fclose(FILE *fp)

一般地,fclose(fp)與fopen應配對使用,特別是含有寫方式的檔案,若不關閉會造成檔案資料丟失。

fcloseall(void):關閉當前所有開啟的檔案。


單位元組的輸入函式

可適用於二進位制與正文檔案操作
int fgetc(FILE *fp)
   int fputc(char ch.FILE *fp)

fgetc的返回值都是正數(0~255)

檔案無可讀位元組則返回-1(EOF)

正文檔案與二進位制檔案讀寫的區別:
正文檔案讀到13 10時,將自動跳過13,讀出10並返回;正文檔案寫入10時,首先自動寫入13再寫入10.


檔案指標與檔案指標操作函式

檔案指標是檔案作業系統資料結構內部的一種資料指標,它用於標註檔案當前讀寫位置,C語言中,檔案指標以位元組為單位,檔案第一個位元組位置號為0,若檔案長度為N個位元組,則最後一個位元組的位置號為N-1,長度為N位元組的檔案有效讀寫範圍為0~N-1。指標位置在此之外進行讀/寫操作,則失敗;讀寫函式返回-1(EOF);

C語言的檔案指標採用long型值;

執行檔案讀/寫操作後,檔案指標自動向後移動,指到新的待讀/寫位置。

檔案指標移動函式
rewind(FILE *fp)
檔案指標重置為0
fseek(FILE *fp,long off,int pos)
   從pos位置開始,移動off個位元組。

pos: 0 檔案開始
      1 檔案當前指標位置
      2 檔案結尾(檔案長度為N,則指標位置為N)

例:fseek(fp,0l,0);←→rewind(fp)
fseek(fp,-1L,2); /*移動指標到最後一個位元組*/
fseek(fp,-2L,1); /*移動指標到當前位置的前兩個位置*/
long ftell(FILE *fp)

求當前指標位置

例:求檔案長度
fseek(fp,OL,2);
len=ftell(fp);
則len為檔案長度

檔案指標的特性:

可在“負無窮”到“正無窮”任意移動;
在0~N-1之外進行讀操作,則讀失敗;讀失敗後,feof函式為真;
從N位置開始寫入,則為新增;
從0~N位置之外開始寫也可,其行為不必掌握,因為幾乎無用;
無論任何方式,剛開啟檔案時,ftell函式返回值都是0,含a方式的檔案,只要一寫(第一次寫),檔案指標自動移動到N位置處。
int feof(FILE *fp)
若檔案讀失敗,則返回非0值,否則返回0值;僅用於讀是否到檔案尾。
任何fseek操作使feof為假,即使檔案指標在0~N-1之外。
正文檔案讀/寫函式
fscanf(fp...)
   fprintf(fp...)

其中,...與scanf和printf用法完全相同.
scanf(...)←→fscanf(stdin...)
printf(...)←→fprintf(stdout...)


二進位制檔案讀/寫函式,即位元組塊函式
int fread(char *buf,int size,int count,FILE *fp)
   int fwrite(char *buf,int&nbtp;size,int count,FILE *fp)
從檔案讀出size x count個位元組到記憶體塊buf;從記憶體塊buf寫入size x count個位元組到檔案,返回實際讀出/寫入的位元組數。

一、檔案中刪除第K個記錄:拷貝0~K-1,K+1~N條記錄到一個臨時檔案,刪除原始檔,將原始檔改名為原始檔。

二、讀/改寫第K個記錄:移動指標到第K個記錄,用fread,fwrite改寫。

三、新增記錄(略)

四、插入記錄

複製臨時檔案
插入到K號記錄之前:先將N-1寫入N位置,N-2寫入N-1,直到K寫入K+1位置:用待插入記錄改寫K位置。(建立時用rb+方式開啟)
#include "tdio.h"
void main()
{FILE *fp;char ch1,ch2;long pos1,pos2,p;
char fname[81];
printf("Input C source filename:");
gets(fname);
fp=fopen(fname,"r+");
if(!fp){printf("FILE not found ./n); return;
ch1=fgetc(fp);
while(!feof(fp))
{cha2=fgetc(fp);if(feof(fp)) break;
if(ch1=='/'&&ch2=='*')
{pos1=ftell(fp)-2;
}
if(ch1=='*'&&ch=='/')
{pos2=ftell(fp)-1;
fseek(fp,pos1,0);
for(p=pos1;p<=pos2;p++) fputc(32,fp);
fseek(fp,OL,1);
}
ch1=ch2;
}
fclose(fp);