c++ - 快速写入数组中的重复值

标签 c++ arrays file memory

我有一个关于使用 C++ 快速写入文件的快速问题。我正在处理灰度彩色图像,因此我在数组中为图像的每个 x、y 位置存储一个 8 位值(范围从 0-255)。

但是,在读入这些值后,我需要将它们写成 RGB 格式,从而为每个 x,y 位置存储 3、8 位值。直观的做法是在移动到下一个值之前连续写入每个值 3 次。

这是我正在做的示例代码:

for(int f = 0; f < totalFrames; f++){
    for(int i = 0; i < imageSize; i++){
        int index = i +(f*320*240);
        myFile << pixelBuffer[index];
        myFile << pixelBuffer[index];
        myFile << pixelBuffer[index];
    }
}

如果数组中的值都是连续存储的,我可以简单地使用:

myFile.write((const char*)pixelBuffer, totalFrames * imageSize); 

但事实并非如此,所以我想知道是否有一种方法可以偏移我写入每个值的位置,这样我就可以每帧​​进行三个写入调用,而不是 imageSize*3 写入。

最佳答案

要么将数据传输到一个用于写入的数组,要么使用内存映射 IO(如果您使用的是 Windows CreateFileMappingMapViewOfFileEx,Linux/Mac 使用mmap).

using pixel_t = /* what type is your data? */;
pixel_t* writeBuffer = new pixel_t[imageSize];
pixel_t* writePtr = writeBuffer;

for(size_t f = 0; f < totalFrames; f++){
    for(size_t i = 0; i < imageSize; i++){
        const size_t index = i + (f * 320 * 240);
        const pixel_t data = pixelBuffer[index];
        *writePtr++ = data;
        *writePtr++ = data;
        *writePtr++ = data;
    }
    myFile.write((const char*)writeBuffer, imageSize); 
}

delete[] writeBuffer;

使用内存映射 IO,您可以做几乎相同的事情,只是不需要“write”语句。

关于c++ - 快速写入数组中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123969/

相关文章:

c++ - 欧拉计划(#17)

c++ - cpp :-1: error: C1041: cannot open program database; untitled-build-desktop-debug\vc120. pdb'

C#:是否可以在 SQL 数据库中存储十进制数组?

c - 为什么我的变量没有被保存?我一直在测试这段代码,但我的变量没有保存到我的结构数组中

java - NoSuchElementException:未找到行 - Scanner Java

c++ - 是否有一个好的 C++ 库来读取、创建和修改 BER 编码文件?

c++ - Qt5多线程: signals work in one-way only

c++ - 将数组内容传递给特定函数时数组内容会发生变化

C 密码数据库

python - 如何从特定文件开始打开目录中的文件