这几天学习过程中遇见这样一个问题:
使用fread() 和 read() 的时候
CFile myfile;
short int *pRec =0;
CFileException fileException;
pszFileName="E:\\66.wav";short int *pRec =0;
CFileException fileException;
numSamples = 176400;
if ( !myfile.Open(pszFileName, CFile::modeRead, &fileException) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
myfile.Read((void*)pRec,numSamples);
这样是没有错误的。
换做:
short int *pRec = 0;
char* pszFileName;
CFile myfile;
FILE * stream;
CFileException fileException;
int numSamples = 176400;
stream = fopen("E:\\66.wav", "r");
if (stream == NULL)
{
printf("Cannot open output file.\n");
}
pRec = new short int [numSamples/2];
memset(pRec,0,numSamples);
int iReadLen = fread((void*)pRec,1,numSamples,stream);
if (iReadLen == 0)
{ printf("读取文件错误!!!");}
if (feof(stream))
{printf("读取结束EOF!!!");}
if (ferror(stream))
{printf("读取错误ferror!!!");}
CFile myfile;
FILE * stream;
CFileException fileException;
int numSamples = 176400;
stream = fopen("E:\\66.wav", "r");
if (stream == NULL)
{
printf("Cannot open output file.\n");
}
pRec = new short int [numSamples/2];
memset(pRec,0,numSamples);
int iReadLen = fread((void*)pRec,1,numSamples,stream);
if (iReadLen == 0)
{ printf("读取文件错误!!!");}
if (feof(stream))
{printf("读取结束EOF!!!");}
if (ferror(stream))
{printf("读取错误ferror!!!");}
这里就报错了。提示只读取了90000多个值。而我的66.wav有55MB。
纠结半天 其中fopen语句改为
stream = fopen("E:\\66.wav", "rb");就正常了。
原来"r"将文件当做文本读取了,遇到EOF直接读取结束了。
而"rb",当做二进制流来读,就持续读下去了。
以下转自 http://www.lofter.com/tag/fread()
fopen()、fwrite()、fread()和fseek()详解