CFile::Read()读取MP3文件出现乱码!

Fairchild_X 2014-07-14 06:35:54
根据MP3的ID3V1格式规定,MP3文件的尾部128位用于存放歌曲信息,在从尾部偏移量-128到-126,这3个位置存放的是标识符“TAG”。

	CFile m_mp3(_T("F:\\明明很爱你.mp3"),CFile::modeRead | CFile::typeBinary, NULL); //打开音频文件
//char* sound = new char[129];
m_mp3.Seek(-128,CFile::end);
char* str = new char[3];
m_mp3.Read(str, 3);
m_mp3.Close();

if(str == "TAG")return;

std::string a = str;
CString ctemp;
ctemp = a.c_str();
MessageBox(ctemp);


我使用上面的代码,按理说在str中存放的应该是“TAG”,但是程序并未终止,而是弹出了如下的MessageBox:


这代表我从CFile::Read得来的str并不是"TAG",而是带有了一些乱码,这是怎么回事呢?对伊MP3文件应该是用 CFile::typeBinary模式的啊?
...全文
776 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌乱哥 2014-07-15
  • 打赏
  • 举报
回复
引用 3 楼 u012135569 的回复:
[quote=引用 1 楼 dingxz105090 的回复:] char* str = new char[4]; memset(str,0,4);
查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str. 但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢? 为什么这个在申请内存的时候,要多申请1个字节的位置呢? [/quote]读取的会覆盖掉之前的内容,多申请一个位置是用来放结束标志'\0'的。 你这里没有结束标志,所以编译器认为你的串还没结束,就从内存地址继续取字节放到str中了,就是一些随机的内容了
Fairchild_X 2014-07-15
  • 打赏
  • 举报
回复
引用 7 楼 dingxz105090 的回复:
[quote=引用 3 楼 u012135569 的回复:] [quote=引用 1 楼 dingxz105090 的回复:] char* str = new char[4]; memset(str,0,4);
查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str. 但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢? 为什么这个在申请内存的时候,要多申请1个字节的位置呢? [/quote]读取的会覆盖掉之前的内容,多申请一个位置是用来放结束标志'\0'的。 你这里没有结束标志,所以编译器认为你的串还没结束,就从内存地址继续取字节放到str中了,就是一些随机的内容了[/quote] 看来我的猜测正确了,谢谢啊~
schlafenhamster 2014-07-14
  • 打赏
  • 举报
回复
char* str = new char[3];// [4] str[3]=0; // 0 1 2 = T A G ;;; 3=0 (0 结尾 sz) m_mp3.Read(str, 3);// 只读3个, 如果TAG在文件中是字符串 就可以读 4个 (包括0) m_mp3.Close(); if(str == "TAG")return; 可以: strncmp(str,"TAG",3);// "TAG" 是字符串, str 不是 字符串 , 加0 才是
Fairchild_X 2014-07-14
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
记住 字符串不是 几个字符, 带 0 结尾的才是 字符串.
哦,是这样啊,就是说机器在读取字符串时,没有读到‘\0’标记是不会结束的吗?
schlafenhamster 2014-07-14
  • 打赏
  • 举报
回复
记住 字符串不是 几个字符, 带 0 结尾的才是 字符串.
Fairchild_X 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 dingxz105090 的回复:
char* str = new char[4]; memset(str,0,4);
查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str. 但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢? 为什么这个在申请内存的时候,要多申请1个字节的位置呢?
Fairchild_X 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 dingxz105090 的回复:
char* str = new char[4]; memset(str,0,4);
谢谢,问题解决了,不过这是什么原理呢,是编码的性质问题吗,能不能告诉我下呢?
凌乱哥 2014-07-14
  • 打赏
  • 举报
回复
char* str = new char[4]; memset(str,0,4);

16,471

社区成员

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

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

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