2012-01-07 3 views
3

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

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

(Нет кода, потому что я понятия не имею, как я бы идти о написании что-то вроде этого)

+0

Нужно ли вам определенная позиция (например, 17) ИЛИ вы имеете в виду определенную строку (например, строку 3)? – Yahia

+0

определенная строка, но строка всегда будет одним и тем же символом (одна строка, содержащая символ '{') –

+0

, нет никакого способа разместить точную строку ... только до абсолютного или относительного байта внутри файла. ,если вам нужно позиционировать линию, вам необходимо реализовать это самостоятельно - либо путем загрузки файла в строку [], либо путем сканирования файла и построения индекса, содержащего абсолютную позицию для каждой строки ... – Yahia

ответ

3

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

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

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

EDIT: Следующий вопрос: как найти 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. Это уродливое решение, не так ли? Если это любой комфорт, вы не первый человек, который столкнулся с ним. Here is a somewhat obscene rant от кого-то, кто хотел решить подобную проблему еще в 2007 году

0

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

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

+2

gigglebytes, tee hee ! –

0

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

Смежные вопросы