第一篇:C++ builder 的文件讀寫操作總結(jié)(模版)
C++ builder 的文件讀寫操作總結(jié)
在編程的過程中,文件的操作是一個(gè)經(jīng)常用到的問題,在C++Builder中,可以使用多種方法對文件操作,下面我就按以下幾個(gè)部分對此作詳細(xì)介紹,就是:
1、基于C的文件操作;
2、基于C++的文件操作;
3、基于WINAPI的文件操作;
4、基于BCB庫的文件操作;
5、特殊文件的操作。
壹、基于C的文件操作
在ANSI C中,對文件的操作分為兩種方式,即流式文件操作和I/O文件操作,下面就分別介紹之。
一、流式文件操作
這種方式的文件操作有一個(gè)重要的結(jié)構(gòu)FILE,F(xiàn)ILE在stdio.h中定義如下:
typedef struct { int level;/* fill/empty level of buffer */ unsigned flags;/* File status flags */ char fd;/* File descriptor */ unsigned char hold;/* Ungetc char if no buffer */ int bsize;/* Buffer size */ unsigned char _FAR *buffer;/* Data transfer buffer */ unsigned char _FAR *curp;/* Current active pointer */ unsigned istemp;/* Temporary file indicator */ short token;/* Used for validity checking */ } FILE;/* This is the FILE object */
FILE這個(gè)結(jié)構(gòu)包含了文件操作的基本屬性,對文件的操作都要通過這個(gè)結(jié)構(gòu)的指針來進(jìn)行,此種文件操作常用的函數(shù)見下表函數(shù)功能
fopen()打開流
fclose()關(guān)閉流
fputc()寫一個(gè)字符到流中
fgetc()從流中讀一個(gè)字符
fseek()在流中定位到指定的字符
fputs()寫字符串到流
fgets()從流中讀一行或指定個(gè)字符
fprintf()按格式輸出到流
fscanf()從流中按格式讀取
feof()到達(dá)文件尾時(shí)返回真值
ferror()發(fā)生錯(cuò)誤時(shí)返回其值
rewind()復(fù)位文件定位器到文件開始處
remove()刪除文件 fread()從流中讀指定個(gè)數(shù)的字符
fwrite()向流中寫指定個(gè)數(shù)的字符
tmpfile()生成一個(gè)臨時(shí)文件流
tmpnam()生成一個(gè)唯一的文件名
下面就介紹一下這些函數(shù)
1.fopen()
fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen實(shí)現(xiàn)三個(gè)功能
為使用而打開一個(gè)流
把一個(gè)文件和此流相連接
給此流返回一個(gè)FILR指針
參數(shù)filename指向要打開的文件名,mode表示打開狀態(tài)的字符串,其取值如下表
字符串含義
“r” 以只讀方式打開文件
“w” 以只寫方式打開文件
“a” 以追加方式打開文件
“r+” 以讀/寫方式打開文件,如無文件出錯(cuò)
“w+” 以讀/寫方式打開文件,如無文件生成新文件
一個(gè)文件可以以文本模式或二進(jìn)制模式打開,這兩種的區(qū)別是:在文本模式中回車被當(dāng)成一個(gè)字符'n',而二進(jìn)制模式認(rèn)為它是兩個(gè)字符0x0D,0x0A;如果在文件中讀到0x1B,文本模式會認(rèn)為這是文件結(jié)束符,也就是二進(jìn)制模型不會對文件進(jìn)行處理,而文本方式會按一定的方式對數(shù)據(jù)作相應(yīng)的轉(zhuǎn)換。
系統(tǒng)默認(rèn)的是以文本模式打開,可以修改全部變量_fmode的值來修改這個(gè)設(shè)置,例如_fmode=O_TEXT;就設(shè)置默認(rèn)打開方式為文本模式;而_fmode=O_BINARY;則設(shè)置默認(rèn)打開方式是二進(jìn)制模式。
我們也可以在模式字符串中指定打開的模式,如“rb”表示以二進(jìn)制模式打開只讀文件,“w+t”或“wt+”表示以文本模式打開讀/寫文件。
此函數(shù)返回一個(gè)FILE指針,所以申明一個(gè)FILE指針后不用初始化,而是用fopen()來返回一個(gè)指針并與一個(gè)特定的文件相連,如果成敗,返回NULL。
例:
FILE *fp;
if(fp=fopen(“123.456”,“wb”))
puts(“打開文件成功”);
else
puts(“打開文件成敗”);
2.fclose()
fclose()的功能就是關(guān)閉用fopen()打開的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失敗返回EOF。
在程序結(jié)束時(shí)一定要記得關(guān)閉打開的文件,不然可能會造成數(shù)據(jù)丟失的情況,我以前就經(jīng)常犯這樣的毛病。
例:fclose(fp);3.fputc()
向流寫一個(gè)字符,原型是int fputc(int c, FILE *stream);成功返回這個(gè)字符,失敗返回EOF。
例:fputc('X',fp);
4.fgetc()
從流中讀一個(gè)字符,原型是int fputc(FILE *stream);成功返回這個(gè)字符,失敗返回EOF。
例:char ch1=fgetc(fp);
5.fseek()
此函數(shù)一般用于二進(jìn)制模式打開的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,參數(shù)offset是移動(dòng)的字符數(shù),whence是移動(dòng)的基準(zhǔn),取值是
符號常量值基準(zhǔn)位置
SEEK_SET 0 文件開頭
SEEK_CUR 1 當(dāng)前讀寫的位置
SEEK_END 2 文件尾部
例:fseek(fp,1234L,SEEK_CUR);//把讀寫位置從當(dāng)前位置向后移動(dòng)1234字節(jié)(L后綴表示長整數(shù))
fseek(fp,0L,2);//把讀寫位置移動(dòng)到文件尾
6.fputs()
寫一個(gè)字符串到流中,原型int fputs(const char *s, FILE *stream);
例:fputs(“I Love You”,fp);
7.fgets()
從流中讀一行或指定個(gè)字符,原型是char *fgets(char *s, int n, FILE *stream);從流中讀取n-1個(gè)字符,除非讀完一行,參數(shù)s是來接收字符串,如果成功則返回s的指針,否則返回NULL。
例:如果一個(gè)文件的當(dāng)前位置的文本如下
Love ,I Have
But ……..如果用
fgets(str1,4,file1);
則執(zhí)行后str1=“Lov”,讀取了4-1=3個(gè)字符,而如果用
fgets(str1,23,file1);
則執(zhí)行str=“Love ,I Have”,讀取了一行(不包括行尾的'n')。
8.fprintf()
按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ?]);其用法和printf()相同,不過不是寫到控制臺,而是寫到流罷了
例:fprintf(fp,“%2d%s”,4,“Hahaha”);
9.fscanf()
從流中按格式讀取,其原型是int fscanf(FILE *stream, const char *format[, address, ?]);其用法和scanf()相同,不過不是從控制臺讀取,而是從流讀取罷了。
例:fscanf(fp,“%d%d” ,&x,&y);
10.feof()
檢測是否已到文件尾,是返回真,否則返回0,其原型是int feof(FILE *stream);
例:if(feof(fp))printf(“已到文件尾”);
11.ferror()
原型是int ferror(FILE *stream);返回流最近的錯(cuò)誤代碼,可用clearerr()來清除它,clearerr()的原型是void clearerr(FILE *stream);
例:printf(“%d”,ferror(fp));
12.rewind()
把當(dāng)前的讀寫位置回到文件開始,原型是void rewind(FILE *stream);其實(shí)本函數(shù)相當(dāng)于fseek(fp,0L,SEEK_SET);
例:rewind(fp);
12.remove()
刪除文件,原型是int remove(const char *filename);參數(shù)就是要?jiǎng)h除的文件名,成功返回0。
例:remove(“c:io.sys”);
13.fread()
從流中讀指定個(gè)數(shù)的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);參數(shù)ptr是保存讀取的數(shù)據(jù),void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的字節(jié)數(shù);n是讀取的塊數(shù),如果成功,返回實(shí)際讀取的塊數(shù)(不是字節(jié)數(shù)),本函數(shù)一般用于二進(jìn)制模式打開的文件中。
例:
char x[4230];
FILE *file1=fopen(“c:msdos.sys”,“r”);
fread(x,200,12 ,file1);//共讀取200*12=2400個(gè)字節(jié)
14.fwrite()
與fread對應(yīng),向流中寫指定的數(shù)據(jù),原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);參數(shù)ptr是要寫入的數(shù)據(jù)指針,void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的字節(jié)數(shù);n是要寫的塊數(shù),如果成功,返回實(shí)際寫入的塊數(shù)(不是字節(jié)數(shù)),本函數(shù)一般用于二進(jìn)制模式打開的文件中。
例:
char x[]=“I Love You”;
fwire(x, 6,12,fp);//寫入6*12=72字節(jié)
將把“I Love”寫到流fp中12次,共72字節(jié)
15.tmpfile()
其原型是FILE *tmpfile(void);生成一個(gè)臨時(shí)文件,以“w+b”的模式打開,并返回這個(gè)臨時(shí)流的指針,如果失敗返回NULL。在程序結(jié)束時(shí),這個(gè)文件會被自動(dòng)刪除。
例:FILE *fp=tmpfile();
16.tmpnam();
其原型為char *tmpnam(char *s);生成一個(gè)唯一的文件名,其實(shí)tmpfile()就調(diào)用了此函數(shù),參數(shù)s用來保存得到的文件名,并返回這個(gè)指針,如果失敗,返回NULL。例:tmpnam(str1);
二、直接I/O文件操作
這是C提供的另一種文件操作,它是通過直接存/取文件來完成對文件的處理,而上篇所說流式文件操作是通過緩沖區(qū)來進(jìn)行;流式文件操作是圍繞一個(gè)FILE指針來進(jìn)行,而此類文件操作是圍繞一個(gè)文件的“句柄”來進(jìn)行,什么是句柄呢?它是一個(gè)整數(shù),是系統(tǒng)用來標(biāo)識一個(gè)文件(在WINDOWS中,句柄的概念擴(kuò)展到所有設(shè)備資源的標(biāo)識)的唯一的記號。此類文件操作常用的函數(shù)如下表,這些函數(shù)及其所用的一些符號在io.h和fcntl.h中定義,在使用時(shí)要加入相應(yīng)的頭文件。
函數(shù)說明
open()打開一個(gè)文件并返回它的句柄
close()關(guān)閉一個(gè)句柄
lseek()定位到文件的指定位置
read()塊讀文件
write()塊寫文件
eof()測試文件是否結(jié)束
filelength()取得文件長度
rename()重命名文件
chsize()改變文件長度
下面就對這些函數(shù)一一說明:
1.open()
打開一個(gè)文件并返回它的句柄,如果失敗,將返回一個(gè)小于0的值,原型是int open(const char *path, int access [, unsigned mode]);參數(shù)path是要打開的文件名,access是打開的模式,mode是可選項(xiàng)。表示文件的屬性,主要用于UNIX系統(tǒng)中,在DOS/WINDOWS這個(gè)參數(shù)沒有意義。其中文件的打開模式如下表。
符號含義符號含義符號含義
O_RDONLY 只讀方式 O_WRONLY 只寫方式 O_RDWR 讀/寫方式
O_NDELAY 用于UNIX系統(tǒng) O_APPEND 追加方式 O_CREAT 如果文件不存在就創(chuàng)建
O_TRUNC 把文件長度截為0 O_EXCL 和O_CREAT連用,如果文件存在返回錯(cuò)誤 O_BINARY 二進(jìn)制方式
O_TEXT 文本方式
對于多個(gè)要求,可以用“|”運(yùn)算符來連接,如O_APPEND|O_TEXT表示以文本模式和追加方式打開文件。
例:int handle=open(“c:msdos.sys”,O_BINARY|O_CREAT|O_WRITE)
2.close()
關(guān)閉一個(gè)句柄,原型是int close(int handle);如果成功返回0
例:close(handle)
3.lseek()
定位到指定的位置,原型是:long lseek(int handle, long offset, int fromwhere);參數(shù)offset是移動(dòng)的量,fromwhere是移動(dòng)的基準(zhǔn)位置,取值和前面講的fseek()一樣,SEEK_SET:文件首部;SEEK_CUR:文件當(dāng)前位置;SEEK_END:文件尾。此函數(shù)返回執(zhí)行后文件新的存取位置。
例:
lseek(handle,-1234L,SEEK_CUR);//把存取位置從當(dāng)前位置向前移動(dòng)1234個(gè)字節(jié)。
x=lseek(hnd1,0L,SEEK_END);//把存取位置移動(dòng)到文件尾,x=文件尾的位置即文件長度
4.read()
從文件讀取一塊,原型是int read(int handle, void *buf, unsigned len);參數(shù)buf保存讀出的數(shù)據(jù),len是讀取的字節(jié)。函數(shù)返回實(shí)際讀出的字節(jié)。
例:char x[200];read(hnd1,x,200);
5.write()
寫一塊數(shù)據(jù)到文件中,原型是int write(int handle, void *buf, unsigned len);參數(shù)的含義同read(),返回實(shí)際寫入的字節(jié)。
例:char x[]=“I Love You”;write(handle,x,strlen(x));
7.eof()
類似feof(),測試文件是否結(jié)束,是返回1,否則返回0;原型是:int eof(int handle);
例:while(!eof(handle1)){??};
8.filelength()
返回文件長度,原型是long filelength(int handle);相當(dāng)于lseek(handle,0L,SEEK_END)
例:long x=filelength(handle);
9.rename()
重命名文件,原型是int rename(const char *oldname, const char *newname);參數(shù)oldname是舊文件名,newname是新文件名。成功返回0
例:rename(“c:config.sys”,“c:config.w40”);
10.chsize();
改變文件長度,原型是int chsize(int handle, long size);參數(shù)size表示文件新的長度,成功返回0,否則返回-1,如果指定的長度小于文件長度,則文件被截短;如果指定的長度大于文件長度,則在文件后面補(bǔ)' 主站蜘蛛池模板: 国产精品99无码一区二区| 国产高清乱理伦片| 美丽人妻被按摩中出中文字幕| 精品无码一区二区三区| 国产精品又黄又爽又色无遮挡| 婷婷色爱区综合五月激情韩国| 久久精品国产99久久6动漫| 国产综合精品| 欧美丰满熟妇xx猛交| 亚洲精品99久久久久中文字幕| 乱人伦中文字幕成人网站在线| 亚洲成a∨人片在线观看不卡| 秋霞人妻无码中文字幕| 亚洲国产成人精品无码区在线| 无码不卡中文字幕av| 色色97| 综合精品欧美日韩国产在线| 一本久久知道综合久久| 欧洲美熟女乱又伦免费视频| 99re6在线视频精品免费下载| 加勒比一本heyzo高清视频| 精品国产自在久久现线拍| 国产h视频在线观看| 一本本月无码-| 国产成人亚洲综合无码品善网| 国产成+人+综合+亚洲 欧美| 久久综合老色鬼网站| 国产成人亚洲精品狼色在线| 老司机深夜18禁污污网站| 日韩一卡2卡3卡4卡新区亚洲| 亚洲成色在线综合网站| 色香欲天天影视综合网| 三级国产三级在线| 无码日韩精品一区二区免费| 狠狠躁夜夜躁人人爽天天bl| 久久久99精品成人片中文字幕| 日本三级欧美三级人妇视频| 亚洲精品乱码久久久久久蜜桃图片| 国产乱子伦无码精品小说| 亚洲欧洲无码av电影在线观看| 亚洲国产成人精品无码区四虎|