读文件写文件问题,请高手指点.
#include <stdlib.h>
#include <stdio.h>
int main()
{
FILE *iFile,*oFile;
short* dataBuffer=malloc(1024*sizeof(short));
short data[1024];
if ( (iFile=fopen( "dbh.wav ", "rb ")) == NULL)
{
printf( "\nerror on open dbh.wav! ");
exit(2);
}
if ( (oFile=fopen( "mine.wav ", "wb ")) == NULL)
{
printf( "\nerror on open mine.wav! ");
exit(2);
}
int d;
int dataLength;
dataLength =0;
while ((d=fread(dataBuffer,sizeof(short),1024,iFile))> 0)
{
memcpy(dataBuffer+dataLength,data,1024);
dataLength+=1024;
dataBuffer = realloc(dataBuffer,dataLength);
}
int e;
dataLength=0;
while ((e=fwrite(dataBuffer,sizeof(short),1024,oFile))> 0)
{
dataLength +=1024;
dataBuffer += dataLength;
}
free(dataBuffer);
fclose(iFile);
fclose(oFile);
}
上面的程序我主要想实现把dbh.wav文件读如缓冲区dataBuffer,然后再把dataBuffer的数据写到mine.wav文件。编译以后没有错误,可是mine.wav文件却打不开。请问这是为什么呢?
[解决办法]
这个错误应该很容易解决阿
[解决办法]
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *iFile,*oFile;
short* dataBuffer=(short *)malloc(1024*sizeof(short));
short data[1024];
if ( (iFile=fopen( "dbh.wav ", "rb ")) == NULL)
{
printf( "\nerror on open dbh.wav! ");
exit(2);
}
if ( (oFile=fopen( "mine.wav ", "wb ")) == NULL)
{
printf( "\nerror on open mine.wav! ");
exit(2);
}
int d;
int dataLength;
dataLength =0;
while ((d=fread(dataBuffer,sizeof(short),1024,iFile))> 0)
{
memcpy(dataBuffer+dataLength,data,1024);
dataLength+=1024;
dataBuffer = (short *)realloc(dataBuffer,dataLength);
}
int e;
dataLength=0;
while ((e=fwrite(dataBuffer,sizeof(short),1024,oFile))> 0)
{
dataLength +=1024;
dataBuffer += dataLength;
}
free(dataBuffer);
fclose(iFile);
fclose(oFile);
return 0;
}
[解决办法]
晕了,调式信息阿
运行信息没用的
[解决办法]
没有调试,建议你检查以下问题:
首先:
while ((d=fread(dataBuffer,sizeof(short),1024,iFile))> 0)
{
memcpy(dataBuffer+dataLength,data,1024);
……
你是想每次读出1024,依次写到dataBuffer吧,那fread的缓冲应该是data吧……
其次:
你的设计是dataBuffer跟着读出的数据大小变换大小,所以你用了realloc,可是这个函数在再次分配的空间大于原先的空间时返回的指针比一定是原先的指针了,你这么写会不会出现问题啊。
最后:
你的目的应该是把dbh.wav的内容写到mine.wav中,为什么不读一点写一点呢,全读出来那得占多大的内存啊,而且一旦对自己分配的内存管理的不是很清楚的情况下,出错的几率太大了……
[解决办法]
while ((d=fread(dataBuffer,sizeof(short),1024,iFile))> 0)
{
memcpy(dataBuffer+dataLength,data,1024);
//你上边这一步有什么左右呢?按你的想法应该是fread(data,.....吧.
dataLength+=1024; //步长太短了吧,sizeof(short)*1024个字节,你的步长却是1024个.
dataBuffer = realloc(dataBuffer,dataLength);
}
//楼主是否想这样:
int d;
int dataLength;
short data[1024*sizeof(short)];
dataLength =0;
char *ptr;
ptr=dataBuffer;
while ((d=fread(data,sizeof(short),1024,iFile))> 0)
{
memcpy(dataBuffer+dataLength,data,d);
dataLength+=d;
dataBuffer = realloc(dataBuffer,dataLength+sizeof(short)*1024);
}
[解决办法]
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *iFile,*oFile;
unsigned char* dataBuffer;// 用unsigned char = byte容易统计,short=2byte问题很大
if ( (iFile=fopen( "e:\\dbh.wav ", "rb ")) == NULL)
{
printf( "\nerror on open dbh.wav! ");
exit(2);
}
if ( (oFile=fopen( "e:\\mine.wav ", "wb ")) == NULL)
{
printf( "\nerror on open mine.wav! ");
exit(2);
}
fseek(iFile,0,SEEK_END);
int dataLength = ftell(iFile);
fseek(iFile,0,SEEK_SET);
dataBuffer = (unsigned char *)malloc(dataLength*sizeof(unsigned char ));
fread(dataBuffer,sizeof(unsigned char),dataLength,iFile);
fwrite(dataBuffer,sizeof(unsigned char),dataLength,oFile);
free(dataBuffer);
fclose(iFile);
fclose(oFile);
return 0;
}