即使文件是空的,也要再讀一次,feof函數(shù)值才會(huì)變?yōu)檎妗?/p>
網(wǎng)站制作、成都網(wǎng)站建設(shè)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)公司擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷(xiāo)思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開(kāi)源代碼、注重用戶(hù)體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶(hù)的方式做到創(chuàng)意性的視覺(jué)化效果。
因?yàn)橹挥凶x出所有的數(shù)據(jù)之后,再讀一次,函數(shù)feof(fp)的返回值才為真。(請(qǐng)見(jiàn)《C語(yǔ)言好程序設(shè)計(jì)—從入門(mén)到進(jìn)階》,人民郵電出版社,2011。)
示例:
#includestdio.h
#includestdlib.h
main()
{
FILE *fp;
int a;
if((fp=fopen("c:\\number.txt","r"))==NULL)
{
printf("文件打開(kāi)失??!\n");
exit(0);
}
fscanf(fp,"%d",a);
while(!feof(fp)) /*等價(jià)于while(feof(fp)==0)*/
{
printf("%d ",a);
fscanf(fp,"%d",a);
}
fclose(fp);
}
fwrite源代碼為:
size_t fwrite (const void* ptr,size_t size,size_t nmemb,FILE *fp);
頭文件在search.h中,有的在stddef.h中
fread源代碼為:
size_t fread(const void* ptr,size_t size,size_t nmemb,FILE *fp);
函數(shù)參數(shù)與fwrite相同
他是指讀到文件的末尾??!你可以查看相關(guān)文檔 ?。。?! 很好理解的??!fscanf 是文件的 輸入輸出 ! printf是輸出到控制臺(tái)上!?。?! 呵呵 沒(méi)有什么大的不同 就一個(gè)函數(shù)而已 !??! 只是函數(shù)的調(diào)用過(guò)程中的參數(shù)不一樣?。?!
第一個(gè)代碼結(jié)果是11不錯(cuò),但第二個(gè)就不是10了,應(yīng)該是2——第一個(gè)代碼用fgetc讀,它把結(jié)束符也當(dāng)一個(gè)字符讀取了,當(dāng)然'\n'也被讀取了,共讀了12個(gè),但c=='\n'時(shí)被否定了,num沒(méi)有增值,所以最后num是11;第二個(gè)代碼顯然只能把0123456789當(dāng)一個(gè)整數(shù)來(lái)讀(遇到'\n'判斷為數(shù)據(jù)結(jié)束),所以一次就讀完了,之所以最后num是2,是因?yàn)橐淮巫x完后并沒(méi)有越過(guò)文件結(jié)尾產(chǎn)生讀操作,所以feof不可能返回“真”,還要再讀一次才產(chǎn)生錯(cuò)誤,所以結(jié)果是2。這里有個(gè)問(wèn)題必須注意:feof這個(gè)函數(shù)不產(chǎn)生讀文件操作,只檢查剛剛發(fā)生的讀操作是否越過(guò)文件結(jié)尾了,所以要在邏輯上緊跟在讀操作函數(shù)之后才能正確發(fā)揮作用。從這點(diǎn)上說(shuō),這兩款代碼都有錯(cuò)誤,應(yīng)該這么寫(xiě):
(1)代碼改如下:
#include?"stdio.h"
int?main(){
FILE?*fp;
int?num=0;
//int?a;
char?c;
if((fp=fopen("D:\\a.txt","r"))==NULL){
printf("打開(kāi)文件時(shí)發(fā)生錯(cuò)誤...\n");
return?0;
}
while(1){
c=fgetc(fp);
if(feof(fp))//把判斷提前到這里來(lái),處理過(guò)了再判斷毫無(wú)意義
break;
if(c!='\n'){
num++;
printf("%c\n",c);
}
}
printf("\n%d\n",num);
fclose(fp);
return?0;?
}
(2)代碼改如下:
#include?"stdio.h"
int?main(int?argv,char?*argc[]){
FILE?*fp;
int?num=0;
int?a;
//char?c;
if((fp=fopen("D:\\a.txt","r"))==NULL){
printf("打開(kāi)文件時(shí)發(fā)生錯(cuò)誤...\n");
return?0;
}
while(1){
fscanf(fp,"%d",a);
if(feof(fp))
break;
num++;
printf("%d\n",a);
}
printf("\n%d\n",num);
fclose(fp);
return?0;?
}
這樣改后前者結(jié)果就應(yīng)該是10,后者結(jié)果就應(yīng)該是1。相信不會(huì)有錯(cuò)。——由于圖3什么也看不清,不知你要問(wèn)什么問(wèn)題,以上只是按主要題意猜答的。
while(1)
{
fread(a[j],sizeof(struct stu),1,fp);/*這里一旦讀到結(jié)束位置,后面輸出應(yīng)停止,所以在fread后面增加判斷即可*/
if(feof(fp)) break;
printf("%10d",a[j].a);
printf("%10s",a[j].b);
printf("%10s",a[j].c);
printf("%10.2lf",a[j].d);
printf("%10d",a[j].e);
printf("%10.2lf\n",a[j].f);
j++;
}
fclose(fp);
}
原因:
當(dāng)遇到文件結(jié)束標(biāo)志,不立即結(jié)束而再執(zhí)行后面幾個(gè)printf才結(jié)束,會(huì)由于%s輸出遇不到字符串結(jié)束標(biāo)志而一直向下輸出,后面內(nèi)容是隨機(jī)的,當(dāng)遇到字符串結(jié)束標(biāo)志才停止。至于在那里停止,沒(méi)有辦法固定,要看內(nèi)存單元%s正在訪(fǎng)問(wèn)位置是否是字符串結(jié)束標(biāo)志。
feof是c標(biāo)準(zhǔn)函數(shù),原型:int feof(FILE *stream)是feof函數(shù)原型,文件結(jié)束返回非0值,否則返回0。fp對(duì)應(yīng)上面的文件流,!是bool取反的意思,!feof(fp)組合起來(lái)就是文件尚未結(jié)束的邏輯。