пытаюсь прочесть файл
От: _Фдуч Россия  
Дата: 01.04.06 11:42
Оценка:
пытаюсь прочесть файл

Здравствуйте человеки
Есть описание формата (полное описание прилогаеться 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++' — Кодт
Re: пытаюсь прочесть файл
От: vasya-serega Украина  
Дата: 01.04.06 21:39
Оценка:
Здравствуйте, _Фдуч, Вы писали:

_Ф>т.е. метка то как будто есть:

_Ф>1 как после нё начать читать картинку.
_Ф>2 какие типы использовать.
_Ф>3 и во что читать в массив, может стоит использовать структуру.

ну если есть описание формата, так и читай его внимательно
тогда должно стать понятно, что юзать и как!!!
а по той ссылке я нашел только твои месагу
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: пытаюсь прочесть файл
От: Кодт Россия  
Дата: 01.04.06 23:41
Оценка:
Здравствуйте, _Фдуч, Вы писали:

_Ф>пытаюсь прочесть файл


_Ф>Здравствуйте человеки

_Ф>Есть описание формата (полное описание прилогаеться http://forum.codenet.ru/showthread.php?s=&amp;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 туда.
Перекуём баги на фичи!
Re[2]: пытаюсь прочесть файл
От: Кодт Россия  
Дата: 01.04.06 23:45
Оценка:
Кстати о компиляторе.
Если он 16-битный (Borland C++ <=3.x), то int в нём 16-битный, и ты легко получишь
— целочисленное переполнение
— феерверки при работе с большими блоками данных

Выходов два:
— long вместо int, и обязательно huge модель памяти
— 32-битный компилятор
Перекуём баги на фичи!
Re[3]: пытаюсь прочесть файл
От: _Фдуч Россия  
Дата: 02.04.06 13:27
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Кстати о компиляторе.

К>Если он 16-битный (Borland C++ <=3.x), то int в нём 16-битный, и ты легко получишь
К>- целочисленное переполнение
К>- феерверки при работе с большими блоками данных

К>Выходов два:

К>- long вместо int, и обязательно huge модель памяти
К>- 32-битный компилятор


Пытаюсь начать использовать Microsoft Visual C++ 6.0 но до этого действительно я пользовался C++Builder 6

,я новичок , может быть есть какие-то еще идеи ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.