第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C語(yǔ)言高手幫忙:fread 函數(shù)的問(wèn)題?

C語(yǔ)言高手幫忙:fread 函數(shù)的問(wèn)題?

SSM
躍然一笑 2019-02-13 15:11:56
#include <stdio.h>#include <string.h>void main(){FILE *fp;FILE *fpw;char temp[1024];for(i=0;i<sizeof(temp);i++){temp[i]='\0';}fp=fopen("c:/book/1.mp3","rb");if(fp==NULL){printf("can not open file\n");}fpw=fopen("c:/book/2.mp3","w+b"); while(!feof(fp)){fread(temp,sizeof(temp),1,fp);printf("%d\n%s\n",k,temp);k=strchr(temp,'\0');if(k==NULL){fwrite(temp,sizeof(temp),1,fpw); }else{fwrite(temp,int(k-temp),1,fpw); }memset(temp,0,sizeof(temp));} fclose(fp);fclose(fpw);}函數(shù)讀到文件的最后老是會(huì)加入空格字符,要不然就直接死掉;有什么辦法判斷 fread 讀到了文件末尾沒(méi)?
查看完整描述

3 回答

?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

size_t fread (void * Buffer, size_t Size, size_t Count, FILE * Stream);
Size:每個(gè)要讀取的元素的大小,單位字節(jié)----第二個(gè)參數(shù)
Count:要讀取的元素個(gè)數(shù)------------------第三個(gè)參數(shù)
函數(shù)的返回值是實(shí)際讀出元素的個(gè)數(shù)。

fwrite的第二和第三個(gè)參數(shù)及返回值的含義同上。

用fread(temp,1024,1,fp)也能讀出,意思是一個(gè)元素的大小是1024個(gè)字節(jié),每次讀取一個(gè),這在讀取前面內(nèi)容時(shí)沒(méi)問(wèn)題,當(dāng)讀到最后,加入只剩下100個(gè)字節(jié)的數(shù)據(jù),不足1024字節(jié)時(shí),程序返回0,你無(wú)法知道程序最后一次讀出了多少數(shù)據(jù)。如果用fread(temp,1,1024,fp),則程序每次返回讀出數(shù)據(jù)的字節(jié)數(shù),即使讀最后100個(gè)字節(jié)時(shí),也返回100,這樣你可以利用返回值知道程序讀出了多少數(shù)據(jù)。

你程序中用'\0'判斷讀出數(shù)據(jù)的結(jié)束標(biāo)志,也是有問(wèn)題的。mp3文件中本身就有很多NULL字符,用strchr(temp,'\0'); 返回的指針未必指向讀出數(shù)據(jù)的結(jié)束標(biāo)志,可能指向讀出數(shù)據(jù)中的某位。我實(shí)際試驗(yàn)了一下,用這種方法,4M多的1.mp3,最終只能得到800多k的2.mp3。正確的做法是利用fread的返回值作為fwrite的輸入。

最終程序修改如下,去除了打印代碼:
#include <stdio.h>
#include <string.h>
void main()
{
FILE *fp;
FILE *fpw;
char temp[1024];
int bsize;

fp=fopen("c:/book/1.mp3","rb");
fpw=fopen("c:/book/2.mp3","wb");
if(fp==NULL)
{
printf("can not open file\n");
}
temp[1023]='\0';

while(!feof(fp))
{
bsize = fread(temp,1,sizeof(temp)-1,fp);
fwrite(temp,1,bsize,fpw);
}

fclose(fp);
fclose(fpw);

}



查看完整回答
反對(duì) 回復(fù) 2019-03-26
?
江戶川亂折騰

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊

while( 1 == 1 )
{
fread(temp,sizeof(temp),1,fp);
if ( feof(fp) ) break; // 讀了,就測(cè)定 EOF
// 如果放在 while (!feof(fp))測(cè)定,最后讀到EOF會(huì)多/重復(fù)輸出一行
k=strchr(temp,'\0'); // k 先有值再輸出
printf("%d\n%s\n",k,temp);
if(k==NULL)
{
fwrite(temp,sizeof(temp),1,fpw);
}
else
{
fwrite(temp,(int)(k-temp),1,fpw);
}
memset(temp,0,sizeof(temp));
}



查看完整回答
反對(duì) 回復(fù) 2019-03-26
?
天涯盡頭無(wú)女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

問(wèn)題出在
一是fread函數(shù)向緩沖區(qū)temp中輸入字符串時(shí),不會(huì)在結(jié)尾加‘\0’,而且如果一次fread后緩沖區(qū)被讀滿,結(jié)尾也不會(huì)有字符串結(jié)尾符‘\0’,所以打印出的字符串異常。
二是fread函數(shù)你傳入的實(shí)參數(shù)順序不對(duì)。這樣改:
while(!feof(fp))
{
bsize = fread(temp,1,(sizeof(temp)-1),fp); //bsize是實(shí)際讀入的字符數(shù),把它定義為整型
temp[bsize] = '\0';
printf("%d\n%s\n",k,temp);
k=strchr(temp,'\0');
if(k==NULL)
{
fwrite(temp,sizeof(temp),1,fpw);
}
else
{
fwrite(temp,(int)(k-temp),1,fpw);
}
memset(temp,0,sizeof(temp));
}



查看完整回答
反對(duì) 回復(fù) 2019-03-26
  • 3 回答
  • 0 關(guān)注
  • 772 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)