为什么将字符数组复制到结构中时 memcpy 不起作用?
Why doesn't memcpy work when copying a char array into a struct?
#define buffer 128
int main(){
char buf[buffer]="";
ifstream infile("/home/kevin/Music/test.mp3",ios::binary);
infile.seekg(-buffer,ios::end);
if(!infile || !infile.read(buf,buffer)){
cout<<"fail!"<<endl;
}
ID3v1 id3;
cout<<sizeof(id3)<<endl;
memcpy(&id3,buf,128);
cout<<id3.header<<endl;
}
struct ID3v1{
char header[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[28];
bool zerobyte;
bool track;
bool genre;
};
当我做memcpy时,它似乎将太多数据推送到标题字段中。我是否需要遍历每个结构成员并将数据复制到其中?我也在使用 c++,但这似乎更像是一种"C"策略。有没有更好的 c++ 方法?
如所有注释中所述(您缺少"\0"字符,或者在打印 C 字符串时运算符<<期望字符序列以"\0"结尾(。
尝试:
std::cout << std::string(id3.header, id3.header+3) << std::endl;
这将打印标题字段中的三个字符。
问题很可能在于memcpy
做了它所做的事情。
它将 128 字节复制到您的结构中。
然后,您尝试打印出标题。它打印第 1 个字符、第 2 个字符、第 3 个字符。并继续打印,直到找到' '
(字符串终止字符(。
基本上,在打印内容时,将标头复制到另一个 char 数组并附加终止字符(或复制到 c++ 字符串(。
使用memcpy时可能遇到的其他问题:
- 编译器可以将结构元素与单词边界对齐。大多数编译器都有一些杂注或命令行开关来指定要使用的对齐方式。
- 某些 CPU 要求将短裤或长整型存储在字边界上,在这种情况下,修改对齐方式将无济于事,因为您将无法从未对齐的地址读取。
- 如果你复制大于char的整数(如短或长(,你必须确保根据你的CPU架构纠正字节顺序。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 从向量到空指针的 memcpy(反之亦然)不起作用
- C++/Arduino:strcpy()、strncpy() 和 memcpy() 在无符号字符上不起作用
- 为什么在调用 memcpy 到 bool 值后 memcpy 到 int 不起作用
- 将std ::复制转换为std :: memcpy不起作用
- 为什么将字符数组复制到结构中时 memcpy 不起作用?
- 为什么从int到char的memcpy不起作用