2012-04-25 3 views
1

Я пытаюсь написать файл, используя МПГ этот код ..Запись в PGM файл

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

Если я пытаюсь записать это в текстовый файл, он написал представление обугленного.

Как я могу записать свои значения в файл pgm, чтобы они отображались правильно? У кого-нибудь есть ссылки, так как я не могу найти много на нем!

+0

Это то, что вы не работаете? Если да, то как? –

+0

Я не понимаю, что вы имеете в виду? –

+0

http://en.wikipedia.org/wiki/Portable_graymap#PGM_example –

ответ

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) 

Это пример для вывода МПГ в файл:

#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. Вы можете заменить endl с помощью "\r\n", если вы используете Windows.