2015-02-10 1 views
-1

Я пытаюсь работать с файлом BMP в Linux с компилятором g ++. Я использую язык C++.Woking С BMP-файлом в C++, Ubuntu

Мне нужно загрузить файл .bmp со стандартного ввода. например:

./a.out < test.bmp 

Для этого мне нужен код. Я думаю, что хранение всего файла .bmp хорош, я не знаю, как это сделать.

Я попробовал этот код, но он не работает:

vector<int> bitmap; 
int b; 
while (cin >> b) { 
    bitmap.push_back(b); 
    cout << "!" << endl; 
} 

Так как я должен делать это?

+0

Основная проблема заключается в том, что растровые файлы * бинарная *, то есть данные не структурированы в виде текста, и оператор ввода '>>' читает * текст * (фактически разделенные пробелами слова). –

+1

'.bmp' - это двоичный формат, используйте' cin.read() 'или другой подходящий метод для его чтения. –

+1

Кроме того, хотя файл растрового изображения не структурирован как текст, он * * структурирован. Вы не можете просто перетасовывать все данные в вектор как простой 'int', поскольку не все данные являются' int'. Возможно, вы захотите ознакомиться с [форматом файла BMP] (https://en.wikipedia.org/wiki/BMP_file_format). Существует также множество библиотек, доступных в системах на базе Linux, которые могут обрабатывать всю загрузку и сохранение многих форматов файлов и контейнеров и которые могут обрабатывать внутреннюю структуру файлов контейнера и их содержащихся данных изображения. Используй их! –

ответ

0

Я нашел ответ, который работает правильно. Этот код читает bmp_info_header из * .bmp файл из стандартного ввода:

char bmpHeader[54]; 
cin.get(bmpHeader, 54); 

«54» в cin.get() говорит системе, чтобы принять максимум 54 цифры от входа и игнорирует другие ,

Теперь, например, если мы хотим, чтобы найти * размер .bmp мы должны использовать этот код:

int filesize = *((int*)(headers + 2)); 
0

cin >> b считывает файл в текстовом режиме, это не для двоичных файлов. использовать что-то вроде этого:

ifstream myFile ("test.bmp", ios::in | ios::binary); 

открыть поток для файла, а затем

if (!myFile.read (buffer, 100)) { 
    // do thomething with data in buffer 
} 
+0

Итак, что мне делать? –

+0

Посмотрите примеры на http://www.cplusplus.com/doc/tutorial/files/ – VolAnd

+0

Проблема заключается в том, что я должен использовать стандартный ввод. Как я могу использовать fstream, пока я должен предоставить файл в этом виде: ./a.out