Если вы собираетесь искать в файле много разных строк (но не все), то вы можете получить некоторую выгоду от построения индекса по ходу работы. Используйте любое из предложений, которые уже здесь, но по мере того, как вы продвигаетесь, создайте массив смещений байтов для любых строк, которые вы уже нашли, чтобы вы могли избежать повторного сканирования файла с самого начала каждый раз. 1001 *
ДОПОЛНЕНИЕ:
Есть еще один способ сделать это быстро, если вам нужна только случайная «случайная» строка, но за счет более сложного поиска (если ответ Джона достаточно быстр, я бы определенно придерживался этого для простоты).
Вы могли бы выполнить «бинарный поиск», просто начав поискать на полпути вниз по файлу последовательности «1», и первое обнаруженное совпадение даст вам представление о том, какой номер строки вы нашли; затем в зависимости от того, где искомая линия относится к найденному числу, которое вы рекурсивно разделяете.
Для дополнительной производительности вы также можете сделать предположение, что строки примерно одинаковой длины, и алгоритм "угадывает" приблизительное положение искомой строки относительно общего количества строк в файле, а затем выполнить этот поиск оттуда и далее. Если вы не хотите делать предположения о длине файла, вы можете даже сделать его самонаправленным, просто сначала разделив его пополам, и используя номер строки, который он находит первым в качестве приблизительного значения количества строк в файле в целом.
Определенно нетривиально реализовать, но если у вас много произвольного доступа к файлам с большим количеством строк, это может окупиться приростом производительности.