c++ - 结构 vector 上的 MemCpy

标签 c++ windows memcpy memory-mapped-files

我使用 MapVirtualFile 在 Window 下使用 C++ VS2010 映射文件。 空白是

  void*                   m_pVoiceData;

我现在想用数据填充一个结构 vector 。

结构是

struct udtPitchmark
{
    unsigned long ByteStart;
    unsigned long ByteCount;
    unsigned long F0;
};

struct udtPitchmarks
{
    vector<udtPitchmark>Pitchmarks;
};

我一直在用

void clsMapping::FeedPitchmarksFromMap(udtPitchmarks &uAudioInfo,unsigned long int uBytePos)
{

    unsigned int iCountPM;
    memcpy(&iCountPM, &((char*)(m_pVoiceData))[uBytePos],sizeof(unsigned long));

    uAudioInfo.Pitchmarks.resize(iCountPM);

    for (unsigned int i=0;i<iCountPM;i++)
    {
        iBytePos+=sizeof(unsigned long);
        unsigned long int iByteStart;
        memcpy(&iByteStart, &((char*)(m_pVoiceData))[iBytePos],4);

        iBytePos+=sizeof(unsigned long);
        unsigned long int iByteCount;
        memcpy(&iByteCount, &((char*)(m_pVoiceData))[iBytePos],4);

        iBytePos+=sizeof(unsigned long);
        unsigned int iF0;
        memcpy(&iF0, &((char*)(m_pVoiceData))[iBytePos],4);

        uAudioInfo.Pitchmarks[i].ByteStart =iByteStart;
        uAudioInfo.Pitchmarks[i].ByteCount =iByteCount;
        uAudioInfo.Pitchmarks[i].F0 =iF0;
    }
}

每个音高标记涉及 3 个 memcpy。 但我希望我能一次读完所有的音高标记。 但是我不确定该怎么做。

像这样存储的结构:

vector<udtPitchmarks>::iterator it = nPitchmarks.Content().begin();
for (;it != nPitchmarks.Content().end(); ++it)
{
    unsigned int iCountPMs = it->Pitchmarks.size();
    fwrite(&iCountPMs,sizeof(unsigned int),1,outfile);

    vector<udtPitchmark>::iterator it2 = it->Pitchmarks.begin();
    for(;it2 != it->Pitchmarks.end(); ++it2)
    {
        fwrite(&it2->ByteStart,sizeof(unsigned long),1,outfile);
        fwrite(&it2->ByteCount,sizeof(unsigned long),1,outfile);
        fwrite(&it2->F0,sizeof(unsigned long),1,outfile);
    }
}

有人可以帮忙吗?

最佳答案

您可以一次读取整个 udtPitchmark 结构

m_pVoiceData = (char *)m_pVoiceData + sizeof(unsigned int); // size field

memcpy( &uAudioInfo.Pitchmarks[i], (udtPitchmark *)m_pVoiceData + i, sizeof udtPitchmark );

或整个 vector :

memcpy( &uAudioInfo.Pitchmarks[0], (udtPitchmark *)m_pVoiceData, sizeof(udtPitchmark ) * iCountPM);

关于c++ - 结构 vector 上的 MemCpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901195/

相关文章:

java - 口译员会出错吗?

c++ - 在 C++ 代码中执行 Linux 终端命令

windows - 通过cmd获取网速(Windows)

c++ - 通过 UDP 套接字发送结构 memcopy C++

c - 使用 memcpy 填充结构

c++ - 遍历通用 STL 容器以检查是否存在

c++ - 具有引用模板参数的函数模板

android - 如何下载适用于安卓的谷歌源代码

c++ - Qt 与 WinRT C++ 构建问题

c - 程序因函数原型(prototype)声明而崩溃