Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с определением динамического массива 
:(
    Опции темы
АгатаКристи
Дата 16.6.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



Добрый день. В прошлый раз обращался на этот форум и мне очень помогли (огромное спасибо Dov за его вариант и вообще всем кто отписался).
Теперь у меня другая проблемка, причем я уж не знаю, в чем тут дело. Шаманизмом каким-то попахивает. Суть - имеется двоичный файл, считываем его и на основании тех или иных байтов делаем выводы. Среда - C++ Builder 6.

Код

int Maps = 0;
long int i=0;
long int size = 0; // Здесь у меня размер файла
char *file_name = new char[100]; // Название файла
file_name = OpenDialog1->FileName.c_str(); 
ifstream    in( file_name, ios::binary);
in.seekg(0,ios::end); // Если честно, позаимствовал. Как понял - эта функция проходит по входному потоку от начала (0) до конца файла.
size = in.tellg(); //А эта функция передает в переменную размер файла. Э… вроде. 
in.close();
in.open(file_name);
// size = 83805;
char *data = new char[size];
for(i=0;i<size;i++)  in.get(data[i]); // Считываем все в массив.

//[...] Здесь ничего существенного

for(i=0;i<size;i++) // Этим циклом ищем определенную последовательность байтов и считаем, сколько раз она встречается.
{
        if((long int)data[i]==31 && (long int)data[i+1]==-117 && (long int)data[i+2]==8)
        {
                Maps++; 

        }

}
                          MapsCount->Text = Maps; // Записываем

Проблема в том, что в таком случае массив оказывается испорченным - в него попадает начало файла, затем блок нулевых байтов, затем продолжение файла и затем до самого конца нулевые байты.
Однако переменная size считается правильно, если ее вывести до создания динамического массива (или вообще в любой момент), она выдаст корректное число.
Если же этот участок:
Код
in.seekg(0,ios::end);
size = in.tellg(); 
in.close();
in.open(file_name);

Закомментировать, а участок с явным объявлением размера раскомментировать, то все работает правильно. 
Мне кажется, что in.seekg и in.tellg() делают что-то нехорошее с данными… Но хоть убей не пойму, в чем же ошибка.  smile Заранее спасибо за помощь!


PM MAIL   Вверх
jonie
Дата 16.6.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

in.open(file_name);
режим ios::binary укажите вторым параметром.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
АгатаКристи
Дата 16.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



Цитата

режим ios::binary укажите вторым параметром.

Огромное спасибо, помогло =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0406 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.