std :: endlは出力ストリームをフラッシュするため、使用したくない場合があります。
さらに、Windows(およびおそらくMicrosoftの他のOS)との互換性が必要な場合は、ファイルをバイナリモードで開く必要があります。Microsoftは、デフォルトでファイルをテキストモードで開きます。これには、通常、誰も望まない非互換性機能(ancient-DOS-backward-compatibility)があります。すべての「\n」を「\r\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.