C++的File類檔案操作
語言檔案系統稱為流檔案(Stream),正文流(正文檔案),二進位制流(二進位制檔案)
緩衝與非緩衝檔案
順序操作檔案與隨機操作檔案
順序檔案:讀/寫第K個數據塊之前必須讀/寫第1至K-1個數據塊;
隨機檔案:可直接讀/寫第K個數據塊;
正文檔案的操作一般是順序檔案;
二進位制檔案的操作都是隨機檔案。
|
<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);