c++ - 在二进制文件中写入对齐数据

标签 c++ file alignment

我正在创建一个包含一些数据对象的文件。数据对象有不同的大小,是这样的(非常简单):

struct Data{
   uint64_t size;
   char     blob[MAX_SIZE];
// ... methods here:
}

在后面的某个步骤中,文件将在内存中被 mmap(), 所以我希望每个数据对象的开头都以 8 字节对齐的内存地址开始,其中 uint64_t size 将被存储(让我们忽略字节顺序)。

代码看起来或多或少是这样的(目前硬编码 8 字节):

size_t calcAlign(size_t const value, size_t const align_size){
    return align_size - value % align_size;
}

template<class ITERATOR>
void process(std::ofstream &file_data, ITERATOR begin, ITERATOR end){
    for(auto it = begin; it != end; ++it){
        const auto &data = *it;

        size_t bytesWriten = data.writeToFile(file_data);

        size_t const alignToBeAdded = calcAlign(bytesWriten, 8);

        if (alignToBeAdded != 8){
            uint64_t const placeholder = 0;

            file_data.write( (const char *) & placeholder, (std::streamsize) alignToBeAdded);
        }
    }
}

这是在文件内实现对齐的最佳方式吗?

最佳答案

你不需要依赖writeToFile来返回大小,你可以使用ofstream::tellp

const auto beginPos = file_data.tellp();
// write stuff to file
const auto alignSize = (file_data.tellp()-beginPos)%8;
if(alignSize)
    file_data.write("\0\0\0\0\0\0\0\0",8-alignSize);

编辑帖子 OP 评论: 在一个最小的例子上进行了测试,它有效。

#include <iostream>
#include <fstream>
int main(){
    using namespace std;
    ofstream file_data;
    file_data.open("tempfile.dat", ios::out | ios::binary);
    const auto beginPos = file_data.tellp();
    file_data.write("something", 9);
    const auto alignSize = (file_data.tellp() - beginPos) % 8;
    if (alignSize)
        file_data.write("\0\0\0\0\0\0\0\0", 8 - alignSize);
    file_data.close();
    return 0;
}

关于c++ - 在二进制文件中写入对齐数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233479/

相关文章:

c++ - 不同节点的相同地址

c++ - 有进度的快速文件复制

python - Pandas 数据框数据透视表和分组

c++ - C++ 中的可变大小数组

c++ - 是否有 C++ 预处理器指令的在线手册?

java - 等待 Java 创建文件

html - 如何左/右对齐元素并调整垂直高度

java - 如何在 JavaFX 中对齐三个或更多按钮上的一行?

c++ OpenSSL,将公钥写入文件并从同一文件中读取它不会返回正确的 key

php - Illustrator 以 PDF 格式打开