我正在尝试使用此代码编写pgm文件..
myfile << "P5" << endl;
myfile << sizeColumn << " " << sizeRow << endl;
myfile << Q << endl;
myfile.write( reinterpret_cast<char *>(image), (sizeRow*sizeColumn)*sizeof(unsigned char));
如果我尝试将其写入.txt文件,则会写入char表示。
如何将我的值写入pgm文件以便正确显示? 有没有人有任何链接,因为我找不到它!
答案 0 :(得分:4)
您可能不想使用std::endl,因为它会刷新输出流。
另外,如果您想要与Windows(以及可能是Microsoft的任何其他操作系统)的兼容性,您必须以二进制模式打开该文件。默认情况下,Microsoft以文本模式打开文件,这通常具有不兼容性(古老的DOS向后兼容性),不再需要它:它用“\ r \ n”替换每个“\ n”。
PGM文件格式标题是:
"P5" + at least one whitespace (\n, \r, \t, space)
width (ascii decimal) + at least one whitespace (\n, \r, \t, space)
height (ascii decimal) + at least one whitespace (\n, \r, \t, space)
max gray value (ascii decimal) + EXACTLY ONE whitespace (\n, \r, \t, space)
这是将pgm输出到文件的示例:
#include <fstream>
const unsigned char* bitmap[MAXHEIGHT] = …;// pointers to each pixel row
{
std::ofstream f("test.pgm",std::ios_base::out
|std::ios_base::binary
|std::ios_base::trunc
);
int maxColorValue = 255;
f << "P5\n" << width << " " << height << "\n" << maxColorValue << "\n";
// std::endl == "\n" + std::flush
// we do not want std::flush here.
for(int i=0;i<height;++i)
f.write( reinterpret_cast<const char*>(bitmap[i]), width );
if(wannaFlush)
f << std::flush;
} // block scope closes file, which flushes anyway.
答案 1 :(得分:0)
确保使用ios::binary
标志以二进制模式打开文件。如果您使用的是Windows,则可能需要将endl
替换为"\r\n"
。