Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Взять рандомно одну строку из файла


Автор: Валерия 1.5.2008, 18:58
Собсвтенно есть файл, допустим несколько мегабайт, в котором по одной в строку идут слова.
Нужно в переменную загнать рандомно одну строку.
Вариант там где весь файл грузим в массив, каждый елемент - строка, не устраивает, т.к очень не экономичный.
Нужно что то пошустрее и что бы поменьше памяти кушало.
Слова по длинне разные, поэтому не получиться отсчитать n*длинна_строки байт и потом прочитать эту строку, хотя это будет крайний вариант, если ничего не выйдет то пробелов в конец понаставляю которые потом буду обрезать smile

Автор: Proger89 1.5.2008, 20:45
Можно получив номер строки, читать блоками файл, и считать с начала файла количество переходов на новую строку. Когда количество пройденных 10, 13 ,будет равно полученному случайному числу, необходимо считать следуюшую строку.
Для этой затеии можно отобразить файл в память и читать файл как массив.
Только не забывай что конец строки состоит из двух символов.

Автор: vinter 1.5.2008, 20:52
Цитата(Валерия @  1.5.2008,  19:58 Найти цитируемый пост)
 т.к очень не экономичный.

чем это? 
Цитата(Валерия @  1.5.2008,  19:58 Найти цитируемый пост)
Нужно что то пошустрее и что бы поменьше памяти кушало.

это работает быстро, а память кушать будет в 3 сек.(образно) от выполнения приложения, это много?

Автор: Валерия 1.5.2008, 21:11
Цитата(vinter @ 1.5.2008,  20:52)
Цитата(Валерия @  1.5.2008,  19:58 Найти цитируемый пост)
Нужно что то пошустрее и что бы поменьше памяти кушало.

это работает быстро, а память кушать будет в 3 сек.(образно) от выполнения приложения, это много?

Это очень много, скрипт вызываеться десяток раз за секунду.
Всетаки добавлю везде в конец какихто символов, и буду через fseek переходить на нужный байт..

Автор: JackYF 1.5.2008, 21:49
Ежели файл один и тот же, можно один раз проиндексировать его, сделав массив индексов, а затем переходить по случайному элементу из массива индексов.

Автор: MAKCim 1.5.2008, 22:07
Цитата(JackYF @  1.5.2008,  21:49 Найти цитируемый пост)
Ежели файл один и тот же, можно один раз проиндексировать его, сделав массив индексов, а затем переходить по случайному элементу из массива индексов. 

а в качестве индекса хранить смещение в файле

Автор: Валерия 1.5.2008, 22:58
Я поняла про что вы, т.е хранить байт начала строки каждой.
Но сделала по другому, просто было
Код

11
2222
3333333

стало
Код

11_____
2222___
3333333

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

Автор: MAKCim 2.5.2008, 09:14
Валерия, 
плохое решение
имхо

Автор: W4FhLF 2.5.2008, 09:45
Просто неприемлемое, я бы сказал smile


Цитата(Валерия @  1.5.2008,  22:58 Найти цитируемый пост)
юзаю fseek и вуаля вроде быстро пашет!)всем спасибо)


А если разница между максимальной и минимальной длиной строки будет, скажем, 100 символов? Причём из 100000 строк в твоём файле (условно) одна будет 100 символов, а остальные 10, то тебе придётся дописать 99999*90 = 8999910 байт данных в исходный файл smile 

А если запретят менять исходную структуру или вообще писать в файл? 

Причём сама по себе индексация отнимает на порядок меньше операций, недели твой вариант. 

Автор: Валерия 3.5.2008, 02:16
Сомневаюсь что с индексацией будет работать быстрее, тем более сам файл будет меняться очень редко, если вообще будет...
Я на пхп скриптик написала который приводит файл к нужному виду)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)