1

このコードを使用して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ファイルに書き込んで、正しく表示するにはどうすればよいですか?私はそれについて多くを見つけることができないので、誰かがリンクを持っていますか?

4

2 に答える 2

4

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.
于 2012-04-25T23:30:49.613 に答える
0

ios::binaryフラグを付けてファイルをバイナリモードで開いていることを確認してください。endlWindowsを使用している場合は、をに置き換えることをお勧め"\r\n"します。

于 2012-04-25T21:27:05.893 に答える