求助高手:为什么采用CFile保存wav文件可以保存但不能打开,而用API则可成功保存和打开
如题目所示,在wav文件保存函数中,用CFile保存wav文件可以保存但不能打开播放。
我用ULtraEdit采看过其二进制代码,不能打开播放的wav文件其头文件也与正确的一样,计算过其数据长度也正确
具体的代码如下:
void CTTRecDlg::OnRecSave()
{
// TODO: Add your control notification handler code here
CString FilePathName;
CFileDialog dlg(FALSE,"wav",NULL,OFN_OVERWRITEPROMPT,"Wav Files (*.Wav)|*.Wav||",this);//TRUE: show an "open file" dialog//yy
if(dlg.DoModal()==IDOK)
{
FilePathName=dlg.GetPathName();
// if (FilePathName.Right(4).CompareNoCase(".wav")) FilePathName=FilePathName + ".wav";
}
else return;
/////////////保存wav文件,可以成功保存和打开/////////////////
DWORD NumToWrite=0;
DWORD dwNumber = 0;
HANDLE FileHandle = CreateFile( FilePathName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
dwNumber = FCC("RIFF");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength + 18 + 20;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("WAVE");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = FCC("fmt ");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = 18L;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, &waveform, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
dwNumber = FCC("data");
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
dwNumber = dwDataLength;
WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
WriteFile(FileHandle, pSaveBuffer, dwDataLength , &NumToWrite, NULL);
SetEndOfFile(FileHandle);
CloseHandle( FileHandle );
FileHandle = INVALID_HANDLE_VALUE;/**/
//////////以下代码:保存为WAVE文件 可以成功保存,但不能打开播放/////////////////////////////
/* CFile m_file;
CFileException fileException;
// CString m_FileName="D:\\VC_EXAM\\Myaudio.wav";
m_file.Open(FilePathName,CFile::modeCreate|CFile::modeReadWrite,&fileException);
DWORD m_WaveHeaderSize=38;
DWORD m_WaveFormatSize=18L;
m_file.SeekToBegin();
m_file.Write("RIFF",4);//写入头文件信息
//unsigned int Sec=(sizeof(pSaveBuffer)+m_WaveHeaderSize);
unsigned int Sec=dwDataLength +38 ;
m_file.Write(&Sec,sizeof(Sec));
m_file.Write("WAVE",4);
m_file.Write("fmt",4);
m_file.Write(&m_WaveFormatSize,4);
// m_file.Write(&waveform,sizeof( WAVEFORMATEX));
m_file.Write(&waveform.wFormatTag,sizeof(waveform.wFormatTag));
m_file.Write(&waveform.nChannels,sizeof(waveform.nChannels));
m_file.Write(&waveform.nSamplesPerSec,sizeof(waveform.nSamplesPerSec));
m_file.Write(&waveform.nAvgBytesPerSec,sizeof(waveform.nAvgBytesPerSec));
m_file.Write(&waveform.nBlockAlign,sizeof(waveform.nBlockAlign));
m_file.Write(&waveform.wBitsPerSample,sizeof(waveform.wBitsPerSample));
m_file.Write(&waveform.cbSize,sizeof(waveform.cbSize));
m_file.Write("data",4);
m_file.Write(&dwDataLength,sizeof(dwDataLength));
m_file.Write(pSaveBuffer,dwDataLength);//写入真正的数据
m_file.Seek(dwDataLength,CFile::begin);
m_file.Close();*/
/////////////////////////////////////////////////////////////////////////////////////
}