Простой способ прочитать последнюю строку файла в С#
любая идея, как читать последние или две последние строки файла, содержащие около 30 строк с \n с акцентом на скорость выполнения?
EDIT: что-то быстрее, чем:
Если вы создаете новый объект IO.FileStream(), существует метод .Seek(), который позволит указать конец файла как часть того, где вы хотите найти. Однако на данный момент нет простого способа увидеть, где начинается последняя строка. Вам придется либо идти назад, ища линию, либо если у вас есть представление о том, как выглядит эта последняя строка (и, следовательно, как долго это происходит), вы можете сделать предположение о том, как далеко назад вам нужно искать и идти чуть дальше. Используйте свойство FileStream.CanSeek, чтобы определить, поддерживает ли текущий экземпляр поиск. Дополнительную информацию см. В разделе Stream.CanSeek.
затем перейдите в цикл, пока не получите свой /n
вы также можете прочитать в этом другом вопросе: как читать текстовый файл с помощью итератора в С#
Как прочитать последнюю строку файла с разделителями
У меня есть файл с разделителями с разделителями.
Я использую следующий код, чтобы прочитать последнюю строку. Я считаю, что цикл выполняется до последней строки и продолжает перезаписывать строку lastLine. Таким образом, как только последняя строка достигнута, цикл прерывается и строка становится последней строкой.
Но этот метод не работает должным образом и эффективно.
Любые предложения о том, как узнать последнюю строку этого файла с разделителями.
Решение
иначе вы не сможете получить последнюю строку.
ты можешь использовать
но нет смысла делать getline дважды
для лучшего разделителя в вашем случае я бы использовал специальный знак, скажем, do:
этот символ является знаком квадратного корня и, скорее всего, не будет использоваться в чате. Тем не менее, для каждого приходящего сообщения чата необходимо проверить, используется ли там знак, и если да, то удалить его. Теперь для каждого отправляемого сообщения отправьте его со знаком в конце, а при получении разделите на этот символ с помощью getline ,
таким образом, вы легко разделитесь в месте, которое, как вы знаете, пользователь не испортит.
Другие решения
Вы не объяснили, в чем ваша проблема, но я думаю, что она не проверяет каждую строку, потому что getline () внутри цикла указывает на следующий элемент, поэтому вы теряете половину ваших элементов.
Допустим, это ваши строки:
после первой итерации он переходит к:
3 .; <- (по внутренней линии getline)
Таким образом, вы теряете 2-й элемент. Петля продолжается и в конце
5 .; <- (по внутренней петле)
конец.; <- (by while): это назначает правую строку chuy и указывает на следующий элемент
который не существует и поэтому внутри getline () не работает
если файл не будет очень большим, вы можете сначала получить весь файл в строку и использовать string::find_last_of найти последний индекс точки с запятой. Затем выведите строку от этого индекса до конца файла.
Чтение с конца файла си
Здравствуйте. Буду краток. Вопрос заключается в том как наиболее эффективно произвести чтение последней строки из файла в си, чтобы не прогонять fscanf ом все строки файла а сразу считать последнюю строку? Заранее спасибо
![]()
Если размер файла таков, что вариант «прогонять fscanf ом все строки файла» является чересчур расточительным, то остается только
- Открыть файл в бинарном режиме 1
- Завести буфер из N байтов
- В цикле вызовами fseek(. -(i * N), SEEK_END) (или fseek(. -N, SEEK_CUR) ) постепенно отступать назад от конца файла с шагом N
- Считывать из файла очередную порцию из N байтов в буфер
- Проверять буфер на предмет наличия в нем платформенно-зависимого 2 маркера конца строки
Таким образом вы сумеете найти ту позицию в файле, с которой начинается последняя строка и затем считать эту строку. Разумеется, можно сразу использовать переаллоцируемый буфер и постоянно накапливать читаемые в процессе поиска данные, ибо они являются частью искомой строки.
В качестве побочного замечания можно добавить, что формально стандартная библиотека С не обязана поддерживать позиционирование от конца файла ( SEEK_END ), т.е. с формально-абстрактной точки зрения «прогонять fscanf ом все строки файла» является единственным решением. Непонятно только, при чем здесь именно fscanf , а не более уместный fgets .
1 Стандартная библиотека С не поддерживает произвольного позиционирования в текстовых потоках
2 Так как файл открыт в бинарном режиме, трансляции платформенно-зависимого маркера конца строки в символ \n происходить не будет