3 回答

TA貢獻1862條經驗 獲得超6個贊
size_t fread (void * Buffer, size_t Size, size_t Count, FILE * Stream);
Size:每個要讀取的元素的大小,單位字節----第二個參數
Count:要讀取的元素個數------------------第三個參數
函數的返回值是實際讀出元素的個數。
fwrite的第二和第三個參數及返回值的含義同上。
用fread(temp,1024,1,fp)也能讀出,意思是一個元素的大小是1024個字節,每次讀取一個,這在讀取前面內容時沒問題,當讀到最后,加入只剩下100個字節的數據,不足1024字節時,程序返回0,你無法知道程序最后一次讀出了多少數據。如果用fread(temp,1,1024,fp),則程序每次返回讀出數據的字節數,即使讀最后100個字節時,也返回100,這樣你可以利用返回值知道程序讀出了多少數據。
你程序中用'\0'判斷讀出數據的結束標志,也是有問題的。mp3文件中本身就有很多NULL字符,用strchr(temp,'\0'); 返回的指針未必指向讀出數據的結束標志,可能指向讀出數據中的某位。我實際試驗了一下,用這種方法,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);
}

TA貢獻1851條經驗 獲得超5個贊
while( 1 == 1 )
{
fread(temp,sizeof(temp),1,fp);
if ( feof(fp) ) break; // 讀了,就測定 EOF
// 如果放在 while (!feof(fp))測定,最后讀到EOF會多/重復輸出一行
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));
}

TA貢獻1831條經驗 獲得超9個贊
問題出在
一是fread函數向緩沖區temp中輸入字符串時,不會在結尾加‘\0’,而且如果一次fread后緩沖區被讀滿,結尾也不會有字符串結尾符‘\0’,所以打印出的字符串異常。
二是fread函數你傳入的實參數順序不對。這樣改:
while(!feof(fp))
{
bsize = fread(temp,1,(sizeof(temp)-1),fp); //bsize是實際讀入的字符數,把它定義為整型
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));
}
- 3 回答
- 0 關注
- 779 瀏覽
添加回答
舉報