您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言文件的操作方法有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C語言文件的操作方法有哪些”吧!
fgetc:字符輸入函數(shù),也就是讀文件時用的函數(shù)。
函數(shù)功能:Read a character from a stream
從一個文件中讀一個字符到內(nèi)存中。
函數(shù)原型:
int fgetc( FILE *stream );
參數(shù)為stream,也就是文件指針。
返回值:fgetc return the character read as an int or return EOF to indicate an error or end of file.該函數(shù)調(diào)用成功會返回讀取到的的字符的ASCIIC碼值;若讀取文件時發(fā)生錯誤,或是已經(jīng)讀取到文件末尾,則返回EOF。
舉例:將data.txt文件中的內(nèi)容讀取,并打印。
#include <stdio.h> #include <string.h> #include <errno.h> int main() { //打開文件 FILE* pf = fopen("data.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0;//文件打開失敗,失敗返回 } //對文件進(jìn)行輸入字符操作 int ch = 0; while ((ch = fgetc(pf))!= EOF) { printf("%c", ch); } //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
fputc:
函數(shù)功能:從內(nèi)存中寫一個字符到文件中。也就是輸出字符。
函數(shù)原型:
int fputc( int c, FILE *stream );
第一個參數(shù)為待輸出的字符,第二個參數(shù)是文件指針。
返回值:Each of these functions returns the character written. For fputc , a return value of EOF indicates an error.
如果正常運行則返回此字符,如果返回EOF則意味著失敗。
舉例:將字母a~z寫入到data.txt文件中
#include <stdio.h> #include <string.h> #include <errno.h> int main() { //打開文件 FILE* pf = fopen("data.txt", "w"); //文件打開失敗,失敗返回 if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } //對文件進(jìn)行輸出字符的操作 char i = 0; for (i = 'a'; i <= 'z'; i++) { fputc(i, pf); } //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
fgets和fputs是對文本行的操作,相當(dāng)于對字符串的操作。這是不同于fgetc和fputc的地方。
fgets:
函數(shù)功能:
從文件中讀一行字符到內(nèi)存中,也就是輸入。
函數(shù)原型:
char *fgets( char *string, int n, FILE *stream );
第一個參數(shù)是指向文件字符串的指針,第二個參數(shù)是讀幾個字符的意思,第三個參數(shù)是指向文件的指針。
返回值:Each of these functions returns string. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred.每一個這樣的函數(shù)結(jié)束后正常情況返回一個指向這個字符串的字符指針。如果返回NULL則意味著遇到錯誤,或者是文件結(jié)束。但是重點來了~,想要判斷到底是錯誤導(dǎo)致的返回,還是文件結(jié)束導(dǎo)致的返回,還需要使用feof函數(shù)和ferror函數(shù)來判斷。
下面有涉及feof函數(shù)的用法
舉個例子。
//feof是用來在結(jié)束后判斷是什么原因結(jié)束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp); }
注意:
1.在fgets函數(shù)讀取到指定字符數(shù)之前,若讀取到換行符(’\n’),則停止讀取,讀取帶回的字符包含換行符。
2. fgets函數(shù)讀取到第n-1個字符時都沒有遇到換行符(’\n’)時,則返回讀到的前n-1個字符,并在末尾加上一個NULL字符返回。這樣加起來共n個字符
fputs函數(shù):
函數(shù)功能:
寫一行字符串到文件中,也就是輸出。
函數(shù)原型:
int fputs( const char *string, FILE *stream );
第一個參數(shù)為指向內(nèi)存中這個字符串的指針,第二個參數(shù)為指向這個文件的文件指針。返回值:該函數(shù)調(diào)用成功會返回一個非負(fù)值;若輸出時發(fā)生錯誤,則返回EOF。
fscanf和fprintf也叫格式化輸入(讀)和輸出(寫)函數(shù)。
fscanf:
函數(shù)功能:
按照一定的格式如%s,%c,從指定文件的位置輸入到內(nèi)存中。
函數(shù)原型:
int fscanf( FILE *stream, const char *format [, argument ]... );
fscanf函數(shù)的第一個參數(shù)是讀取數(shù)據(jù)的位置也就是文件指針,第二個參數(shù)也就是scanf函數(shù)的參數(shù),也就是取地址。
除了第一個參數(shù)是需要指針位置其余和scanf函數(shù)操作一樣。
fprintf:
函數(shù)功能:
將內(nèi)存中的數(shù)據(jù)以一定的格式輸出到文件中。也就是打印,也稱為寫。
函數(shù)原型:
int fprintf( FILE *stream, const char *format [, argument ]...);
第一個參數(shù)是文件指針,第二個參數(shù)和printf函數(shù)一樣,會用printf函數(shù)就會用這個函數(shù)。
舉例:
include <stdio.h> #include <string.h> #include <errno.h> struct S { char name[20]; char sex[5]; int age; }; int main() { //打開文件 FILE* pf = fopen("data.txt", "r"); //如果文件打開失敗,失敗返回 if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } //對文件進(jìn)行格式化輸入輸出操作 struct S tmp = { 0 }; fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age)); printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age); //可以打印出來,我這里沒打印。 //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
函數(shù)功能:Reads data from a stream.從一個流中讀取數(shù)據(jù)到內(nèi)存中。
函數(shù)原型:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
第一個參數(shù)是buffer是內(nèi)存的意思,第二個參數(shù)是要讀的數(shù)據(jù)的類型,第三個參數(shù)是讀取的個數(shù),第四個參數(shù)是文件指針??偟囊馑际菑奈募羔樦赶虻奈募x取count個size大小的數(shù)據(jù)到內(nèi)存buffer中。
返回值:若在讀取過程中發(fā)生錯誤或是在未讀取到指定元素個數(shù)時讀取到文件末尾,則返回一個小于count的數(shù)。
fwrite:
函數(shù)功能:Writes data to a stream.寫入二進(jìn)制數(shù)據(jù)到文件中
函數(shù)原型:
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
第一個參數(shù)是輸出數(shù)據(jù)的位置,第二個參數(shù)是要輸出數(shù)據(jù)的元素個數(shù),第三個參數(shù)是每個元素的大小,第四個參數(shù)是數(shù)據(jù)輸出的目標(biāo)位置。返回值:該函數(shù)調(diào)用完后,會返回實際寫入目標(biāo)位置的元素個數(shù),當(dāng)輸出時發(fā)生錯誤或是待輸出數(shù)據(jù)元素個數(shù)小于要求輸出的元素個數(shù)時,會返回一個小于count的數(shù)。
舉例:以wb輸出到文件
#include <stdio.h> #include <string.h> #include <errno.h> int main() { //打開文件 FILE* pf = fopen("data.txt", "wb"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } //對文件以二進(jìn)制形式進(jìn)行輸出操作 int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; fwrite(arr, sizeof(int), 10, pf); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
函數(shù)介紹:
定位文件指針,以文件指針當(dāng)前的位置,偏移到想定位的位置。向前偏移是負(fù)的,比如-1,-2,向后偏移是正的。
SEEK_CUR:從當(dāng)前指針的位置偏移
SEEK_SET:從文件的起始位置開始偏移
SEEK_END:從文件的末尾開始偏移
函數(shù)原型:
int fseek( FILE *stream, long offset, int origin );
第一個參數(shù)是文件指針,第二個參數(shù)是要偏移的偏移量。第三個參數(shù)是從什么位置開始偏移。舉例。
/* fseek example */ #include <stdio.h> int main () { FILE * pFile; //打開文件 pFile = fopen ( "example.txt" , "wb" ); //以一行的形式寫文件 fputs ( "This is an apple." , pFile ); //讓文件指針從文件的起始位置開始偏移9個單位。 fseek ( pFile , 9 , SEEK_SET ); //繼續(xù)寫文件 fputs ( " sam" , pFile ); //關(guān)閉文件 fclose ( pFile ); return 0; }
函數(shù)介紹:
可以返回文件指針相對于起始位置的偏移量
函數(shù)原型:
long ftell( FILE *stream );
返回值類型為long int,第一個參數(shù)是文件指針。
函數(shù)介紹
讓文件指針回到文件的起始位置。fseek函數(shù)也可以達(dá)到同樣的效果。
函數(shù)原型:
void rewind( FILE *stream );
舉例
/* rewind example */ #include <stdio.h> int main () { int n; FILE * pFile; char buffer [27]; //打開文件 pFile = fopen ("myfile.txt","w+"); for ( n='A' ; n<='Z' ; n++) { fputc ( n, pFile); } //使指針回到起始位置 rewind (pFile); fread (buffer,1,26,pFile); fclose (pFile); buffer[26]='\0'; puts (buffer); return 0; }
數(shù)據(jù)文件:可以分為文本文件和二進(jìn)制文件
二進(jìn)制文件:文本文件可以肉眼看懂,二進(jìn)制文件則是亂碼看不懂。
數(shù)據(jù)在內(nèi)存中是以二進(jìn)制的形式存儲,如果不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件文本文件:如果要求在外存中以ASCII碼的形式存儲,則需要在存儲前轉(zhuǎn)換。如果以ASCII字符的形式存儲文件就叫做文本文件。
具體例子如下。
一個數(shù)據(jù)在內(nèi)存中是怎么存儲的呢?
如果整數(shù)10000以ASCII碼的形式輸出到磁盤,則占用5個字節(jié)。如果以二進(jìn)制形式輸出到磁盤則占用4個字節(jié)。
牢記:在文件讀取過程中,不能用feof函數(shù)的返回值直接用來判斷文件是否結(jié)束。
函數(shù)功能:
應(yīng)用于當(dāng)文件讀取結(jié)束的時候,用ferror判斷是讀取失敗結(jié)束,還是遇到文件末尾結(jié)束。
1.文本文件讀取是否結(jié)束,判斷返回值是否為EOF(fgetc),或者是否為NULL(fgets)等。每個函數(shù)有每個特定的結(jié)束標(biāo)志。
2.二進(jìn)制文件的讀取結(jié)束判斷,判斷返回值是否小于實際要讀的個數(shù)。
正確使用例子
#include <stdio.h> #include <stdlib.h> int main(void) { int c; // 注意:int,非char,要求處理EOF FILE* fp = fopen("test.txt", "r"); //如果為0,則打開失敗 if(!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 當(dāng)讀取失敗的時候或者遇到文件結(jié)束的時候,都會返回EOF while ((c = fgetc(fp)) != EOF) // 標(biāo)準(zhǔn)C I/O讀取文件循環(huán) { putchar(c); } //feof是用來在結(jié)束后判斷是什么原因結(jié)束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp); }
在ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動的在在內(nèi)存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區(qū)”。從內(nèi)存向磁盤輸出數(shù)據(jù)會先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤上。如果從磁盤向計算機讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根據(jù)C編譯系統(tǒng)決定的。
舉例:C語言代碼也就是用戶程序,要在屏幕上打印信息。則需要調(diào)用printf函數(shù),而printf函數(shù)則調(diào)用了系統(tǒng)的API,讓操作系統(tǒng)在屏幕上打印信息。但操作系統(tǒng)要為好多程序服務(wù)。所以在操作系統(tǒng)解決前,先放到文件緩沖區(qū),程序攢滿了再交給操作系統(tǒng)解決。
感謝各位的閱讀,以上就是“C語言文件的操作方法有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C語言文件的操作方法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。