пытаюсь прочесть файл
Здравствуйте человеки
Есть описание формата (полное описание прилогаеться
http://forum.codenet.ru/showthread.php?s=&threadid=30479 )
19. Изображение (BIL interleave)
Название объекта IMAGE_PAN //Как я понял это сама картинка
Тип объекта SDS //Что это такое ?
Тип данных uint8 (8-bit unsigned integer type) //Что это такое ?
Размер [n_image_lines][12288]* //Что это такое ?
Открыл этот файл блокнотом, сделал поиск и нашел несколько «меток» IMAGE_PAN
Т.е. как я понял после них начинается картинка
Даю код с помощи которого пытаюсь найти «метку» IMAGE_PAN
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
//-----------------------------------------------------------
int main(int argc, char* argv[])
{ char next;
char temp [10];
ifstream my("PAN1B.D080_018C.050905.hdf"); //поток чтения
int i=0;
//-------------------------------------------------------------ищю метку
do{
my>>next;
if (next =='I')
{
temp[0] = next;
my>>next;
if (next =='M')
{
temp[1] = next;
my>>next;
if (next =='A')
{
temp[2] = next;
my>>next;
}
}
}
i++;
}while(!my.eof());
//-----------------------------------------------------------------
my.close();
cout<<next<<endl;
cout<<temp[0]<<endl; //выводит какуето ботву как будто шрифты не те
cout<<temp[1]<<endl; // выводит какуето ботву как будто шрифты не те
cout<<temp[2]<<endl; // выводит какуето ботву как будто шрифты не те
cout<<i; //------------------------------в результате 908 проходов
getch();
return 0;
}
т.е. метка то как будто есть:
1 как после нё начать читать картинку.
2 какие типы использовать.
3 и во что читать в массив, может стоит использовать структуру.
Добавлена раскраска языка — тэг [ccode]. — Кодт
02.04.06 03:45: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, _Фдуч, Вы писали:
_Ф>т.е. метка то как будто есть:
_Ф>1 как после нё начать читать картинку.
_Ф>2 какие типы использовать.
_Ф>3 и во что читать в массив, может стоит использовать структуру.
ну если есть описание формата, так и читай его внимательно

тогда должно стать понятно, что юзать и как!!!
а по той ссылке я нашел только твои месагу

... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Здравствуйте, _Фдуч, Вы писали:
_Ф>пытаюсь прочесть файл
_Ф>Здравствуйте человеки
_Ф>Есть описание формата (полное описание прилогаеться http://forum.codenet.ru/showthread.php?s=&threadid=30479 )
_Ф>19. Изображение (BIL interleave)
_Ф>Название объекта IMAGE_PAN //Как я понял это сама картинка
Судя по описанию формата — да. До и после него идёт всякая служебная информация.
_Ф>Тип объекта SDS //Что это такое ?
Предположительно, "Some Data Set". В отличие от "ATTRIBUTE"
_Ф>Тип данных uint8 (8-bit unsigned integer type) //Что это такое ?
Берём книгу по ассемблеру или Си и смотрим, что такое 8-битное беззнаковое целое число.
Подсказка: это октет. Вторая подсказка: на подавляющем большинстве платформ октет это байт.
Третья подсказка: байт в Си — unsigned char.
Некоторые компиляторы предлагают также типы наподобие __uint8 или typedef — BYTE, UINT8 и т.п.
_Ф>Размер [n_image_lines][12288]* //Что это такое ?
Очевидно, что "количество строк изображения" (читай формат с начала), в каждой из которых — 12288 байт.
Количество строк определяется предыдущим объектом, LINE_COUNT_IMAGE. Я так думаю...
_Ф>Открыл этот файл блокнотом, сделал поиск и нашел несколько «меток» IMAGE_PAN
_Ф>Т.е. как я понял после них начинается картинка
Не считая случайных совпадений, когда байты 'I','M','A','G','E','_','P','A','N' входят в само изображение или другой бинарный блок.
_Ф>Даю код с помощи которого пытаюсь найти «метку» IMAGE_PAN
_Ф>#include <iostream.h>
_Ф>#include <fstream.h>
_Ф>#include <conio.h>
// Ты пользуешься древним компилятором, наверное, Borland C++ <=3 ?
// Хедеры <iostream.h>, <fstream.h> устарели,
// крайне рекомендуется использовать <iostream> и <fstream>.
// Но это так, тебе задел на будущее.
_Ф>//-----------------------------------------------------------
_Ф>int main(int argc, char* argv[])
_Ф>{ char next;
_Ф> char temp [10];
// Хоть бы инициализировал массив...
// Кстати, почему [10], если используешь только 3?
// Впрочем, тебе этот массив, по большому счёту, вообще не нужен.
_Ф> ifstream my("PAN1B.D080_018C.050905.hdf"); //поток чтения
// Ты открываешь файл по умолчанию, в так называемом "текстовом" режиме.
// Т.е. пары байтов 0x0D 0x0A (CR LF) будут прочтены как одиночные 0x0A (LF)
// а байт 0x1A (EOF) приведёт к остановке чтения
_Ф> int i=0;
_Ф>//-------------------------------------------------------------ищю метку
_Ф>do{
_Ф> my>>next;
_Ф> if (next =='I')
_Ф> {
_Ф> temp[0] = next; // по сути, просто: temp[0] = 'I'
_Ф> my>>next;
_Ф> if (next =='M')
_Ф> {
_Ф> temp[1] = next;
_Ф> my>>next;
_Ф> if (next =='A')
_Ф> {
_Ф> temp[2] = next;
_Ф> my>>next;
_Ф> }
_Ф> }
_Ф> }
// Я, конечно, понимаю, что это такое наколенное решение.
// А если бы сигнатура была не из 3 (IMA), а из 10 или 20 букв? Тоже наветвил бы if'ов?
_Ф> i++;
// i инкрементируется на каждый символ файла, за вычетом найденных выше I,M,A
// (там делается неучтённое чтение)
// а вовсе не количество найденных меток
_Ф>}while(!my.eof());
_Ф>//-----------------------------------------------------------------
_Ф>my.close();
_Ф>cout<<next<<endl;
// здесь ты выводишь последний прочтённый байт. Конечно, там мусор
_Ф>cout<<temp[0]<<endl; //выводит какуето ботву как будто шрифты не те
_Ф>cout<<temp[1]<<endl; // выводит какуето ботву как будто шрифты не те
_Ф>cout<<temp[2]<<endl; // выводит какуето ботву как будто шрифты не те
// это свидетельствует о том, что элементам temp[0], temp[1], temp[2] ничего ни разу не присвоено
// то есть, ни одну метку не нашли
_Ф>cout<<i; //------------------------------в результате 908 проходов
// Не проходов, а прочтённых символов в файле. Ровно столько (не считая CR'ов) было до первого EOF
_Ф>getch();
_Ф>return 0;
_Ф>}
_Ф>т.е. метка то как будто есть:
_Ф>1 как после нё начать читать картинку.
_Ф>2 какие типы использовать.
_Ф>3 и во что читать в массив, может стоит использовать структуру.
Мне кажется, искать сигнатуру IMAGE_PAN в файле, содержащем произвольные двоичные данные — неправильно.
Нужно читать файл, определяя границы каждого объекта и пропуская ненужные в соответствие с их размерами.
А найдя сперва LINE_COUNT_IMAGE и получив оттуда размер — выделить память на куче (new char[Nnnn] или malloc(Nnnn)) и считать блок из IMAGE_PAN туда.
Кстати о компиляторе.
Если он 16-битный (Borland C++ <=3.x), то int в нём 16-битный, и ты легко получишь
— целочисленное переполнение
— феерверки при работе с большими блоками данных
Выходов два:
— long вместо int, и обязательно huge модель памяти
— 32-битный компилятор