Я сталкивался с этим ранее сегодня, и я не был уверен, почему это происходит.
У меня есть следующий код, который устанавливает внутреннюю позицию потока файла в местоположение, чтобы я мог прочитать количество строк из этой позиции.Это похоже на этот другой пост , но когда я использовал stream.Seek
, я вижу странные результаты
StringBuilder b = new StringBuilder();
using(var stream = _streamFactory.CreateStream())
using (var streamReader = new System.IO.StreamReader(stream, _streamFactory.Encoding))
{
stream.Seek(startPosition, System.IO.SeekOrigin.Begin);
string value;
for (int i = 0; i < lines; i++)
{
if ((value = streamReader.ReadLine()) != null)
{
b.AppendLine(value);
}
}
}
Теперь я читаю файл с использованием кодировки UTF-8, поэтому яЯ знаю, что в начале файла есть дополнительные биты, которые обозначают это, но не являются частью текста, который я хочу извлечь.
Скажите для примера У меня есть следующий текст в файле
Hello my name is bob
Так что, если я установлю startPosition
в 0, мои результаты будут Здравствуйте, меня зовут Боб однако, когда я устанавливаю startPosition
в 1, я не получаю ello, меня зовут bob , а скорее @@ Здравствуйте, меня зовут bob , где @@ - 2 байта от битов кодирования.
Итак, мой вопрос: почему, когда я устанавливаю .Seek(0)
, а затем делаю ReadLine
, я получаю правильную строку, но Seek(1)
вернет 2-й и 3-й байты кодировки?
Seek(3)
также даст те же результаты, что и Seek(0)
.Если бы это было согласованно, я бы подумал, что Seek(0)
вернет @@@ Привет, меня зовут Боб
Также, как узнать, сколько дополнительных байтов в начале файла безчитая его (но зная кодировку)?
Я пытался посмотреть на разобранный код и должен был остановиться, прежде чем мой мозг начал бастовать.
Примечание: Streambuilder вэтот случай просто создает FileStream
.Я делаю это, так что я могу модульное тестирование этого кода, используя MemoryStream