磁盤(pán)上的文件,文件是一種存放數(shù)據(jù)的媒介
一般在程序設(shè)計(jì)中,文件分為兩種:程序文件和數(shù)據(jù)文件。
.c .h(源程序文件).obj(目標(biāo)文件).exe(可執(zhí)行程序文件)類的文件,能夠被執(zhí)行,被編譯
程序文件可以操作數(shù)據(jù)文件
可以被操作,是程序運(yùn)行時(shí)讀寫(xiě)的數(shù)據(jù)
文件名包含三部分:文件路徑+文件主干名+文件后綴
eg:c:\user\test.txt
數(shù)據(jù)文件分為:文本文件和二進(jìn)制文件
文件緩沖區(qū)ANSIC標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理數(shù)據(jù)文件,[系統(tǒng)自動(dòng)在內(nèi)存中為程序中每一個(gè)正在使用的文件開(kāi)辟一塊文件緩沖區(qū)]
從內(nèi)存向磁盤(pán)輸出數(shù)據(jù),會(huì)先放在緩沖區(qū),如果緩沖區(qū)放滿了再一起放入磁盤(pán);從磁盤(pán)文件讀取數(shù)據(jù),會(huì)先輸入到內(nèi)存緩沖區(qū),裝滿緩沖區(qū)再逐個(gè)送入數(shù)據(jù)區(qū)(緩沖區(qū)大小由C編譯器決定)
也稱“文件類型指針”,在輸出數(shù)據(jù)文件時(shí)需要先裝滿磁盤(pán),所以要有存儲(chǔ)數(shù)據(jù)文件,程序會(huì)自動(dòng)建立一個(gè)文件信息區(qū)[存放數(shù)據(jù)文件的相關(guān)信息]
文件信息區(qū)是用來(lái)存放文件相關(guān)信息的,這些信息保存在一個(gè)結(jié)構(gòu)體類型的變量中,F(xiàn)ILE類型,系統(tǒng)中有定義(編譯器不同結(jié)構(gòu)體中成員有所差異,不過(guò)都是大同小異的),我們要維護(hù)相關(guān)信息就得定義一個(gè)FILE*型的變量(文件指針)
通過(guò)文件指針可以找到與它關(guān)聯(lián)的文件
文件使用之前要打開(kāi)文件,使用之后要關(guān)閉文件
【1】打開(kāi)文件
使用函數(shù)fopen()
FILE* fopen(const char* filename,const char* mode)
參數(shù)包括:文件名+打開(kāi)方式
打開(kāi)方式包括:
寫(xiě)法:
1.相對(duì)路徑
fopen(“test.txt”,“r”);
//表示在當(dāng)前路徑的同級(jí)路徑下
…/ 表示上一級(jí)路徑
fopen(“…/test.txt”,“r”);
//表示在上一級(jí)路徑下
fopen(“…/…/test.txt”,“r”);
//表示在上上級(jí)路徑下
2.絕對(duì)路徑
fopen(“C:\code\store\Project2\test.txt”,“r”);
//通過(guò)轉(zhuǎn)義字符讀取‘\’
【2】關(guān)閉文件
int fclose(FILE* stream)
#include#include//打開(kāi)文件
FILE* pf=fopen("test.txt","r");
if(pf==NULL)//可能打開(kāi)失敗返回空指針,用strerror函數(shù)打印錯(cuò)誤
{
printf("%s\n",strerror(errno));
return 0;
}
//打開(kāi)成功
//讀取文件
//關(guān)閉文件
fcolse(pf);//傳值調(diào)用并不會(huì)改變pf本身,因此需要另外置空釋放空間
pf=NULL;
文件的順序讀寫(xiě)
注意:
從鍵盤(pán)輸入以及輸出到屏幕中,屏幕和鍵盤(pán)都是外部設(shè)備
鍵盤(pán)———標(biāo)準(zhǔn)輸入設(shè)備——stdin
屏幕———標(biāo)準(zhǔn)輸出設(shè)備——stdout
是一個(gè)程序默認(rèn)打開(kāi)的兩個(gè)流設(shè)備
stdin stdout stderer
這三個(gè)流是默認(rèn)打開(kāi)的都是FILE*型的
FILE* pf=fopen("test.txt","w");
if(pf==NULL)
{
printf("%s\n",strerror(errno));
return 0;
}
fputc('b',pf);
fcolse(pf);//傳值調(diào)用并不會(huì)改變pf本身,因此需要另外置空釋放空間
pf=NULL;
FILE* pf=fopen("test.txt","r");
if(pf==NULL)
{
printf("%s\n",strerror(errno));
return 0;
}
int ch=fgetc(pf);
printf("%c",ch);
fclose(pf);
pf=NULL;
int main()
{
char arr[100]={0};
FILE* pf=fopen("test.txt","r");
if(pf==NULL)
{
printf("%s\n",strerror(errno));
return 0;
}
fgets(arr,100,pf);
printf("%s",arr);//也可以用puts(pf);函數(shù)實(shí)現(xiàn)輸出
fcolse(pf);
pf=NULL;
return 0;
}
int main()
{
char arr[100]={0};
FILE* pf=fopen("test.txt","w");
if(pf==NULL)
{
printf("%s\n",strerror(errno));
return 0;
}
fputs("hello",pf);
fcolse(pf);
pf=NULL;
return 0;
}
int main()
{
char buf[1024]={0};
fgets(buf,1024,stdin);//從標(biāo)準(zhǔn)輸入流讀取
fputs(buf,stdout);//輸出到標(biāo)準(zhǔn)輸出流
return 0;
}
這種寫(xiě)法等價(jià)于
gets(buf);
puts(buf);
格式化輸入函數(shù)
fscanf()函數(shù)
int fscanf( FILE *stream, const char *format [, argument ]… )
對(duì)比int scanf( const charformat [,argument]… )
和scanf使用基本相同,但還需要傳遞一個(gè)FILE型的參數(shù)
格式化輸出函數(shù)
fprintf()
int fprintf( FILE *stream, const char *format [, argument ]…)
對(duì)比int printf( const charformat [, argument]… )
和printf使用基本相同,但還需要傳遞一個(gè)FILE型的參數(shù)
例如:fprintf(pf,“%d %f %s”,10,3.14,“hello”);
scanf/printf fscanf/fprintf sscanf/sprintf的區(qū)別?
scanf/printf——針對(duì)標(biāo)準(zhǔn)輸入/輸出流的格式化輸入/輸出語(yǔ)句
fscanf/fprintf——針對(duì)所有輸入/輸出流的格式化輸入/輸出語(yǔ)句
sscanf/sprintf——從字符串(buffer)中讀入到tmp(相同類型結(jié)構(gòu))/將文件信息轉(zhuǎn)化為字符串(buffer)
int sscanf( const char *buffer, const char *format [, argument ] … );
int sprintf( char *buffer, const char *format [, argument] … );
二進(jìn)制輸出
fwrite()函數(shù)
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream )
將buffer中的內(nèi)容寫(xiě)入stream
二進(jìn)制輸入
fread()函數(shù)
size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
將stream中的內(nèi)容讀入buffer
feof()應(yīng)用于當(dāng)文件讀取結(jié)束了,判斷是讀取失敗結(jié)束還是遇到文件尾結(jié)束,而不是用來(lái)判斷文件是否結(jié)束的
EOF-end of file(定義中是-1)
文件讀取失敗perror()函數(shù)打印輸入的內(nèi)容+:+原因
【1】文本文件讀取結(jié)束判斷返回值為EOF(fgetc判斷)還是NULL(fgets判斷)
【2】二進(jìn)制文件讀取判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)(fread判斷)
if(feof(pf))
printf("error\n");
else if(ferror(pf))
printf("file is end\n");
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧