2012-04-25 80 views
1

我想寫使用此代碼PGM文件..寫PGM文件

myfile << "P5" << endl; 
myfile << sizeColumn << " " << sizeRow << endl; 
myfile << Q << endl; 
myfile.write(reinterpret_cast<char *>(image), (sizeRow*sizeColumn)*sizeof(unsigned char)); 

如果我嘗試寫一個txt文件,它已經寫入字符表示。

如何將我的值寫入pgm文件以便它們正確顯示? 有沒有人有任何的鏈接,因爲我找不到它!

+0

是你有沒有工作?如果是這樣,怎麼樣? – 2012-04-25 21:20:13

+0

我不明白你的意思? – 2012-04-25 21:22:19

+0

http://en.wikipedia.org/wiki/Portable_graymap#PGM_example – 2012-04-25 21:25:00

回答

3

您可能不想使用std::endl,因爲它會刷新輸出流。另外,如果你想兼容Windows(以及可能來自Microsoft的任何其他操作系統),則必須以二進制模式打開該文件。 Microsoft默認情況下會以文本模式打開文件,它通常具有不兼容性特徵(古代DOS向後兼容性),不再需要任何人:它將每個「\ 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. 
0

確保使用ios::binary標誌以二進制模式打開文件。如果您使用的是Windows,則可能需要使用"\r\n"替換endl