c文件操作
文件操作有以下幾個內容:
? 1.將數據從內存輸出到文件上,也稱“寫”文件。
? 2.將數據從文件輸入到內存,也稱“讀”文件。
一.怎樣進行文件操作:
? 1.設立文件指針
???? 進行文件操作時,必須在程序一開始就先定義文件指針。
????????
???? FILE *指針類型變量
? 2.打開文件
???? 將文件指針與磁盤上的文件建立聯系,以后對文件的所有操作都將通過文件指針來進行
??
????????? fopen(文件名, 使用文件方式)
????????? 比如: fp = fopen("A.TXT","r");
????? 其中A.TXT表示將要訪問的是當前盤當前路徑下名為A.TXT的文件。
?????
????? fopen()函數調用成功,表示在指定的磁盤位置找到文件A.TXT,這時將帶回指向A.TXT文件的指針并賦給?fp,這樣fp就和文件A.TXT建立了聯系。
????
????? 如果文件打開不成功,fopen()函數將返回一個空指針NULL,為了避免使用空指針,應該按下面的程序段?的書寫形式輸出失敗信息:
??if( fp=fopen("A.TXT","r") == NULL)
???? {
???????? printf("can't find this file!/n");
???exit(0);
???? }
??
-------------------------------------------------------------------------------------------------
??
文件使用方式??? 含義
"r"(只讀)?????? 為輸入打開一個文本文件。若指定的文件不存在,則會出錯
"w"(只寫)?????? 為輸出打開一個文本文件。若文件不存在,系統將用指定名建立一個新文件;若文件已經存????????? ??在,則將從起始位置重新寫,原有內容被更新
"rb"(只讀)????? 為輸入打開一個二進制文件。功能與"r"相同
"wb"(只寫)????? 為輸出打開一個二進制文件。功能與"w"相同
"a"(追加)?????? 為追加數據打開一個文本文件。若文件不存在,系統將用指定名建立一個新文件;若文件已??經存在,則新數據寫在原有內容之后
"ab"(追加)????? 為追加數據打開一個二進制文件。其余功能與"a"相同
"r+"(讀寫)????? 為讀/寫打開一個已存在文本文件。既可讀,也可寫,讀寫總是從文件的起始位置開始;更換??讀寫操作時不必關閉文件
"rb+"(讀寫)???? 為讀/寫打開一個已存在的二進制文件。功能與"r+"相同。可由位置函數設置讀寫的起始位置
"w+"(讀寫)????? 為讀/寫建立一個新的文本文件。若文件已存在,原有內容將被更新
"wb+"(讀寫)???? 為讀/寫建立一個新的二進制文件。功能與"w+"相同;可由位置函數設置讀寫起始位置
"a+"(讀寫)????? 為讀/寫打開一個文本文件。功能與"a"相同,只是在文件尾部添加新數據后,可以從頭開始??讀
"ab+"(讀寫)???? 為讀/寫打開一個二進制文件。功能與"a+"相同,只是在文件尾部添加新數據之后,可由位置??函數設置開始讀的起始位置
-------------------------------------------------------------------------------------------------
二.讀、寫數據:
? 讀寫數據將通過調用標準輸入輸出函數來完成。這些函數主要包括:
? (1)fgetc()和getc():從制定文件中一次讀取一個字符
?????? fputc()和putc():一次輸出一個字符到指定文件?
? (2)fgets():從指定文件中一次讀取一個字符串
?????? fputs():一次輸出一個字符串到指定文件
? (3)fread():從指定文件中一次讀取一個數據塊
?????? fwrite():一次輸出一個數據塊到指定文件
? (4)fscanf():從指定文件中按格式讀取數據
?????? fprintf():按指定格式將數據輸出到指定文件中
? 文件定位函數,使“讀寫位置指針”直接指向指定的讀寫位置:
? fseek():可移動位置指針到指定位置上
? ftell():可獲得當前位置指針的位置
? rewind():“反繞”函數,可使位置指針回到文件的開頭
三.關閉文件
?? 當 讀、寫操作完成之后,必須先將先將文件關閉
?????? fclose(文件指針)
?? 函數調用成功后返回0,否則返回非0值
---------------------------------------------------------------------------------------------------------------------------------------------
怎樣向文本文件寫入單個字符:
#include <stdio.h> main() {FILE *fpc; //定義文件指針char ch;if( (fpc = fopen("A1.TXT","w")) == NULL ) //文件打開不成功就退出程序的執行{printf("can't open this file!!/n");exit(0);}ch = getchar();while( ch != '@'){fputc(ch, fpc);ch = getchar();}fclose(fpc); }上例表達式fopen("A1.TXT","w")是:? 為“只寫”而打開一個名為"A1.TXT"的文本文件,程序執行后,如果當前目錄下沒有名字為A1.TXT的文件,系統將在該目錄下新建;如果已經存在,則從文件的其始位置重新寫,文件中所有原有內容全部更新。
----------------------------------------------------------------------------------------------------------------------------------------------
5.向文本文件寫入字符串
#include <stdio.h> main() {FILE *fps;char str[8];if( (fps=fopen("A2.TXT","a")) == NULL){printf("can't open this file!/n");exit(0); }while( strlen( gets(str)>0 ){fputs(str,fps);fputs("/n",fps);}fclose(fps);printf("/n"); }----------------------------------------------------------------------------------------------------------------------------------------------
4.從文本文件中讀取單個字符
#include <stdio.h> main() {FILE *fpc;char ch;if( (fpc=fopen("A1.TXT","r")) == NULL){printf("can't open this file!/n");exit(0);}ch = fgetc(fpc);while( ch!=EOF){putchar(ch);ch = fgetc(fpc);}fclose(fpc);putchar("/n"); }----------------------------------------------------------------------------------------------------------------------------------------------
文件函數
函數名 ?? 函數原型說明????? 功能????????????????? 返回值
---------------------------------------------------------------------------------------------
fopen?? FILE? *fopen(char???????? 以mode指定的方式打開名??成功返回文件指針(文件
????????? *filename,??????????????? 為filename的文件???信息區的其始地址),否則
????????? char *mode);???????返回NULL
例:
---------------------------------------------------------------------------------------------
fclose??? int fcolse(FILE? *fp);??? 關閉fp所指的文件,釋放文件緩沖區??? 出錯返回非0,否則返回0
例:
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
格式化寫文件
#include <stdio.h> void num(FILE *); main() {FILE *fp;char *fname;fname = "NUM.TXT";if( (fp = fopen(fname,"w")) == NULL ){printf("Can't open this file ! /n");exit(0);}num(fp);fclose(fp); }void num(FILE *fp) {char name[20];int num;scanf("%s%d",name,&num);while(nu>o){fprintf( fp, "%s %d/n", name, num);scanf("%s%d",name,&num);}}----------------------------------------------------------------------------------------------------------------------------------------------
格式化讀文件
#include <stdio.h> void num(FILE *); main() {FILE *fp;char *fname;fname = "NUM.TXT"if( (fp = fopen(fname,"r")) == NULL ){prinf("can't open this file ! /n");exit(0);}num(fp);fclose(fp); }void num(FILE *f) {char name[20];int nu;fscanf(f,"%s%d",name,&nu);while(!feof(f)){printf("%s %d/n", name, nu); fscanf(f,"%s%d",name,&d);} }----------------------------------------------------------------------------------------------------------------------------------------------
文件的數據塊讀寫方式
按數據塊方式對一個二進制文件進行讀寫操作的例子:
/*文件的數據塊讀寫
by searcher
2002-9-12 */
-----------------------------------------------------------------------------------------------------------------------------------------------
文件復制方法
/*文件復制
by searcher
2002-9-12*/
上面的程序總有問題,程序運行時命令行參數argc的個數為什么總是1呢??????
所以,運行結果也總是:"error!"
-----------------------------------------------------------------------------------------------------------------------------------------------
文件定位函數
1.fseek()函數:
??? 用來移動文件位置指針到指定的位置上,從此位置接著讀、寫操作。函數的調用形式如下:
???
???????? fseek(pf, offset, origin)
???????? pf是文件指針,offset是以字節為單位的位移量,為長整型數;origin是起始點,
?????? 用以指定位移量是以哪個位置為基準的,起始點既可用標識符來表示,也可用數字
?????? 來代表。
???? 標識符?????? 數字??? 代表的起始點
??? SEEK_SET?????? 0?????? 文件開始
??? SEEK_END??? 2?????? 文件末尾
??? SEEK_CUR?????? 1?????? 文件當前位置
例如:
??? fp已指向一個二進制文件,能使位置指針從文件的開頭向文件尾部移動20個字節的fseek()函數的
??? 調用形式如下:
???????
?????????? fseek(fp, 20L, SEEK_SET)
例如:
??? fp已指向一個二進制文件,能使位置指針從文件尾部向文件開頭移動10個sizeof(int)的函數的調
??? 用形式如下:
?????????? fseek(fp, -10L*sizeof(int), SEEK_END)
對于文本文件,位移量必須為0。
例如:fp已指向一個文本文件,能使位置指針移到文件起始位置的fseek()函數形式如下:
???????? fseek(fp, 0L, SEEK_SET)
例如:fp以指向一個文本文件,能使位置指針移到文件末尾的fseek()函數的調用形式如下:
???????? fseek(fp, 0L, SEEK_END)
2.ftell()函數:
??? 調用ftell()函數可以得到當前位置指針相對于文件起始位置的字節數。函數調用出錯時,返回-1L.
??? 例如:當打開一個文件時,通常并不知道該文件的長度,通過以下程序段可以求出該文件的字節數:
????????? fseek(fp, 0L, SEEK_END);?? //把位置指針移到文件末尾
????????? t = ftell(fp);???????????? //求出文件的總字節數
??? 再例如:某二進制文件中存放的struct st結構體類型數據,可以通過以下程序,可求出該結構體類型
??? 數據塊的個數:
?????????? fseek(fp, 0L, SEEK_END);
?????????? t = ftell(fp);
?????????? n = t/sizeof(struct st);
3.rewind()函數:
???? 又稱“反繞”函數,能使位置指針回到文件的開頭。函數調用形式如下:
??????????? rewind(fp);
????? fp為文件指針,此函數沒有返回值。
總結
- 上一篇: 字符串以及内存操作相关函数
- 下一篇: 主板usb模式启动快捷键大全