С# - Произвольный доступ в файле - Big лажа

xaka 24.03.2004 - 17:05 | У меня наблюдается очень странная вещь, из-за которой я начинаю сомневаться в C#. Есть вот такой код: FileStream inFile = new FileStream(FileName, FileMode.Open, FileAccess.Read); StreamReader FileReader = new StreamReader(inFile); После этого при отладке пока что идут вот такие значения: FileReader.BaseStream.Position = 0; FileReader.BaseStream.Leight = 5880; - сюда не сморите, это точное значение и роли данное поле не играет Где: FileReader.BaseStream - это есть inFile. Тоесть тут у нас все ОК. Идем дальше и пишет вот такую вот строчку: String anyString = ""; anyString = Convert.ToChar(FileReader.Read()); И вот вам и странность(в отладчике сразу же видем): FileReader.BaseStream.Position = 1024; FileReader.BaseStream.Leight = 5880; Как это понимать? Я прочитал один байт, а позиция уже на 1024-ом? Причем дальнейшее чтение файла идет нормально, но вот позиция остается неизменной - она всегда равна 1024!!! Ну да ладно, фиг с ней, но МНЕ нужен произвольный доступ в файле и я делаю вот что(к строке всегда все прибавляется): Пускай в файле у нас: ABCD После первого чтения: Позиция на "A" После второго: Позиция на "AB" А потом вот это: FileReader.BaseStream.Seek(-1, SeekOrigin.Current) или можно так: FileReader.BaseStream.Seek(FileReader.BaseStream.Position - 1, SeekOrigin.Begin) И как вы понимаете я должен вернуться к символу "A", тоесть вернуться на байт НАЗАД!!! НО!!: После третьего чтения: Позиция на "ABC" И хотя поле Position изменилось на 1 назад, но чтение всерано идет не с нужной мне позиции. Все это написаное относится к ТЕКСТОВОМУ ФАЙЛУ. Я работаю с ним. Так что, кто ПОНЯЛ, что тут за ФИГНЯ прошу откликнуться. Почему не работает ПРОИЗВОЛЬНОЕ ПОЗИЦИОНИРОВАНИЕ??? P.S. многие скажут - проверь поле FileReader.BaseStream.CanSeek, а я вам заранее отвечу: оно установлено в True. Так что давайте думать вместе.
Bronya 1 - 24.03.2004 - 19:45 | Прикольно. Может просто фреймворк сыроватый? У меня вроде все ок. Сегодня еще разок попробую!
xaka 2 - 24.03.2004 - 20:36 | А шишь его знает - вроде 1.1 версия. Студия 7.1 Ты пробуй StreamReader и именно текстовые файлы. И еще такой вопрос: есть ли чтоли бо подобное на С#, как например scanf(...)на С? Чтобы сама вытягивала int, float, char, string...
Bronya 3 - 24.03.2004 - 22:08 | Грустно читать в мануале зачем и почему так перевернули эти стримы Попробуй делать так static void Main(string[] args) { String fileName = "c:\\1.txt"; FileStream inFile = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(inFile, Encoding.GetEncoding(1251)); while (Console.ReadLine().ToLower() != "end") { Console.WriteLine(reader.ReadChar()); Console.WriteLine(reader.BaseStream.Position); } reader.Close(); inFile.Close(); Console.WriteLine("Press Enter to continue..."); Console.ReadLine(); }
xaka 4 - 25.03.2004 - 11:31 | Bronya, так я прав насчет якобы ГЛЮКА? И что это за код ты мне тут накрамсал?
Bronya 5 - 25.03.2004 - 13:49 | Прав, но это вроде не глюк, а так положено. Пост 1 я писал, помня, что год назад разбирался с этим делом и у меня все получилось. Делал я так, как показано в примере 3.
Bronya 6 - 25.03.2004 - 14:14 | А по поводу scanf вроде ничего подобного нет Нужно самому парсить строку, для одинарных значений, например, так Int32.Parse("12345") или пользоваться классом Convert Для более сложного разбора пользуйся регэкспами из класса RegEx
xaka 7 - 25.03.2004 - 19:29 | 1)Ну тогды большое тебе спасибо - очень помог, а то я сомневаться стал насчет правильности С# - как это - такую легкую вещь и неможет. В инете нашел инфу, где указано, что SreamReader выделяет какой-то буфер размеров 1024байта и поэтому позиция сразу же становится равно 1024. 2)Немог бы поподробнее насчет этого самого парсинга, есть у тя примеры, описание, или инфа(ссылка в инете)?

>>