【c基础】之 文件及其操作
文件的打開與關(guān)閉
首先要定義一個(gè)文件指針類型,格式為?FILE *文件指針名;?;
FILE *fp; //fp就是定義的文件指針?
●打開文件fopen()函數(shù),格式:?fp = fopen("文件名", "打開方式");?
fp = fopen("c:\\myfile", "r"); //打開方式下文會(huì)講到?
文件名中不允許直接使用路徑描述符?"\",必須用轉(zhuǎn)義字符的形式?"\\"。"\\" 中第一個(gè) "\" 是轉(zhuǎn)義字符,第二個(gè)表示路徑描述符。
?
●關(guān)閉文件fcolse()函數(shù),格式:?fclose(文件指針);?
fclose(fp);功能:正常完成關(guān)閉文件操作時(shí)fclose返回0,否則返回EOF(值為-1),表示有錯(cuò)誤發(fā)生。
●打開文件的方式:
共有12種,由r(read), w(write), a(append), b(binary), +(read/write)五個(gè)字符組合而成。
"r", "w", "a", "r+", "w+", "a+" ?:這六種打開文本文件
?"rb", "wb", "ab", "rb+", "wb+", "ab+" ?:這六種打開二進(jìn)制文件
| "r" | 打開一個(gè)文本文件,可以讀取文件 |
| "w" | 打開一個(gè)文本文件,可以寫入文件,先將文件的長(zhǎng)度截為0。如果該文件不存在則先創(chuàng)建 |
| ?"a" | 打開一個(gè)文本文件,可以寫入文件,向已有文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建 |
| "r+" | 打開一個(gè)文本文件,可以進(jìn)行更新(讀取和寫入),也即可以讀取和寫入文件 |
| "w+" | 打開一個(gè)文本文件,可以進(jìn)行更新(讀取和寫入),如果該文件存在則首先將其長(zhǎng)度截為0,如果該文件不存在則先創(chuàng)建 |
| "a+" | 打開一個(gè)文本文件,可以進(jìn)行更新(讀取和寫入),向已有文件的尾部追加內(nèi)容,如果該文件不存在則先創(chuàng)建;可以讀取整個(gè)文件,但寫入時(shí)只能追加內(nèi)容。 |
| "rb", "wb", "ab", "rb+", "wb+", "ab+", "r+b", "w+b", "a+b" | 與前面的模式相似,只是使用二進(jìn)制而非文本模式打開文件 |
注意:如果用"w"模式打開任意一個(gè)文件,文件內(nèi)容將刪除,以便程序以一個(gè)空文件開始操作。
?
●文件結(jié)束的判定feof()函數(shù),格式:?feof(文件指針)?
這里舉一個(gè)例子幫助理解:
while(!feof(fp)) //我們已在文件的末尾加上結(jié)束標(biāo)志-1 { c = fgetc(fp); print("當(dāng)?shù)轿募矔r(shí),此段文字不顯示"); } //此段程序的含義是:當(dāng)為!feof(fp)為1,從當(dāng)前位置讀入一個(gè)字節(jié)的數(shù)據(jù)賦給字符型變量c,指當(dāng)遇到文件結(jié)束標(biāo)志時(shí),feof(fp)的值為1,feof(fp)為0,循環(huán)結(jié)束?
feof()函數(shù)功能:測(cè)試文件指針?biāo)赶虻奈腻\啊內(nèi)部讀寫位置指針是否到達(dá)文件尾。當(dāng)文件結(jié)束時(shí)返回1,否則返回0。
?
文件的讀寫
1.字符,字符串的讀寫
寫字符函數(shù)fputc,功能:把一個(gè)字符寫入此盤文件中,若輸出成功,則返回輸出的字符,否則返回EOF。格式:
fputc(ch, fp); //將字符ch的值輸出到fp所指向的文件中?
ch:要輸出的字符,可以是字符常量,也可以是字符變量。
?
讀字符函數(shù)fgetc,功能:從指定文件讀入一個(gè)字符,該文件必須是以讀或讀寫方式打開的,若讀取成功返回讀取的字符,否則返回EOF。格式:
ch = fgetc(fp); //讀取成功返回字符賦值給ch?
寫字符串函數(shù)fputs,格式:?fputs("字符串", 文件指針); ? ? 功能:向指定的文件寫入一串字符,寫入成功返回0,否則返回非0值。
fputs("Welcome to my blog", fp);注意:fputs函數(shù)將寫入文件的字符串中的空字符去掉,ptus函數(shù)將空字符換成換行字符輸出。
?
讀字符串函數(shù),格式:?fgets(字符串, n, fp); ? ? ?功能:從fp指向的文件讀入n-1個(gè)字符存放第一個(gè)參數(shù)中,如果遇到換行符或EOF,則結(jié)束。
fgets(str, n, fp); //str 為字符數(shù)組。從fp指向的文件讀入n-1個(gè)字符存放到str數(shù)組中注意:讀入字符串后在最后加一個(gè) '\0' 字符,fgets函數(shù)返回的返回值為字符串的首地址。
?
?
2.數(shù)據(jù)塊的讀寫
數(shù)據(jù)塊寫文件函數(shù)fwrite(),格式:
fwrite(buffer, size, count, fp);buffer:是一個(gè)指針,用來指出帶輸出數(shù)據(jù)的地址。
size:每次要寫的字節(jié)數(shù)
count:寫入多少個(gè)size大小的數(shù)據(jù)項(xiàng)
注意:完成寫操作(fwrite())后必須關(guān)閉文件(fclose())
?
數(shù)據(jù)塊的讀文件函數(shù)fread(),格式:
fread(buffer, size, count, fp);count:讀入多少個(gè)size大小的數(shù)據(jù)項(xiàng)
?
3.格式化讀/寫文件函數(shù)
讀文件fprintf(),格式:?fprintf(文件指針,"格式控制",輸出列表);?
fprintf(fp,"%d, %d",a, b); //將a,b寫入fp指向的文件中注意:fprintf()函數(shù)總是將輸出項(xiàng)在內(nèi)存中的表示形式按指定的格式轉(zhuǎn)換成字符串形式,再寫入到指定的文件中。
?
寫文件fscanf(),格式:?fscanf(文件指針,"格式控制",地址列表);?
fprintf(fp,"%d, %d",&a, &b); //將fp指向的文件中的數(shù)據(jù)讀出并存放于a,b注意:fscanf()函數(shù)從文件中讀出的數(shù)據(jù)一定是按字符串形式(文本形式)存在的。
?
文件定位
●rewind()函數(shù),格式:?rewind(文件指針);? ? ?功能:使文件指針的讀寫位置重新返回到文件的開頭。 rewind(fp); ●fseek()函數(shù),格式:?fseek(文件指針, 位移量w, 起始點(diǎn)s);? ? ?功能:使文件指針移到距起始點(diǎn)偏移w個(gè)字節(jié)處。 fseek(fp, 2, 0); //使文件指針移到距起始點(diǎn)0偏移2個(gè)字節(jié)數(shù) w:當(dāng)w為正數(shù)時(shí)表示向文件尾方向移動(dòng),為負(fù)數(shù)時(shí)表示向文件頭移動(dòng),為0表示不移動(dòng)。 s:可以為0,1,2;s=0表示文件頭,s=0表示當(dāng)前位置,s=0表示文件末尾。 ●ftell()函數(shù),格式:?ftell(文件指針);? ? ?功能:得到流式文件中的當(dāng)前位置,用相對(duì)與文件開頭的位移量來表示。若ftell()函數(shù)返回-1L表示出錯(cuò)。? i = ftell(fp); //存放當(dāng)前位置給變量i if(i == -1L)printf("error\n"); //若調(diào)用的函數(shù)出錯(cuò)(如不存在此文件),則輸出ERROR文件的檢測(cè)
常用的文件檢測(cè)函數(shù)有兩個(gè) ferror()和clearerr() ferror()函數(shù),功能:若ferror()函數(shù)的返回值為0,則表示未出錯(cuò),非0表示出錯(cuò)。格式: ferror(fp)clearerr()函數(shù),功能:使文件錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志置為0。格式: clearerr(fp)
?
20170104完轉(zhuǎn)載于:https://www.cnblogs.com/libra-yong/p/6250133.html
總結(jié)
以上是生活随笔為你收集整理的【c基础】之 文件及其操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DFS 算法总结
- 下一篇: Java和Python安装和编译器使用