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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как загрузить 
:(
    Опции темы
MsLive
  Дата 4.9.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Использую:

Код

    struct    _car_Item;
    fread (&item_count, sizeof(int), 1, SaveFile);// get item count
    CarTempItem=new _car_Item[item_count+1];// create array()
    fread (CarTempItem, sizeof(_car_Item), item_count, SaveFile);
fclose (SaveFile);

-В данном коде загружается весь массив в память- ведь нельзя создать оператором new один массив на конкретной позиции.
А как можно по другому сделать?
Заранее благодарен.

Это сообщение отредактировал(а) MsLive - 4.9.2008, 11:37
PM MAIL   Вверх
Rickert
Дата 4.9.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Что это было? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Goganchic
Дата 4.9.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Согласен с предыдущим постом: сначала ты для себя определись что ты хочешь, потом сформулируй вопрос по-человечески
PM Jabber   Вверх
Lazin
Дата 4.9.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата

-В данном коде загружается весь массив в память- ведь нельзя создать оператором new один массив на конкретной позиции.
А как можно по другому сделать?

оператор new может создавать объекты по одному, и из файла их то-же можно читать по одному, этот код можно достаточно просто передалать...
есть более ООП вариант, перегрузить для _car_Item (кстати так структуру называть не стоит), операторы
Код

istream& operator >> (istream&, _car_Item&);

и
Код

ostream& operator << (_car_Item&, ostream&);

и дальше работать с iostream...
PM MAIL Skype GTalk   Вверх
Rickert
Дата 4.9.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Что это было 2? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 4.9.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



в коде сначала определяется размер файла, потом создается массив объектов, затем он считывается из файла (так будет работать только для POD типов), вопрос собственно был в том, можно-ли по другому это сделать, как я понял, не загружая весь файл в память(допустим он большой), а загружая по частям, или вообще по одному объекту

Добавлено через 2 минуты и 33 секунды
только тогда придется сделать несколько вызывать fread а так-же выделять и освобождать память динамически в цикле вот и вся разница
PM MAIL Skype GTalk   Вверх
Rickert
Дата 4.9.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



У нас появился телепат. Теперь можно поднимать целое кладбище топиков. Трибуну мне, графин!

Lazin, готовься к дешифровке smile 
СУВ smile


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MsLive
Дата 4.9.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

вопрос собственно был в том, можно-ли по другому это сделать, как я понял, не загружая весь файл в память(допустим он большой), а загружая по частям, или вообще по одному объекту.

Да, именно так.
Я хотел сначала вот так сделать(через указатель):
Код

_car_Item *CarTempItem2=new _car_Item;    
_car_Item *CarTempItem[100000000];CarTempItem[2]=CarTempItem2;
    fread (CarTempItem[2], sizeof(_car_Item),1, SaveFile);

- Но не работает(а вроде должно) :(

Поделитесь если кто делал, плиз.

Добавлено через 2 минуты и 37 секунд
Цитата(Rickert @ 4.9.2008,  16:17)
У нас появился телепат. Теперь можно поднимать целое кладбище топиков. Трибуну мне, графин!

Lazin, готовься к дешифровке smile 
СУВ smile

А чего тут собственно непонятно smile 
PM MAIL   Вверх
Lazin
Дата 4.9.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MsLive @  4.9.2008,  21:47 Найти цитируемый пост)
А чего тут собственно непонятно

все smile

Добавлено @ 03:18
Код

    struct    _car_Item;
    fread (&item_count, sizeof(int), 1, SaveFile);// get item count
    size_t chunk_size = 32;
    size_t steps = item_count / chunk_size;
    size_t last_chunk_size = item_count % chunk_size;
    for(size_t i = 0; i < steps; ++i)//читаем блоками по sizeof(_car_Item) * chunk_size байт
    {
        _car_Item* chunk =new _car_Item[chunk_size];
        fread (chunk, sizeof(_car_Item), chunk_size, SaveFile);
        //делаем что то с chunk
        for(size_t j = 0; j < chunk_size; ++j)
            chunk[j]...???
        delete [] chunk;
    }
    _car_Item* last_chunk = new _car_Item[last_chunk_size];
    fread (last_chunk, sizeof(_car_Item), last_chunk_size, SaveFile);//читаем все что осталось
    //делаем что то с последними элементами
    for(size_t j = 0; j < last_chunk_size; ++j)
        last_chunk[j]...???
    delete [] last_chunk;
    fclose (SaveFile);

нвдаваясь особо в подробности, переделал на чтение блоками по 32 * sizeof(_car_Item) байт
но у этого кода есть недостатки, в частности здесь может быть утечка памяти, так как код небезопасен с точки зрения исключений, еще так можно работать только с POD типами
зы
код не компилировал

Это сообщение отредактировал(а) Lazin - 4.9.2008, 22:42
PM MAIL Skype GTalk   Вверх
MsLive
Дата 5.9.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

   struct    _car_Item;
    fread (&item_count, sizeof(int), 1, SaveFile);// get item count
    size_t chunk_size = 32;
    size_t steps = item_count / chunk_size;
    size_t last_chunk_size = item_count % chunk_size

А зачем нужно использовать item_count?
Я имел ввиду то, что мне нужно загрузить один объект с файла, который хранит тысячи объектов:
Код

//----------------
{
int *objects=new int[1000];
fwrite (objects, sizeof(int),1000, SaveFile);
}
//--------------------
// Допустим перед загрузкой сохранили объекты в файл.
// Теперь нужно загрузить объект под номером 5 в tager_result
int tager_result;
{
int *objects=new int[1000];
fread (objects, sizeofint),1000, SaveFile);
tager_result=objects[5];// загрузили
delete [] objects;// удалили temp массив; НО загрузили то весь файл- и это тормознуло компьютер.
}


Это сообщение отредактировал(а) MsLive - 5.9.2008, 13:14
PM MAIL   Вверх
Lazin
Дата 5.9.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



то что ты имел ввиду, и то, что мы поняли, это две разные вещи...

что-бы загрузить один объект, если конечно объекты одного размера, то нужно определить его смещение в файле и прочитать N байт по этому смещению
PM MAIL Skype GTalk   Вверх
MsLive
Дата 5.9.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

то нужно определить его смещение в файле и прочитать N байт по этому смещению 

Но а если до этого смещения мусор(тип неизвестен) то как определить количество N байт.
Конечно можно разбросать по файлам но smile 
Хотелось бы сделать как я написал выше:
Код

_car_Item *CarTempItem2=new _car_Item;    
_car_Item *CarTempItem[100000000];CarTempItem[2]=CarTempItem2;
    fread (CarTempItem[2], sizeof(_car_Item),1, SaveFile);

-Но как они это сделали -не понятно(нельзя выполнять действия через указатель)- это очень странно тем более для msvc++ 
PM MAIL   Вверх
Lazin
Дата 5.9.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(MsLive @  5.9.2008,  18:16 Найти цитируемый пост)
Но а если до этого смещения мусор(тип неизвестен) то как определить количество N байт.

никак, есть такое понятие как формат файла, оно включает в себя способ чтения данных из файла smile 

Цитата(MsLive @  5.9.2008,  18:16 Найти цитируемый пост)
Хотелось бы сделать как я написал выше:

код очень странный, зачем нужны сто миллионов указателей, если потом читается только один объект, жуть какая-то...
PM MAIL Skype GTalk   Вверх
MsLive
Дата 5.9.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

код очень странный, зачем нужны сто миллионов указателей, если потом читается только один объект, жуть какая-то... 

Сто миллионов указателей нужны для того, чтобы загрузить миллионный массив(на запас) smile 
Т.е. Мне нужно получить объект находящийся на позиции 2(как написано в коде)
Зы ведь указатели ничего не берут.
PM MAIL   Вверх
cutwater
Дата 5.9.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поправка, вот только занимают место в стеке, обычно по 4 байта каждый (на 32 битной системе)


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

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

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

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

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


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

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


 




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


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

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