⑴ c語言文件操作相關函數的用法
clearerr(清除文件流的錯誤旗標)
相關函數 feof
表頭文件 #include<stdio.h>
定義函數 void clearerr(FILE * stream);
函數說明 clearerr()清除參數stream指定的文件流所使用的錯誤旗標。
返回值
fclose(關閉文件)
相關函數 close,fflush,fopen,setbuf
表頭文件 #include<stdio.h>
定義函數 int fclose(FILE * stream);
函數說明 fclose()用來關閉先前fopen()打開的文件。此動作會讓緩沖區內的數據寫入文件中,並釋放系統所提供的文件資源。
返回值 若關文件動作成功則返回0,有錯誤發生時則返回EOF並把錯誤代碼存到errno。
錯誤代碼 EBADF表示參數stream非已打開的文件。
範例 請參考fopen()。
fdopen(將文件描述詞轉為文件指針)
相關函數 fopen,open,fclose
表頭文件 #include<stdio.h>
定義函數 FILE * fdopen(int fildes,const char * mode);
函數說明 fdopen()會將參數fildes 的文件描述詞,轉換為對應的文件指針後返回。參數mode 字元串則代表著文件指針的流形態,此形態必須和原先文件描述詞讀寫模式相同。關於mode 字元串格式請參考fopen()。
返回值 轉換成功時返回指向該流的文件指針。失敗則返回NULL,並把錯誤代碼存在errno中。
範例
#include<stdio.h>
main()
{
FILE * fp =fdopen(0,」w+」);
fprintf(fp,」%s\n」,」hello!」);
fclose(fp);
}
執行 hello!
feof(檢查文件流是否讀到了文件尾)
相關函數 fopen,fgetc,fgets,fread
表頭文件 #include<stdio.h>
定義函數 int feof(FILE * stream);
函數說明 feof()用來偵測是否讀取到了文件尾,尾數stream為fopen()所返回之文件指針。如果已到文件尾則返回非零值,其他情況返回0。
返回值 返回非零值代表已到達文件尾。
fflush(更新緩沖區)
相關函數 write,fopen,fclose,setbuf
表頭文件 #include<stdio.h>
定義函數 int fflush(FILE* stream);
函數說明 fflush()會強迫將緩沖區內的數據寫回參數stream指定的文件中。如果參數stream為NULL,fflush()會將所有打開的文件數據更新。
返回值 成功返回0,失敗返回EOF,錯誤代碼存於errno中。
錯誤代碼 EBADF 參數stream 指定的文件未被打開,或打開狀態為只讀。其它錯誤代碼參考write()。
fgetc(由文件中讀取一個字元)
相關函數 open,fread,fscanf,getc
表頭文件 include<stdio.h>
定義函數 nt fgetc(FILE * stream);
函數說明 fgetc()從參數stream所指的文件中讀取一個字元。若讀到文件尾而無數據時便返回EOF。
返回值 getc()會返回讀取到的字元,若返回EOF則表示到了文件尾。
範例
#include<stdio.h>
main()
{
FILE *fp;
int c;
fp=fopen(「exist」,」r」);
while((c=fgetc(fp))!=EOF)
printf(「%c」,c);
fclose(fp);
}
fgets(由文件中讀取一字元串)
相關函數 open,fread,fscanf,getc
表頭文件 include<stdio.h>
定義函數 har * fgets(char * s,int size,FILE * stream);
函數說明 fgets()用來從參數stream所指的文件內讀入字元並存到參數s所指的內存空間,直到出現換行字元、讀到文件尾或是已讀了size-1個字元為止,最後會加上NULL作為字元串結束。
返回值 gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
範例
#include<stdio.h>
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}
執行 this is a test /*輸入*/
this is a test /*輸出*/
fileno(返迴文件流所使用的文件描述詞)
相關函數 open,fopen
表頭文件 #include<stdio.h>
定義函數 int fileno(FILE * stream);
函數說明 fileno()用來取得參數stream指定的文件流所使用的文件描述詞。
返回值 返迴文件描述詞。
範例
#include<stdio.h>
main()
{
FILE * fp;
int fd;
fp=fopen(「/etc/passwd」,」r」);
fd=fileno(fp);
printf(「fd=%d\n」,fd);
fclose(fp);
}
執行 fd=3
fopen(打開文件)
相關函數 open,fclose
表頭文件 #include<stdio.h>
定義函數 FILE * fopen(const char * path,const char * mode);
函數說明 參數path字元串包含欲打開的文件路徑及文件名,參數mode字元串則代表著流形態。
mode有下列幾種形態字元串:
r 打開只讀文件,該文件必須存在。
r+ 打開可讀寫的文件,該文件必須存在。
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。
上述的形態字元串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫打開的文件為二進制文件,而非純文字文件。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新文件會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此文件許可權也會參考umask值。
返回值 文件順利打開後,指向該流的文件指針就會被返回。若果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。
附加說明 一般而言,開文件後會作一些文件讀取或寫入的動作,若開文件失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。
範例
#include<stdio.h>
main()
{
FILE * fp;
fp=fopen(「noexist」,」a+」);
if(fp= =NULL) return;
fclose(fp);
}
fputc(將一指定字元寫入文件流中)
相關函數 fopen,fwrite,fscanf,putc
表頭文件 #include<stdio.h>
定義函數 int fputc(int c,FILE * stream);
函數說明 fputc 會將參數c 轉為unsigned char 後寫入參數stream 指定的文件中。
返回值 fputc()會返回寫入成功的字元,即參數c。若返回EOF則代表寫入失敗。
範例
#include<stdio.h>
main()
{
FILE * fp;
char a[26]=」abcdefghijklmnopqrstuvwxyz」;
int i;
fp= fopen(「noexist」,」w」);
for(i=0;i<26;i++)
fputc(a,fp);
fclose(fp);
}
fputs(將一指定的字元串寫入文件內)
相關函數 fopen,fwrite,fscanf,fputc,putc
表頭文件 #include<stdio.h>
定義函數 int fputs(const char * s,FILE * stream);
函數說明 fputs()用來將參數s所指的字元串寫入到參數stream所指的文件內。
返回值 若成功則返回寫出的字元個數,返回EOF則表示有錯誤發生。
範例 請參考fgets()。
fread(從文件流讀取數據)
相關函數 fopen,fwrite,fseek,fscanf
表頭文件 #include<stdio.h>
定義函數 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函數說明 fread()用來從文件流中讀取數據。參數stream為已打開的文件指針,參數ptr 指向欲存放讀取進來的數據空間,讀取的字元數以參數size*nmemb來決定。Fread()會返回實際讀取到的nmemb數目,如果此值比參數nmemb 來得小,則代表可能讀到了文件尾或有錯誤發生,這時必須用feof()或ferror()來決定發生什麼情況。
返回值 返回實際讀取到的nmemb數目。
附加說明
範例
#include<stdio.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
int main(){
FILE * stream;
int i;
stream = fopen(「/tmp/fwrite」,」r」);
fread(s,sizeof(struct test),nmemb,stream);
fclose(stream);
for(i=0;i<nmemb;i++)
printf(「name[%d]=%-20s:size[%d]=%d\n」,i,s.name,i,s.size);
}
執行
name[0]=Linux! size[0]=6
name[1]=FreeBSD! size[1]=8
name[2]=Windows2000 size[2]=11
freopen(打開文件)
相關函數 fopen,fclose
表頭文件 #include<stdio.h>
定義函數 FILE * freopen(const char * path,const char * mode,FILE * stream);
函數說明 參數path字元串包含欲打開的文件路徑及文件名,參數mode請參考fopen()說明。參數stream為已打開的文件指針。Freopen()會將原stream所打開的文件流關閉,然後打開參數path的文件。
返回值 文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。
範例
#include<stdio.h>
main()
{
FILE * fp;
fp=fopen(「/etc/passwd」,」r」);
fp=freopen(「/etc/group」,」r」,fp);
fclose(fp);
}
fseek(移動文件流的讀寫位置)
相關函數 rewind,ftell,fgetpos,fsetpos,lseek
表頭文件 #include<stdio.h>
定義函數 int fseek(FILE * stream,long offset,int whence);
函數說明 fseek()用來移動文件流的讀寫位置。參數stream為已打開的文件指針,參數offset為根據參數whence來移動讀寫位置的位移數。
參數 whence為下列其中一種:
SEEK_SET從距文件開頭offset位移量為新的讀寫位置。SEEK_CUR 以目前的讀寫位置往後增加offset個位移量。
SEEK_END將讀寫位置指向文件尾後再增加offset個位移量。
當whence值為SEEK_CUR 或SEEK_END時,參數offset允許負值的出現。
下列是較特別的使用方式:
1) 欲將讀寫位置移動到文件開頭時:fseek(FILE *stream,0,SEEK_SET);
2) 欲將讀寫位置移動到文件尾時:fseek(FILE *stream,0,0SEEK_END);
返回值 當調用成功時則返回0,若有錯誤則返回-1,errno會存放錯誤代碼。
附加說明 fseek()不像lseek()會返回讀寫位置,因此必須使用ftell()來取得目前讀寫的位置。
範例
#include<stdio.h>
main()
{
FILE * stream;
long offset;
fpos_t pos;
stream=fopen(「/etc/passwd」,」r」);
fseek(stream,5,SEEK_SET);
printf(「offset=%d\n」,ftell(stream));
rewind(stream);
fgetpos(stream,&pos);
printf(「offset=%d\n」,pos);
pos=10;
fsetpos(stream,&pos);
printf(「offset = %d\n」,ftell(stream));
fclose(stream);
}
執行 offset = 5
offset =0
offset=10
ftell(取得文件流的讀取位置)
相關函數 fseek,rewind,fgetpos,fsetpos
表頭文件 #include<stdio.h>
定義函數 long ftell(FILE * stream);
函數說明 ftell()用來取得文件流目前的讀寫位置。參數stream為已打開的文件指針。
返回值 當調用成功時則返回目前的讀寫位置,若有錯誤則返回-1,errno會存放錯誤代碼。
錯誤代碼 EBADF 參數stream無效或可移動讀寫位置的文件流。
範例 參考fseek()。
fwrite(將數據寫至文件流)
相關函數 fopen,fread,fseek,fscanf
表頭文件 #include<stdio.h>
定義函數 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
函數說明 fwrite()用來將數據寫入文件流中。參數stream為已打開的文件指針,參數ptr 指向欲寫入的數據地址,總共寫入的字元數以參數size*nmemb來決定。Fwrite()會返回實際寫入的nmemb數目。
返回值 返回實際寫入的nmemb數目。
範例
#include<stdio.h>
#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
main()
{
FILE * stream;
set_s(0,」Linux!」);
set_s(1,」FreeBSD!」);
set_s(2,」Windows2000.」);
stream=fopen(「/tmp/fwrite」,」w」);
fwrite(s,sizeof(struct test),nmemb,stream);
fclose(stream);
}
執行 參考fread()。
getc(由文件中讀取一個字元)
相關函數 read,fopen,fread,fgetc
表頭文件 #include<stdio.h>
定義函數 int getc(FILE * stream);
函數說明 getc()用來從參數stream所指的文件中讀取一個字元。若讀到文件尾而無數據時便返回EOF。雖然getc()與fgetc()作用相同,但getc()為宏定義,非真正的函數調用。
返回值 getc()會返回讀取到的字元,若返回EOF則表示到了文件尾。
範例 參考fgetc()。
getchar(由標准輸入設備內讀進一字元)
相關函數 fopen,fread,fscanf,getc
表頭文件 #include<stdio.h>
定義函數 int getchar(void);
函數說明 getchar()用來從標准輸入設備中讀取一個字元。然後將該字元從unsigned char轉換成int後返回。
返回值 getchar()會返回讀取到的字元,若返回EOF則表示有錯誤發生。
附加說明 getchar()非真正函數,而是getc(stdin)宏定義。
範例
#include<stdio.h>
main()
{
FILE * fp;
int c,i;
for(i=0li<5;i++)
{
c=getchar();
putchar(c);
}
}
執行 1234 /*輸入*/
1234 /*輸出*/
gets(由標准輸入設備內讀進一字元串)
相關函數 fopen,fread,fscanf,fgets
表頭文件 #include<stdio.h>
定義函數 char * gets(char *s);
函數說明 gets()用來從標准設備讀入字元並存到參數s所指的內存空間,直到出現換行字元或讀到文件尾為止,最後加上NULL作為字元串結束。
返回值 gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
附加說明 由於gets()無法知道字元串s的大小,必須遇到換行字元或文件尾才會結束輸入,因此容易造成緩沖溢出的安全性問題。建議使用fgets()取代。
範例 參考fgets()
mktemp(產生唯一的臨時文件名)
相關函數 tmpfile
表頭文件 #include<stdlib.h>
定義函數 char * mktemp(char * template);
函數說明 mktemp()用來產生唯一的臨時文件名。參數template所指的文件名稱字元串中最後六個字元必須是XXXXXX。產生後的文件名會借字元串指針返回。
返回值 文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno中。
附加說明 參數template所指的文件名稱字元串必須聲明為數組,如:
char template[ ]=」template-XXXXXX」;
不可用char * template=」template-XXXXXX」;
範例
#include<stdlib.h>
main()
{
char template[ ]=」template-XXXXXX」;
mktemp(template);
printf(「template=%s\n」,template);
}
putc(將一指定字元寫入文件中)
相關函數 fopen,fwrite,fscanf,fputc
表頭文件 #include<stdio.h>
定義函數 int putc(int c,FILE * stream);
函數說明 putc()會將參數c轉為unsigned char後寫入參數stream指定的文件中。雖然putc()與fputc()作用相同,但putc()為宏定義,非真正的函數調用。
返回值 putc()會返回寫入成功的字元,即參數c。若返回EOF則代表寫入失敗。
範例 參考fputc()。
putchar(將指定的字元寫到標准輸出設備)
相關函數 fopen,fwrite,fscanf,fputc
表頭文件 #include<stdio.h>
定義函數 int putchar (int c);
函數說明 putchar()用來將參數c字元寫到標准輸出設備。
返回值 putchar()會返回輸出成功的字元,即參數c。若返回EOF則代表輸出失敗。
附加說明 putchar()非真正函數,而是putc(c,stdout)宏定義。
範例 參考getchar()。
rewind(重設文件流的讀寫位置為文件開頭)
相關函數 fseek,ftell,fgetpos,fsetpos
表頭文件 #include<stdio.h>
定義函數 void rewind(FILE * stream);
函數說明 rewind()用來把文件流的讀寫位置移至文件開頭。參數stream為已打開的文件指針。此函數相當於調用fseek(stream,0,SEEK_SET)。
返回值
範例 參考fseek()
setbuf(設置文件流的緩沖區)
相關函數 setbuffer,setlinebuf,setvbuf
表頭文件 #include<stdio.h>
定義函數 void setbuf(FILE * stream,char * buf);
函數說明 在打開文件流後,讀取內容之前,調用setbuf()可以用來設置文件流的緩沖區。參數stream為指定的文件流,參數buf指向自定的緩沖區起始地址。如果參數buf為NULL指針,則為無緩沖IO。Setbuf()相當於調用:setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)
返回值
setbuffer(設置文件流的緩沖區)
相關函數 setlinebuf,setbuf,setvbuf
表頭文件 #include<stdio.h>
定義函數 void setbuffer(FILE * stream,char * buf,size_t size);
函數說明 在打開文件流後,讀取內容之前,調用setbuffer()可用來設置文件流的緩沖區。參數stream為指定的文件流,參數buf指向自定的緩沖區起始地址,參數size為緩沖區大小。
返回值
setlinebuf(設置文件流為線性緩沖區)
相關函數 setbuffer,setbuf,setvbuf
表頭文件 #include<stdio.h>
定義函數 void setlinebuf(FILE * stream);
函數說明 setlinebuf()用來設置文件流以換行為依據的無緩沖IO。相當於調用:setvbuf(stream,(char * )NULL,_IOLBF,0);請參考setvbuf()。
返回值
setvbuf(設置文件流的緩沖區)
相關函數 setbuffer,setlinebuf,setbuf
表頭文件 #include<stdio.h>
定義函數 int setvbuf(FILE * stream,char * buf,int mode,size_t size);
函數說明 在打開文件流後,讀取內容之前,調用setvbuf()可以用來設置文件流的緩沖區。參數stream為指定的文件流,參數buf指向自定的緩沖區起始地址,參數size為緩沖區大小,參數mode有下列幾種
_IONBF 無緩沖IO
_IOLBF 以換行為依據的無緩沖IO
_IOFBF 完全無緩沖IO。如果參數buf為NULL指針,則為無緩沖IO。
返回值
ungetc(將指定字元寫迴文件流中)
相關函數 fputc,getchar,getc
表頭文件 #include<stdio.h>
定義函數 int ungetc(int c,FILE * stream);
函數說明 ungetc()將參數c字元寫回參數stream所指定的文件流。這個寫回的字元會由下一個讀取文件流的函數取得。
返回值 成功則返回c 字元,若有錯誤則返回EOF。
⑵ 請問C語言對文件的讀取有哪些函數,都有什麼功能像fseek();fscanf();fread......什麼的
C語言文件操作函數
13.1C語言文件
1,兩種文件存取方式(輸入,輸出方式)
順序存取
直接存取
2,數據的兩種存放形式
文本文件
二進制文件
13.2文件指針
定義文件類型指針變數的一般形式:
FILE *指針變數名;
例如:
FILE *fp1,*fp2;
13.3打開文件
在使用文件之前,需打開文件.在C里使用fopen函數打開文件.格式為:
fopen(文件名,文件使用方式);
此函數返回一個指向FILE類型的指針.如:
FILE *fp;
fp=fopen("file_1","r");
如果調用成功,fp就指向file_1,否則返回為NULL,所以為了保證文件的正確使用,要進行測試.採用如下語句:
If((fp=fopen("file_1","r"))==NULL)
{
printf("Cannot open this file\n");
exit(0);
}
最常用的文件使用方式及其含義如下:
1,"r".為讀而打開文本文件.(不存在則出錯)
2,"rb".為讀而打開二進制文件.
3,"w".為寫而打開文本文件.(若不存在則新建,反之,則從文件起始位置寫,原內容將被覆蓋)
4,"wb".為寫而打開二進制文件.
5,"a".為在文件後面添加數據而打開文本文件.(若不存在,則新建;反之,在原文件後追加)
6,"ab".為在文件後面添加數據而打開一個二進制文件.
最常用的文件使用方式及其含義如下:
7,"r+".為讀和寫而打開文本文件.(讀時,從頭開始;在寫數據時,新數據只覆蓋所佔的空間,其後不變)
8,"rb+".為讀和寫而打開二進制文件.只是在隨後的讀寫時,可以由位置函數設置讀和寫的起始位置.
9,"w+".首先建立一個新文件,進行寫操作,隨後可以從頭開始讀.(若文件存在,原內容將全部消失)
10,"wb+".功能與"w+"同.只是在隨後的讀寫時,可以由位置函數設置讀和寫的起始位置.
最常用的文件使用方式及其含義如下:
11,"a+".功能與"a"相同;只是在文件尾部添加新的數據後,可以從頭開始讀.
12,"ab+".功能與"a+"相同;只是在文件尾部添加新數據之後,可以由位置函數設置開始讀的起始位置.
13.4關閉文件
當文件的讀寫操作完成之後,使用fclose函數關閉文件.格式如下:
fclose(文件指針)
如:fclose(fp);
13.5調用getc(fgetc)和putc(fputc)函數進行輸入和輸出
1,調用putc(或fputc)函數輸出一個字元
調用形式為:
putc(ch,fp);
功能是:將字元ch寫到文件指針fp所指的文件中去.當輸出成功,putc函數返回所輸出的字元;否則,返回一個EOF值.EOF是在stdio.h庫函數文件中定義的符號常量,其值等於-1.
13.5調用getc(fgetc)和putc(fputc)函數進行輸入和輸出
例如:把從鍵盤輸入的文本按原樣輸出到名為file_1.dat文件中,用字元@作為鍵盤輸入結束標志.
#include
Void main()
{
FILE *fpout;
char ch;
if(fpout=fpopen("file_1","w")==NULL)
{
printf("Cannot open this file!\n");
exit(0);
}
ch=getchar();
while(ch!='@')
{ fputc(ch,fpout); ch=getchar(); }
fclose(fpout);
}
2.調用getc(或fgetc)函數輸入一個字元
調用形式為:
ch=getc(pf);
功能是:從pf指定的文件中讀如一個字元,並把它作為函數值返回.
例如:把一個已存在磁碟上的file_1.dat文本文件中的內容,原樣輸出到終端屏幕上.
#include
void main(){
FILE *fpin;
char ch;
if((fpin=fopen("file_1.dat","r"))==NULL)
{ printf("Cann't open this file!\n");exit(0);}
ch=fgetc(fpin);
while (ch!=EOF)
{ putchar(ch); ch=fgetc(fpin);}
fclose(fpin);
}
13.6判斷文件結束函數feof
EOF可以作為文本文件的結束 標志,但不能作為二進制文件的結束符.feof函數既可以判斷二進制文件,又可以判斷文本文件.
例:編寫程序,用於把一個文本文件(源)復制到另一個文件(目的)中,源文件名和目的文件名由命令行輸入.命令形式如下:
可執行程序名 源文件名 目的文件名
#include
void file(FILE* ,FILE *);
void main(int argc,char *argv[]){
FILE *fpin,*fpout;
if(argc==3)
{ fpin=fopen(argv[1],"r");
fpout=fopen(argv[2],"w");
file(fpin,fpout);
fclose(fpin);fclose(fpout);
}
else if(argc>3)
printf("The file names too many!!\n";
else
printf("There are no file names for input or output!!\n );
}
void file(FILE *fpin,FILE *fpout)
{
char ch;
ch=getc(fpin);
while(!feof(fpin))
{putc(ch,fpout); ch=getc(fpin);}
}
13.7fscanf函數和fprintf函數
1,fscanf函數
fscanf只能從文本文件中按格式輸入,和scanf函數相似,只不過輸入的對象是磁碟上文本文件中的數據.調用形式為:
fscanf(文件指針,格式控制字元串,輸入項表)
例如:fscanf(fp,"%d%d",&a,&b);
fscanf(stdin,"%d%d",&a,&b);
等價於scanf("%d%d",&a,&b);
3.fprintf函數
fprintf函數按格式將內存中的數據轉換成對應的字元,並以ASCII代碼形式輸出到文本文件中.Fprintf函數和printf函數相似,只是將輸出的內容按格式存放到磁碟的文本文件中.調用形式如下:
fprintf(文件指針,格式控制字元串,輸出項表)
如:fprintf(fp,"%d %d",x,y);
以下語句 fprintf(stdout,"%d %d",x,y)
13.8fgets函數和fputs函數
1,fgets函數
fgets函數用來從文件中讀入字元串.調用形式如下:
fgets(str,n,fp);
函數功能是:從fp所指文件中讀入n-1個字元放入str為起始地址的空間內;如果在未讀滿n-1個字元時,則遇到換行符或一個EOF結束本次讀操作,並已str作為函數值返回.
13.8fgets函數和fputs函數
2,fputs函數
fput函數把字元串輸出到文件中.函數調用形式如下:
fputs(str,fp);
注意:為了便於讀入,在輸出字元串時,應當人為的加諸如"\n"這樣的字元串.
#include <stdio.h>
#include <iostream>
int main(int argc, char *argv[])
{
char arr[10] ;
char *ap = "hello!" ;
FILE *fp ;
if ((fp = fopen("hello.txt", "wt+")) == NULL)
{
printf("error!") ;
exit(1) ;
}
fputs(ap, fp) ;
rewind(fp) ; //
fgets(arr, 10, fp) ;
printf("%s\n", arr) ;
fclose(fp) ;
return 0 ;
}
13.9fread函數和fwrite函數
例如有如下結構體:
struct st{
char num[8];
float mk[5];
}pers[30];
以下循環將把這30個元素中的數據輸出到fp所指文件中.
for(i=0;i<30;i++)
fwrite(&pers[i],sizeof(struct st),1,fp);
13.9fread函數和fwrite函數
以下語句從fp所指的文件中再次將每個學生數據逐個讀入到pers數組中.
i=0;
fread(&pers[i],sizeof(struct st),1,fp);
while(!feof(fp))
{ i++;
fread(&pers[i],sizeof(struct st),1,fp);
}
13.10文件定位函數
1,fseek函數
fseek函數用來移動文件位置指針到指定的位置上,接著的讀或寫操作將從此位置開始.函數的調用形式如下:
fseek(pf,offset,origin)
pf:文件指針
offset:以位元組為單位的位移量,為長整形.
origin:是起始點,用來指定位移量是以哪個位置為基準的.
1,fseek函數
位移量的表示方法
標識符 數字 代表的起始點
SEEK_SET 0 文件開始
SEEK_END 2 文件末尾
SEEK_CUR 1 文件當前位置
假設pf已指向一個二進制文件,則;
fseek(pf,30L,SEEK_SET)
fseek(pf,-10L*sizeof(int),SEEK_END)
對於文本文件,位移量必須是0;如:
fseek(pf,0L,SEEK_SET)
fseek(pf,0L,SEEK_END)
2. ftell函數
ftell函數用以獲得文件當前位置指針的位置,函數給出當前位置指針相對於文件開頭的位元組數.如;
long t;
t=ftell(pf);
當函數調用出錯時,函數返回-1L.
我們可以通過以下方式來測試一個文件的長度:
fseek(fp,0L,SEEK_END);
t=ftell(fp);
3.rewind函數
調用形式為:
rewind(pf);
函數沒有返回值.函數的功能是使文件的位置指針回到文件的開頭.
13.10文件應用
在磁碟上的test.txt文件中放有10個不小於2的正整數,用函數調用方式編寫程序.要求實現:
1,在被調函數prime中,判斷和統計10個整數中的素數以及個數.
2,在主函數中將全部素數追加到磁碟文件test.txt的尾部,同時輸出到屏幕上.
#include
#include
Int prime(int a[],int n)
{
int I,j,k=0,flag=0;
for(i=0;i { for(j=2;j if(a[i]%j==0)
{ flag=0; break;}
else flag=1;
if(flag)
{a[k]=a[i];k++;}
}
return k;
}
void main(){
int n,I,a[10];
FILE *fp;
fp=fopen("test1-2.txt","r+");
for(n=0;n<10;n++)
fscanf(fp,"%d",&a[n]);
n=prime(a,n);
fseek(fp,o,2);
for(i=0;i {printf("%3d",a[i]);
fprintf(fp,"%3d",a[i]);
}
fclose(fp);
⑶ C語言文件操作函數如何對文件內容進行操作
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ifstream fin("c:\\qq.txt");
char name[2][10];
char age[2][10];
char leibie[2][20];
int i=0;
while (!fin.eof())
{
fin.getline(name[i],10,' ');
fin.getline(age[i],10,' ');
fin.getline(leibie[i],10);
cout<<name[i]<<'\t'<<age[i]<<'\t'<<leibie[i]<<endl;
i++;
}
if (strcmp(leibie[0],"實習學生")==0)
{
strcpy(leibie[0],"正式員工");
}
ofstream fout("c:\\qq.txt");
for (i=0;i<2;i++)
{
fout<<name[i]<<' '<<age[i]<<' '<<leibie[i]<<endl;
}
}
⑷ C語言文件操作函數freopen的用法
fopen()函數功能:打開一個文件。
原型:FILE * fopen(const char * path,const char * mode);
需要#include<stdio.h>
返回值:文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。
一般打開文件會進行讀取或寫入操作,如果打開文件失敗,也就無法順利進行相應的讀寫操作,所以一般在調用fopen()之後要作錯誤判斷及處理。
⑸ C語言中什麼函數可以修改文件內容(可以隨意刪除原內容的一部分)
C語言文件操作詳解
C語言中沒有輸入輸出語句,所有的輸入輸出功能都用 ANSI C提供的一組標准庫函數來實現。文件操作標准庫函數有:
文件的打開操作 fopen 打開一個文件
文件的關閉操作 fclose 關閉一個文件
文件的讀寫操作 fgetc 從文件中讀取一個字元
fputc 寫一個字元到文件中去
fgets 從文件中讀取一個字元串
fputs 寫一個字元串到文件中去
fprintf 往文件中寫格式化數據
fscanf 格式化讀取文件中數據
fread 以二進制形式讀取文件中的數據
fwrite 以二進制形式寫數據到文件中去
getw 以二進制形式讀取一個整數
putw 以二進制形式存貯一個整數
文件狀態檢查函數 feof 文件結束
ferror 文件讀/寫出錯
clearerr 清除文件錯誤標志
ftell 了解文件指針的當前位置
文件定位函數 rewind 反繞
fseek 隨機定位
# 文件的打開
1.函數原型
FILE *fopen(char *pname,char *mode)
2.功能說明
按照mode 規定的方式,打開由pname指定的文件。若找不到由pname指定的相應文件,就按以下方式之一處理:
(1) 此時如mode 規定按寫方式打開文件,就按由pname指定的名字建立一個新文件;
(2) 此時如mode 規定按讀方式打開文件,就會產生一個錯誤。
打開文件的作用是:
(1)分配給打開文件一個FILE 類型的文件結構體變數,並將有關信息填入文件結構體變數;
(2)開辟一個緩沖區;
(3)調用操作系統提供的打開文件或建立新文件功能,打開或建立指定文件;
FILE *:指出fopen是一個返迴文件類型的指針函數;
3.參數說明
pname:是一個字元指針,它將指向要打開或建立的文件的文件名字元串。
mode:是一個指向文件處理方式字元串的字元指針。所有可能的文件處理方式見表8.1
4.返回值
正常返回:被打開文件的文件指針。
異常返回:NULL,表示打開操作不成功。
例如:
//定義一個名叫fp文件指針
FILE *fp;
//判斷按讀方式打開一個名叫test的文件是否失敗
if((fp=fopen("test","r")) == NULL)//打開操作不成功
{
printf("The file can not be opened.\n");
exit(1);//結束程序的執行
}
要說明的是:C語言將計算機的輸入輸出設備都看作是文件。例如,鍵盤文件、屏幕文件等。ANSI C標准規定,在執行程序時系統先自動打開鍵盤、屏幕、錯誤三個文件。這三個文件的文件指針分別是:標准輸入stdin、標准輸出stdout和標准出錯 stderr。
* 文件的關閉
1. 函數原型
int fclose(FILE *fp);
2. 功能說明
關閉由fp指出的文件。此時調用操作系統提供的文件關閉功能,關閉由fp->fd指出的文件;釋放由fp指出的文件類型結構體變數;返回操作結果,即0或EOF。
3. 參數說明
fp:一個已打開文件的文件指針。
4. 返回值
正常返回:0。
異常返回:EOF,表示文件在關閉時發生錯誤。
例如:
int n=fclose(fp);
*文件的讀寫操作
A. 從文件中讀取一個字元
1. 函數原型
int fgetc(FILE *fp);
2. 功能說明
從fp所指文件中讀取一個字元。
3. 參數說明
fp:這是個文件指針,它指出要從中讀取字元的文件。
4. 返回值
正常返回: 返回讀取字元的代碼。
非正常返回:返回EOF。例如,要從"寫打開"文件中讀取一個字元時,會發生錯誤而返回一個EOF。
5. 實例
【例】顯示指定文件的內容。
//程序名為:display.c
//執行時可用:display filename1 形式的命令行運行。顯示文件filename1中的內容。例如,執行命令行display display.c將在屏幕上顯示display的原代碼。
//File display program.
#include <stdio.h>
void main(int argc,char *argv[]) //命令行參數
{
int ch;//定義文件類型指針
FILE *fp;//判斷命令行是否正確
if(argc!=2)
{
printf("Error format,Usage: display filename1\n");
return; //鍵入了錯誤的命令行,結束程序的執行
}
//按讀方式打開由argv[1]指出的文件
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file <%s> can not be opened.\n",argv[1]);//打開操作不成功
return;//結束程序的執行
}
//成功打開了argv[1]所指文件
ch=fgetc(fp); //從fp所指文件的當前指針位置讀取一個字元
while(ch!=EOF) //判斷剛讀取的字元是否是文件結束符
{
putchar(ch); //若不是結束符,將它輸出到屏幕上顯示
ch=fgetc(fp); //繼續從fp所指文件中讀取下一個字元
} //完成將fp所指文件的內容輸出到屏幕上顯示
fclose(fp); //關閉fp所指文件
}
B. 寫一個字元到文件中去
1. 函數原型
int fputc(int ch,FILE *fp)
2. 功能說明
把ch中的字元寫入由fp指出的文件中去。
3. 參數說明
ch:是一個整型變數,內存要寫到文件中的字元(C語言中整型量和字元量可以通用)。
fp:這是個文件指針,指出要在其中寫入字元的文件。
4. 返回值
正常返回: 要寫入字元的代碼。
非正常返回:返回EOF。例如,要往"讀打開"文件中寫一個字元時,會發生錯誤而返回一個EOF。
5. 實例
【例】將一個文件的內容復制到另一個文件中去。
//程序名為:file.c
//執行時可用:file filename1 filename2形式的命令行運行,將文件filename1中的內容復制到文件filename2中去。
//file program.
#include <stdio.h>
void main(int argc,char *argv[]) //命令行參數
{
int ch;
FILE *in,*out; //定義in和out兩個文件類型指針
if(argc!=3) //判斷命令行是否正確
{
printf("Error in format,Usage: file filename1 filename2\n");
return; //命令行錯,結束程序的執行
}
//按讀方式打開由argv[1]指出的文件
if((in=fopen(argv[1],"r"))==NULL)
{
printf("The file <%s> can not be opened.\n",argv[1]);
return; //打開失敗,結束程序的執行
}
//成功打開了argv[1]所指文件,再
//按寫方式打開由argv[2]指出的文件
if((out=fopen(argv[2],"w"))==NULL)
{
printf("The file %s can not be opened.\n",argv[2]);
return; //打開失敗,結束程序的執行
}
//成功打開了argv[2]所指文件
ch=fgetc(in); //從in所指文件的當前指針位置讀取一個字元
while(ch!=EOF) //判斷剛讀取的字元是否是文件結束符
{
fputc(ch,out); //若不是結束符,將它寫入out所指文件
ch=fgetc(in); //繼續從in所指文件中讀取下一個字元
} //完成將in所指文件的內容寫入(復制)到out所指文件中
fclose(in); //關閉in所指文件
fclose(out); //關閉out所指文件
}
【例】按十進制和字元顯示文件代碼,若遇不可示字元就用井號"#"字元代替之。
//程序名為:mpf.c
//執行時可用:mpf filename1 形式的命令行運行。
// File mp program.
#include <stdio.h>
void main(int argc,char *argv[])
{
char str[9];
int ch,count,i;
FILE *fp;
if(argc!=2)
{
printf("Error format,Usage: mpf filename\n");
return;
}
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
count=0;
do{
i=0;
//按八進制輸出第一列,作為一行八個位元組的首地址
printf("%06o: ",count*8);
do{
// 從打開的文件中讀取一個字元
ch=fgetc(fp);
// 按十進制方式輸出這個字元的ASCII碼
printf("%4d",ch);
// 如果是不可示字元就用"#"字元代替
if(ch<' '||ch>'~') str[i]='#';
// 如果是可示字元,就將它存入數組str以便形成字元串
else str[i]=ch;
// 保證每一行輸出八個字元
if(++i==8) break;
}while(ch!=EOF); // 遇到文件尾標志,結束讀文件操作
str[i]='\0'; // 在數組str加字元串結束標志
for(;i<8;i++) printf(" "); // 一行不足八個字元用空格填充
printf(" %s\n",str); // 輸出字元串
count++; // 准備輸出下一行
}while(ch!=EOF); // 直到文件結束
fclose(fp); // 關閉fp所指文件
}
C. 從文件中讀取一個字元串
1. 函數原型
char *fgets(char *str,int n,FILE *fp)
2. 功能說明
從由fp指出的文件中讀取n-1個字元,並把它們存放到由str指出的字元數組中去,最後加上一個字元串結束符'\0'。
3. 參數說明
str:接收字元串的內存地址,可以是數組名,也可以是指針。
n: 指出要讀取字元的個數。
fp:這是個文件指針,指出要從中讀取字元的文件。
4. 返回值
正常返回:返回字元串的內存首地址,即str的值。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要從"寫打開"文件中讀取字元串,將
發生錯誤而返回一個NULL值。
D. 寫一個字元串到文件中去
1. 函數原型
int fputs(char *str,FILE *fp)
2. 功能說明
把由str指出的字元串寫入到fp所指的文件中去。
3. 參數說明
str:指出要寫到文件中去的字元串。
fp:這是個文件指針,指出字元串要寫入其中的文件。
4. 返回值
正常返回: 寫入文件的字元個數,即字元串的長度。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要往一個"讀打開" 文件中寫字元串時,
會發生錯誤而返回一個NULL值。
5.實例
【例】以下程序將一個文件的內容附加到另一個文件中去。
//程序名:linkfile.c
//執行時可用:linkfile filename1 filename2形式的命令行運行,將文件filename2的內容附加在文件filename1之後。
// file linked program.
#include <stdio.h>
#define SIZE 512
void main(int argc,char *argv[])
{
char buffer[SIZE];
FILE *fp1,*fp2;
if(argc!=3)
{
printf("Usage: linkfile filename1 filename2\n");
return;
}
// 按追加方式打開argv[1] 所指文件
if((fp1=fopen(argv[1],"a"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
if((fp2=fopen(argv[2],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[2]);
return;
}
// 讀入一行立即寫出,直到文件結束
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",buffer);
while(fgets(buffer,SIZE,fp2)!=NULL)
fputs(buffer,fp1);
fclose(fp1);
fclose(fp2);
if((fp1=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",buffer);
fclose(fp1);
}
⑹ 求c語言讀取寫入文本文件的函數實現
#include<stdio.h>
#include<string.h>//strlen()
#include<malloc.h>//malloc()
intFileCreate(char*filePath,char*fileContext)
{
FILE*fp;
fp=fopen(filePath,"w+");
if(fp)
{
fwrite(fileContext,strlen(fileContext),1,fp);
fclose(fp);
return0;
}
return1;
}
char*FileRead(char*filePath)
{
FILE*fp;
longintfsize;
char*fileContext;
fp=fopen(filePath,"r");
if(fp)
{
fseek(fp,0,SEEK_END);
fsize=ftell(fp);
rewind(fp);
fileContext=(char*)malloc(fsize+1);//注意釋放內存
fread(fileContext,fsize,1,fp);
*(fileContext+fsize)='