快速写入数组中的重复值

时间:2014-08-04 17:07:46

标签: 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写入。

2 个答案:

答案 0 :(得分:4)

将数据传输到写入数组,或使用内存映射IO(如果您正在使用Windows CreateFileMappingMapViewOfFileEx,则Linux / Mac使用{{1} })。

mmap

使用内存映射IO,你可以做同样的事情,你不会需要&#34;写&#34;言。

答案 1 :(得分:2)

你可以尝试这样的事情。

将像素写入内存缓冲区std::stringstream,然后将其转储到文件中:

std::stringstream ss;

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

std::ofstream myFile("myfile.pix");

myfile << ss.rdbuf();

修改

您还可以设置内部缓冲区的大小以避免重新分配:

char buffer[size_of_image];
ss.rdbuf()->pubsetbuf(buffer, size_of_image);