Перемещение курсора файла вверх по строкам? - PullRequest
3 голосов
/ 07 января 2012

Я погуглил это как сумасшедший, и я не могу найти вообще никакой ссылки на этот конкретный тип проблемы.

У меня есть StreamReader объект с файлом, и я хочу прочитать определенное количество строк в файле определенное количество раз, однако, похоже, нет никакого способа переместить курсор файла на определенные позиции в файле.

(Нет кода, потому что я понятия не имею, как мне написать что-то подобное)

Ответы [ 3 ]

3 голосов
/ 07 января 2012

Вы должны быть в состоянии использовать

myStreamReader.BaseStream.Position = desiredPosition;
myStreamReader.DiscardBufferedData();

для перемещения потока в определенное место.

РЕДАКТИРОВАТЬ: Следующий вопрос, как найти desiredPosition. Поскольку вы хотите переместить позицию назад через файл, а не вперед , из этого следует, что вы прочитали каждую позицию в некоторой точке. Вам нужно следить за тем, где вы находитесь в потоке, когда вы читаете свои строки, и сохранять позиции в List<int> positions. Изначально список должен содержать 0 в нулевой позиции. По мере обработки строк добавляйте длину строки плюс размер разрыва строки в список. Если вы хотите вернуться к строке k, positions[k] должна занять нужную вам позицию.

Например, если в вашем файле есть строки ниже, ваша кодировка использует один символ на букву, а разделитель строк в файле выполнен в стиле Windows \r\n

Quick
brown fox
jumps over lazy
dog

тогда ваш список positions должен иметь {0, 7, 17, 34} Обратите внимание, что я добавил 2 в каждой строке для символов-разделителей.

P.S. Это уродливое решение, не так ли? Если это какой-то комфорт, вы не первый человек, который столкнулся с ним. Вот несколько непристойные разговоры от кого-то, кто хотел решить подобную проблему еще в 2007 году.

0 голосов
/ 07 января 2012

нет способа позиционирования на точную строку ... только на абсолютный или относительный байт в файле ... если вам нужно позиционировать на строку, вам нужно реализовать это самостоятельно - либо загрузив файл в string[] (не рекомендуется для больших файлов!) или путем сканирования файла и построения индекса, содержащего абсолютную позицию для каждой строки, чтобы впоследствии вы могли использовать этот индекс до Seek до необходимой строки ...

0 голосов
/ 07 января 2012

Stream.Seek() ( Документы MSDN ) - это то, что вам нужно, но это абсолютная позиция в файле, и в ней нет понятия разрывов строк.

Я бы предпочел прочитать строки в память коллекции, а затем перебирать коллекцию в памяти так часто, как вам хочется, прежде чем загружать следующие несколько строк. На самом деле, если вы не говорите гигантские байты данных, просто прочитайте все линии в виде string объектов в List<string> и делайте с ним все, что вам нужно.

...