我有一个关于使用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写入。
答案 0 :(得分:4)
将数据传输到写入数组,或使用内存映射IO(如果您正在使用Windows CreateFileMapping
和MapViewOfFileEx
,则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);