Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

После чтения StreamReader'ом, его методом ReadLine, вернуться к предыдущей строке

12.12.2011, 22:41. Показов 7613. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто-нибудь в курсе, реально ли после прочтения строки, вернуться на прошлую позицию. Вот смотрите пример:
Пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        static void Main(string[] args)
        {
            string text = "привет\r\nидти\r\nсмотреть\r\nпилить";
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bytes = encoding.GetBytes(text);
 
            using (MemoryStream ms = new MemoryStream(bytes))
            using(StreamReader sr = new StreamReader(ms))
            {
                Console.WriteLine(sr.ReadLine());
                Console.WriteLine(sr.ReadLine());
                Console.WriteLine(sr.ReadLine());
            }
 
            Console.ReadKey();
        }

В переменной text 4 слова: "привет", "идти", "смотреть", "пилить" (разбито на 4 строки). После выполнения вышеприведённого кода в консоль выведутся 3 слова (ну я 3 раза читал из потока по строке). То есть, если я захочу дальше читать из StreamReader, то мне останется только прочитать последнюю строку, на 5-ый раз ReadLine вернёт null (оно и понятно, все 4 строки прочитаны). Вот возможно ли как-то прочитав 3 строки вернуться на одну строку назад?

Вот есть код, я пробовал возврашать с помощью streamReaders[i].BaseStream.Position = previousPosition, но оказывается при чтении ...BaseStream.Position сдвигается не на одну строку, а на какое-то значение вперёд и таким образом вернуться назад не выходит
Так пробовал вернуться на прошлую позицию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        List<string> equalWords = new List<string>();
        string previousWord = null;
        string word = null;
        long previousPosition;
        do
        {
            previousPosition = streamReaders[i].BaseStream.Position;
            word = streamReaders[i].ReadLine();
            if (word != null)
            {
                if (previousWord == null || previousWord == word)
                    equalWords.Add(word);
                else
                {
                    streamReaders[i].BaseStream.Position = previousPosition;
                    break;
                }
            }
            else
                break;
            previousWord = word;
        }
        while (true);


Добавлено через 3 часа 41 минуту
Поставлю вопрос по другому. Можно ли как-то без плясок с бубном прочитать следующее слово в StreamReader так, чтобы потом ReadLine читал не перепрыгивая через слово. То есть порядок чтения методом ReadLine оставался прежним и не сдвигался?

Попробовал сделать так, но при чтении в методе GetNextWord всё же происходит сдвиг. Короче этот код читает из текстового файла все одинаковые слова и если следующее слово не совпадает с предыдущим, то передаёт управление следующему StreamReader, тот тоже читает все одинаковые слова и добавляет их в общий список (тут нету куска кода, но не суть, оно и не нужно, по вопросу код присутствует).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//часть кода из метода (тем не менее по ней логика просматривается):
                    while (streamReaders.Count > 0)
                    {
                        for (int i = 0; i < streamReaders.Count; i++)
                        {
                            List<string> equalWords = new List<string>();
                            string word = null;
 
                            do
                            {
                                if (word != null)
                                {
                                    string nextWord = GetNextWord(streamReaders[i]);
                                    if (word != nextWord)
                                        break;
                                }
 
                                word = streamReaders[i].ReadLine();
                                if (word != null)
                                    equalWords.Add(word);
                                else
                                    break;
                            }
                            while (true);
 
//-------------------------------------------------------------------
 
        private static string GetNextWord(StreamReader streamReader)
        {
            StringBuilder builder = new StringBuilder();
            char ch;
            ch = (char)streamReader.Read();
            while (ch != '\r' && ch != '\n' && ch >= 0)
            {
                builder.Append(ch);
                ch = (char)streamReader.Read();
            }
            return builder.ToString();
        }
Добавлено через 1 минуту
Пример файла:
арену
арест
арест
арест
арестанта
аресте
аресте
арестовал
арестовала
арестовала
арестовали
Добавлено через 4 минуты
Суть вопроса, как прочесть в текущем StreamReader следующее слово (предполагается, что до этого несколько раз читали ранее методом ReadLine) так, чтобы не сдвинуть (м-м-м... как же это назвать) курсор/флаг/текущую позицию в StreamReader.

Народ, если ничего не понятно, то вы хоть скажите, а то как-то странно, никто ничего не пишет.

Добавлено через 54 минуты
Похоже неверный подход к решению задачи я выбрал. Надо придумывать что-то другое.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2011, 22:41
Ответы с готовыми решениями:

Как после автоматического запуска приложения, после его закрытия вернуться к приложению которое было открыто раньше?
Путано описал, вот попроще: 1) Запущено приложение. 2) Автоматически запускается другое приложение - первое сворачивается 3)...

Не могу вернуться к предыдущей версии windows
Пожалуйста помогите!! 2 года назад купил ноутбук asus с windows 8. Через год обновил до 8.1. Недавно я установил windows 10 technical...

К сожалению вы не можете вернуться к предыдущей версии, необходимые файлы удалены

11
3 / 3 / 0
Регистрация: 20.09.2012
Сообщений: 41
20.01.2020, 08:04
9 лет прошло и ни кто не ответил(
Помогите пожалуйста.
Я тоже читаю строки .ReadLine(), как после того как строки кончатся перейти в начало файла без закрытия потока и начать снова считывание?

dell
0
sleep
 Аватар для I can
4931 / 4593 / 840
Регистрация: 13.04.2015
Сообщений: 9,750
20.01.2020, 08:06
Цитата Сообщение от GAGAn Посмотреть сообщение
9 лет прошло и ни кто не ответил
Наверное потому что такой велосипед не нужен ?
Гораздо проще и удобнее прочитать весь файл в массив и делать с ним что хочешь.
0
3 / 3 / 0
Регистрация: 20.09.2012
Сообщений: 41
20.01.2020, 08:09
Мне нужен, а если файл у меня 50гиг то что делать?
0
20.01.2020, 08:12

Не по теме:

Цитата Сообщение от GAGAn Посмотреть сообщение
если файл у меня 50гиг то что делать?
Не делать файлы по 50 гиг, иначе, с таким подходом, файлы могут стать и по нескольку терабайт. И будете их обрабатывать неделями.

0
3 / 3 / 0
Регистрация: 20.09.2012
Сообщений: 41
20.01.2020, 08:17
Цитата Сообщение от I can Посмотреть сообщение
Не делать файлы по 50 гиг, иначе, с таким подходом, файлы могут стать и по нескольку терабайт. И будете их обрабатывать неделями.
Ну а все же как переместититься в начало файла?
Мне сказали что вот так
.BaseStream.Position = 0
Но у меня проблема вот в чем
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
20.01.2020, 09:15
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            List<string> l1 = new List<string>();
            List<string> l2 = new List<string>();
            using (StreamReader sr = new StreamReader("test.txt"))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    l1.Add(line);
                }
 
                sr.BaseStream.Position = 0;
 
                while ((line = sr.ReadLine()) != null)
                {
                    l2.Add(line);
                }
            }
0
0 / 0 / 0
Регистрация: 12.11.2019
Сообщений: 6
20.01.2020, 09:16
Casper-SC, скорее всего, это танец с бубном, но можно ведь записывать каждую строку в коллекцию, а потом уже работать с ней.
0
20.01.2020, 09:25

Не по теме:

Цитата Сообщение от Unevenness Посмотреть сообщение
можно ведь записывать каждую строку в коллекцию,
Чисто теоретически - где хранить такую коллекцию ? Файл объёмом 50 гб, соответственно и оперативной памяти должно быть больше. Встречал я такие файлы. Это в основном базы данных, в которых хранится 99.99 % бесполезного мусора, так как криворукие программисты не могут нормально обработать информацию. В итоге всё скидывается в базу, в надежде на авось, а она, естественно, распухает до неимоверных размеров.

0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.01.2020, 11:06
Цитата Сообщение от GAGAn Посмотреть сообщение
Мне сказали что вот так
.BaseStream.Position = 0
Цитата Сообщение от Toros1992 Посмотреть сообщение
C#
1
sr.BaseStream.Position = 0;
StreamReader тоже использует буфер, если у него под носом напрямую орудовать потоком, то можно тех еще нежданчиков нахватать.
Хотя бы буфер очищайте после смены позиции.
И учтите, что размер буфера по умолчанию — 1Кб. Если строки короткие, а взад-назад двигаться планируется часто, то может быть накладно.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
21.01.2020, 01:40  [ТС]
Цитата Сообщение от Unevenness Посмотреть сообщение
Casper-SC, скорее всего, это танец с бубном, но можно ведь записывать каждую строку в коллекцию, а потом уже работать с ней.
Подозреваю, что я эту задачу решил, уже не помню

Добавлено через 37 секунд
Цитата Сообщение от GAGAn Посмотреть сообщение
9 лет прошло и ни кто не ответил(
Наша суровая реальность!

Добавлено через 1 минуту
Есть подозрение, что мне не ответили из-за пугающих тестовых данных. Никто связываться не захотел.

Добавлено через 1 минуту
Я сам сейчас испугался.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
21.01.2020, 13:08
Цитата Сообщение от GAGAn Посмотреть сообщение
Ну а все же как переместититься в начало файла?
Мне сказали что вот так
.BaseStream.Position = 0
Но у меня проблема вот в чем
Не совсем понятно для чего.

Можно, как показали kolorotur и Toros1992, сделать это изменив позицию и очистив буфер.
Но, по-моему, ни каких преимуществ это по сравнению с новым открытием StreamReader не даст.

Так что не понятно где это может понадобиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2020, 13:08
Помогаю со студенческими работами здесь

Аналог метода ReadLine для чтения конкретной строки (а не по порядку)
Добрый день. Подскажите аналог метода ReadLine в VBS, чтобы ему можно было указать порядковый номер строки, которую он должен считать,...

После копирования файла методом чтения-записи файл копия оказывается поврежденным
Реализовывал копирование фала путем : а) чтения содержимого файла в массив. б) запись содержимого массива в новый файл. Вот код: ...

Как правильно посчитать количество символов в строке после чтения файла антивордом?
Добрый день. Суть задачи: сосчитать количество символов в файле .doc Перепробовал кучу методов, каждый был в чем-то плох. Где-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru