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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите оптимизировать код, работа с файлами 
:(
    Опции темы
gosn1ck
Дата 6.5.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



суть задачи - в динамический массив загнать числа из файла и отсортировать

Код

int zbuf, *ptr;                   
long size = 0;                  
FILE * fin;
  fin = fopen ("in.txt", "r");

  char rbuf[127] = "";
  while (!feof(fin))               
  {
    fgets(rbuf, sizeof(rbuf)-1, fin);
    zbuf =  atoi(rbuf);
    size++;                           
  }

  ptr = new int [size];             

  fin = fopen ("in.txt", "r");
  for (int i = 0;!feof(fin); i++)    
  {
    fgets(rbuf, sizeof(rbuf)-1, fin);
    ptr[i] =  atoi(rbuf);
   // cout << ptr[i] << endl;
  }


у меня 2 вопроса. 1) можно ли узнать размер массива иным способом, а не перебирать строки? 
2) после чтения всего файла, как его прочитать еще раз, а не использовать повторно  fgets(rbuf, sizeof(rbuf)-1, fin); ?
PM MAIL ICQ   Вверх
azesmcar
Дата 6.5.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата
1) можно ли узнать размер массива иным способом, а не перебирать строки? 

нет, используй std::set и не мучай себя smile
Цитата
2) после чтения всего файла, как его прочитать еще раз, а не использовать повторно  fgets(rbuf, sizeof(rbuf)-1, fin); ? 

не надо читать второй раз, просто читай в первый раз в set

в принципе вот реализация того что тебе надо
Код

int main()
{
    std::ifstream fs("in.txt");
    std::set<int> vs((std::istream_iterator<int>(fs)), (std::istream_iterator<int>()));
    std::copy(vs.begin(), vs.end(), std::ostream_iterator<int>(std::cout, "\n"));
}

но давай на твой код посмотрим
Цитата
ptr = new int [size];

а удалять кто будет?
Цитата

size++;

в данном случае лучше использовать ++size он чуть чуть быстрее (если не считать что оптимизатор возможно сделает это за тебя)

Добавлено @ 10:52
gosn1ck
если хочешь без использования stl, тогда придется писать то что делает к примеру вектор самому (а именно перераспределение памяти)

Это сообщение отредактировал(а) azesmcar - 6.5.2009, 10:52
PM   Вверх
MAKCim
Дата 6.5.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(gosn1ck @  6.5.2009,  10:32 Найти цитируемый пост)
можно ли узнать размер массива иным способом, а не перебирать строки? 

если бы все числа были одинаковой длины, тогда да

Цитата(gosn1ck @  6.5.2009,  10:32 Найти цитируемый пост)
после чтения всего файла, как его прочитать еще раз, а не использовать повторно  fgets(rbuf, sizeof(rbuf)-1, fin); ? 

большая часть данных (если не все) уже будет буферизирована

как вариант, использовать инкрементирующийся буфер на 4096, 8192, 16384, ... байта


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
math64
Дата 6.5.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @  6.5.2009,  10:57 Найти цитируемый пост)
большая часть данных (если не все) уже будет буферизирована

Не будет - файл открывается заново.
Цитата(MAKCim @  6.5.2009,  10:57 Найти цитируемый пост)
если бы все числа были одинаковой длины, тогда да

Если числа разной длины, то выделяем сначала массив например на 1000 чисел. Заполнили эту 1000 - смортрим какую часть файла прочитали и например прочитали 40% - выделяем массив на 2500 чисел, копируем из старого в новый, старый удаляем. Если 2500 не хватит, аналогично выделяем снова. Это экономичнее, чем выделять 1024, затем 2048, 4196 и т.д.

PM   Вверх
gosn1ck
Дата 14.5.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



можно читать файл еще раз, без открытия и использования std ?
PM MAIL ICQ   Вверх
Remiznik
Дата 14.5.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 6.5.2009,  10:47)
Цитата

size++;

в данном случае лучше использовать ++size он чуть чуть быстрее (если не считать что оптимизатор возможно сделает это за тебя)

а можно вопрос почему будет быстрее ? очень интересно !!
PM MAIL   Вверх
azesmcar
Дата 14.5.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Remiznik @  14.5.2009,  17:41 Найти цитируемый пост)
а можно вопрос почему будет быстрее ? очень интересно !! 

реализация префиксного оператора (примерная конечно)
Код

value += 1;
return value;


реализация постфиксного
Код

int temp = value;
value += 1;
return temp;

не самая существенная оптимизация, но все же smile
PM   Вверх
Remiznik
Дата 14.5.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

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

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


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

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


 




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


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

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