| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Взять рандомно одну строку из файла |
| Автор: Валерия 1.5.2008, 18:58 |
| Собсвтенно есть файл, допустим несколько мегабайт, в котором по одной в строку идут слова. Нужно в переменную загнать рандомно одну строку. Вариант там где весь файл грузим в массив, каждый елемент - строка, не устраивает, т.к очень не экономичный. Нужно что то пошустрее и что бы поменьше памяти кушало. Слова по длинне разные, поэтому не получиться отсчитать n*длинна_строки байт и потом прочитать эту строку, хотя это будет крайний вариант, если ничего не выйдет то пробелов в конец понаставляю которые потом буду обрезать |
| Автор: Proger89 1.5.2008, 20:45 |
| Можно получив номер строки, читать блоками файл, и считать с начала файла количество переходов на новую строку. Когда количество пройденных 10, 13 ,будет равно полученному случайному числу, необходимо считать следуюшую строку. Для этой затеии можно отобразить файл в память и читать файл как массив. Только не забывай что конец строки состоит из двух символов. |
| Автор: vinter 1.5.2008, 20:52 |
чем это? это работает быстро, а память кушать будет в 3 сек.(образно) от выполнения приложения, это много? |
| Автор: Валерия 1.5.2008, 21:11 | ||
Это очень много, скрипт вызываеться десяток раз за секунду. Всетаки добавлю везде в конец какихто символов, и буду через fseek переходить на нужный байт.. |
| Автор: JackYF 1.5.2008, 21:49 |
| Ежели файл один и тот же, можно один раз проиндексировать его, сделав массив индексов, а затем переходить по случайному элементу из массива индексов. |
| Автор: Валерия 1.5.2008, 22:58 | ||||
| Я поняла про что вы, т.е хранить байт начала строки каждой. Но сделала по другому, просто было
стало
и теперь просто строку на которую мне нужно перейти, умножаю на количество байт любой строки, юзаю fseek и вуаля вроде быстро пашет!) всем спасибо) |
| Автор: MAKCim 2.5.2008, 09:14 |
| Валерия, плохое решение имхо |
| Автор: W4FhLF 2.5.2008, 09:45 |
| Просто неприемлемое, я бы сказал А если разница между максимальной и минимальной длиной строки будет, скажем, 100 символов? Причём из 100000 строк в твоём файле (условно) одна будет 100 символов, а остальные 10, то тебе придётся дописать 99999*90 = 8999910 байт данных в исходный файл А если запретят менять исходную структуру или вообще писать в файл? Причём сама по себе индексация отнимает на порядок меньше операций, недели твой вариант. |
| Автор: Валерия 3.5.2008, 02:16 |
| Сомневаюсь что с индексацией будет работать быстрее, тем более сам файл будет меняться очень редко, если вообще будет... Я на пхп скриптик написала который приводит файл к нужному виду) |