我可以在没有临时变量的情况下将单字节写入文件吗?
Can I write single byte to a file without temporary variable?
我有一个简单的调试功能,可以将字节写入将显示为图像的文件。它遵循 ppm
格式。
原来我是这样用的:
static void SaveDebugImage(const std::string& filePath, const unsigned char* psdata, const int resolution)
{
// Debug: print stored data in file
std::ofstream file;
file.open(filePath, std::ios::out | std::ios::binary);
if (!file.is_open())
{
// Throws error and crashes the program on purpose
RError("[ImageDebug::SaveDebugImage] Cannot write to %s", filePath.c_str());
}
file << "P6"
<< "\n"
<< resolution << "\n"
<< resolution << "\n"
<< "255"
<< "\n";
const char zero = 0;
for (int i = 0; i < resolution * resolution; ++i)
{
file.write(reinterpret_cast<const char*>(pxdata), sizeof(*pxdata));
++pxdata;
file.write(reinterpret_cast<const char*>(pxdata), sizeof(*pxdata));
++pxdata;
file.write(&zero, sizeof(zero));
++pxdata;
}
file.flush();
file.close();
}
你可以看到它跳过了颜色的最后一个字节,那是因为数据不是严格的 RGB 图像,而是一种元信息格式。 R、G 和 B 通道意味着颜色以外的东西。您还可以观察到我必须用来写零的 const char zero = 0
的需要。
我现在手头有一个真正提供表面颜色的功能,它可能是这样的:
OurLibrary::Color getRealColor(byte r, byte g, byte b);
现在假设这个虚构的 Color
class 有一个 unsigned char getR() const
方法,我如何在没有临时变量的情况下将结果写入文件。现在我必须这样做:
OurLibrary::Color pixelColor(getRealColor( ... ));
const unsigned char colorR = pixelColor.getR();
file.write(reinterpret_cast<const char*>(&colorR), sizeof(colorR));
我更愿意:
file.write(pixelColor.getR());
有这样的方法吗?我在文档中找不到它。
每 the documentation, put
"inserts a character".
所以,简单地说:
file.put(pixelColor.getR());
(您 可能 需要转换为 char
以避免一些缩小转换警告;不确定。)
此外,flush()
完全没有意义。 C++ 流在关闭时刷新。
我有一个简单的调试功能,可以将字节写入将显示为图像的文件。它遵循 ppm
格式。
原来我是这样用的:
static void SaveDebugImage(const std::string& filePath, const unsigned char* psdata, const int resolution)
{
// Debug: print stored data in file
std::ofstream file;
file.open(filePath, std::ios::out | std::ios::binary);
if (!file.is_open())
{
// Throws error and crashes the program on purpose
RError("[ImageDebug::SaveDebugImage] Cannot write to %s", filePath.c_str());
}
file << "P6"
<< "\n"
<< resolution << "\n"
<< resolution << "\n"
<< "255"
<< "\n";
const char zero = 0;
for (int i = 0; i < resolution * resolution; ++i)
{
file.write(reinterpret_cast<const char*>(pxdata), sizeof(*pxdata));
++pxdata;
file.write(reinterpret_cast<const char*>(pxdata), sizeof(*pxdata));
++pxdata;
file.write(&zero, sizeof(zero));
++pxdata;
}
file.flush();
file.close();
}
你可以看到它跳过了颜色的最后一个字节,那是因为数据不是严格的 RGB 图像,而是一种元信息格式。 R、G 和 B 通道意味着颜色以外的东西。您还可以观察到我必须用来写零的 const char zero = 0
的需要。
我现在手头有一个真正提供表面颜色的功能,它可能是这样的:
OurLibrary::Color getRealColor(byte r, byte g, byte b);
现在假设这个虚构的 Color
class 有一个 unsigned char getR() const
方法,我如何在没有临时变量的情况下将结果写入文件。现在我必须这样做:
OurLibrary::Color pixelColor(getRealColor( ... ));
const unsigned char colorR = pixelColor.getR();
file.write(reinterpret_cast<const char*>(&colorR), sizeof(colorR));
我更愿意:
file.write(pixelColor.getR());
有这样的方法吗?我在文档中找不到它。
每 the documentation, put
"inserts a character".
所以,简单地说:
file.put(pixelColor.getR());
(您 可能 需要转换为 char
以避免一些缩小转换警告;不确定。)
此外,flush()
完全没有意义。 C++ 流在关闭时刷新。