求助高手:为什么采用CFile保存wav文件可以保存但不能打开,而用API则可成功保存和打开

andy1a 2010-03-05 04:20:58
如题目所示,在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();*/

/////////////////////////////////////////////////////////////////////////////////////


}
...全文
69 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy1a 2010-03-06
  • 打赏
  • 举报
回复
问题解决了。多谢各位帮忙,是在各位的热情帮助下才最终找到问题所在。6楼说的对,还是不够细心
关键地方就在下面这一行代码上。
m_file.Write("fmt ",4);//关键点,是"fmt ",而不是"fmt",即在fmt后面还有一个空格不能省略。
sjdev 2010-03-05
  • 打赏
  • 举报
回复
我第一猜测也是typeBinary,竟然不是?

读出来比较一下吧.
arong1234 2010-03-05
  • 打赏
  • 举报
回复
如果保存的正确,应该逐个字节都一样,怎么会有长度不同?说明你写入文件的详细代码,在两种方式下可能有细微的不同,只是你没发现而已。
引用 5 楼 andy1a 的回复:
1。对于一楼说的,我用ULtraEdit查看过其二进制代码,并与个用API保存的可以正确播放的文件比较过,Wave Header是没有什么不同的,除了数据长度不同外,不过我计算过,数据长度也没有什么错误。
2。对于三楼和四楼所提的建议,我试过了。还是不中!
还有个发现:就是保存的可播放的文件,当鼠标置于其上时,可显示(类型,位速,大小)。而不能播放的只能显示(类型,大小)。有图片,可惜不能粘上来
andy1a 2010-03-05
  • 打赏
  • 举报
回复
1。对于一楼说的,我用ULtraEdit查看过其二进制代码,并与个用API保存的可以正确播放的文件比较过,Wave Header是没有什么不同的,除了数据长度不同外,不过我计算过,数据长度也没有什么错误。
2。对于三楼和四楼所提的建议,我试过了。还是不中!
还有个发现:就是保存的可播放的文件,当鼠标置于其上时,可显示(类型,位速,大小)。而不能播放的只能显示(类型,大小)。有图片,可惜不能粘上来
WizardK 2010-03-05
  • 打赏
  • 举报
回复
引用 3 楼 fishion 的回复:
m_file.Open(FilePathName,CFile::typeBinary|CFile::modeNoTruncate|CFile::modeCreate|CFile::modeReadWrite,&fileException);


CFile::typeBinary,这个是重点
fishion 2010-03-05
  • 打赏
  • 举报
回复
m_file.Open(FilePathName,CFile::typeBinary|CFile::modeNoTruncate|CFile::modeCreate|CFile::modeReadWrite,&fileException);
cdsnpeter 2010-03-05
  • 打赏
  • 举报
回复
重点看看是不是Wave Header部分的格式写错了。
cdsnpeter 2010-03-05
  • 打赏
  • 举报
回复
写一个Wave读取的代码,看看那个地方存错了。
内容概要:《中国银保监会监管数据安全管理办法(试行)》旨在规范监管数据的安全管理,提升数据保护能力,防范安全风险。办法明确了监管数据的定义、范围及其在采集、存储、处理、使用、委托服务及销毁等全生命周期中的安全管理要求。强调数据应依法合规采集,通过专用网络传输,存储于安全环境,并实施分级分类防护措施。对数据使用限定了用途和设备范围,要求脱敏处理和可追溯管理,并严格管控对外提供和跨境共享。针对委托服务机构设定了准入条件和协议管理机制,明确安全责任。同时建立自查、评估、检查和应急报告机制,确保数据安全事件及时处置和上报。; 适合人群:银保监会及其派出机构工作人员、受托提供监管数据服务的企事业单位、金融机构信息技术与数据管理人员。; 使用场景及目标:①指导监管数据全生命周期的安全管理实践;②规范受托机构的服务准入与安全管理;③建立健全数据安全风险防控与应急响应机制;④支持监管数据在合规前提下的有效利用与共享。; 阅读建议:本办法具有较强的政策性和操作性,建议结合实际工作流程对照执行,重点关注数据分类、权限控制、技术防护和应急管理等方面要求,并定期开展合规自查与培训。
内容概要:本文系统性地介绍了编程语言进阶的学习路径与实战项目实践,涵盖主流技术栈(Python、Java、Go、Rust)的优劣势分析,针对高并发性能优化、业务逻辑可维护性、数据处理效率等行业痛点提供具体解决方案,并结合设计模式与代码示例深入讲解。文章重点通过构建一个基于FastAPI的简易电商平台后端,演示了从技术选型、核心编码到项目优化的完整流程,强调性能调优、架构设计与实际工程问题的应对策略。最后提出进阶建议,倡导深入底层原理、掌握云原生技术、参与开源项目以持续提升技术能力。; 适合人群:具备一定编程经验,希望提升系统设计能力和工程实战水平的1-3年开发者,以及准备向中高级工程师进阶的技术人员。; 使用场景及目标:①帮助开发者在不同技术路线间做出合理选型决策;②掌握高并发、分布式、缓存等关键技术的实际应用;③通过完整项目实践理解Web后端开发全流程并积累可迁移经验;④提升对框架底层原理和系统性能优化的理解。; 阅读建议:建议边读边动手实现文中的代码示例与项目模块,结合调试与性能测试加深理解,同时延伸学习文中提到的底层机制(如GIL、goroutine、ORM原理)和工具链(Docker、Redis、JWT),以构建完整的知识体系。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧