char数组的数据显示

今天在做一个读取mp3文件的metadata信息的时候遇到两个很简单的问题,由于长时间没有使用标准c++,导致花了一点时间才解决,看来c++基础基本荒废了啊。

struct.h

1
2
3
4
5
6
7
8
9
10
11
12
struct MetaData{
char Header[3]; /*标签头必须是"TAG"否则认为没有标签*/
char Title[30]; /*标题*/
char Artist[30]; /*作者*/
char Album[30]; /*专集*/
char Year[4]; /*出品年代*/
char Comment[28]; /*备注*/
char Reserver; /*保留*/
char Channel; /*音轨*/
char Genre; /*类型*/
};

这是mp3的ID3V1的标签格式,128数据在文件的最末尾,起始是三个字节的“TAG”

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
ifstream in(filename,ios::in);
if(!in.is_open()){
return;
}
in.seekg(128,ios::end);//wrong ,正确写法:in.seekg(-128,ios::end);
char data[128]={0};
in.read(data,128);
MetaData tagData;
memset(&tagData,0,sizeof(MetaData));
memcpy(&tagData,data,sizeof(MetaData));
std::cout<<tagData.Header<<endl; //错误,正确 string header(tagData.Header,3);cout<<header<<endl;
in.close();

错误1,ifstream::seekg的作用是移动当前读取文件指针的位置,第一个参数是offset偏移(向后),我已经使用ios::end,也就是说参考位置到了文件末尾,我又向后移动了128,这样读取的信息肯定是空的,应该此处是-128,即向前偏移128位,这样才能获取到最后的128字节信息。

错误2,我直接cout<<tagData.Header,以为只会输出“TAG”这三个字符,但是实际结果是后面还输出了Title的信息。因为Header此时是一个字符串指针,指向的是第一个字节,而不是我以为的字符串(string),输出的时候结果是输出指针后面的所有字节,直到遇到第一个字符串结束符(\0)。所以正确的用法是将Header转化为std::string,然后显示。


char数组的数据显示
http://yoursite.com/2019/05/24/char数组的数据显示/
作者
还在输入
发布于
2019年5月24日
许可协议