Как считать последнюю строку из файла с
Argument ‘Topic id’ is null or empty
Сейчас на форуме
© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
| ООО «Планета Эксел» ИНН 7735603520 ОГРН 1147746834949 |
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071 |
Вывод последних K строк входного файла на C++
Можно действовать прямо — подсчитать количество строк (N) и вывести строки с N-K до N. Для этого понадобится дважды прочитать файл, что очень неэффективно. Давайте найдем решение, которое потребует прочитать файл только один раз и выведет последние K строк.
Можно создать массив для K строк и прочитать последние K строк. В нашем массиве там будут храниться строки от 1 до K, затем от 2 до K+1, затем от 3 до K+2 и т.д. Каждый раз, считывая новую строку, мы будем удалять самую старую строку из массива.
Вы можете удивиться: разве может быть эффективным решение, требующее постоянного сдвига элементов в массиве? Это решение станет эффективным, если мы правильно реализуем сдвиг. Вместо того чтобы каждый раз выполнять сдвиг массива, можно «закольцевать» массив.
Используя такой массив, читая новую строку, мы всегда будем заменять самый старый элемент. Самый старый элемент будет храниться в отдельной переменной, которая будет меняться при добавлении новых элементов.
Пример использования закольцованного массива:
шаг 1 (исходное состояние): массив = . р = 0 шаг 2 (вставка g): массив = . р = 1 шаг 3 (вставка h): массив = . р = 2 шаг 4 (вставка i): массив = . p = 3
Приведенный далее код реализует этот алгоритм:
void printLast10Lines(char* fileName) < const int K = 10; ifstream file (fileName); string L[K]; int size = 0; /* читаем файл построчно в круговой массив */ while (file.good()) < getline(file, L[size % K]); size++; >/* вычисляем начало кругового массива и его размер */ int start = size > K ? (size % K) : 0; int count = min(K, size); /* выводим элементы в порядке чтения */ for (int i = 0; i < count; i++) < cout >
Мы считываем весь файл, но в памяти хранится только 10 строк.
Разбор взят из перевода книги Г. Лакман Макдауэлл и предназначен исключительно для ознакомления.Если он вам понравился, то рекомендуем купить книгу «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию».
Как правильно создать и прочитать последнюю строку файла?
Если файла нет, вы его создаёте (пустой!) и сразу же читаете из пустого файла. Не хватает записи в файл.
18 сен 2020 в 11:15
@V-Mor DirectoryPath ошибся в названии переменной, этот путь ведет к файлу. Исключение выбрасывается в строке с объявлением переменной lastLine
18 сен 2020 в 13:33
@AlexanderPetrov но ведь я использую метод LastOrDefault()
18 сен 2020 в 13:35
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
При вызове File.Create создаётся файловый поток, вы должны его закрыть, прежде чем опять открывать этот файл. У вас файл занят этим потоком. Пример из документации, где файловый поток закрывается автоматически с помощью using :
using (FileStream fs = File.Create(path)) < byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file."); // Add some information to the file. fs.Write(info, 0, info.Length); >
Отслеживать
ответ дан 18 сен 2020 в 6:01
69.4k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как считать последнюю строку из файла с
В обработке должны быть загружены данные с текстового файла, причём только с его последней строки. Подскажите пожалуйста как на неё перейти?
Т.ПолучитьСтроку(Т.КоличествоСтрок())
ну и зачастую ничего не загрузится.. потому что предпоследняя строка закончена энтером.
(2)Пустить в цикле -1 пока не будет нке пустая строка
(2,3) извращенцы совсем. пусть смотрит чем файл заканчивается, и кстати ни кера не ентером заканчивается. это смотря как выгрузили
(4) ясен пень. хрен ли тут все рассказывать — если челу лень было ЖКК открыть.
(2,4) не знал ничего об этих особенностях. Меня интересует последняя строчка файла mlg.
Помогите пожалуйста! Смотрю в Книге знаний «Парсинг файла MLG (журнал регистрации 1С:Предприятие 7.7)». Вместо цикла по чтению следующей строки файла хочу сделать переход на последнюю строку. Добавляю:
При запуске обработки выдаётся сообщение «Поле агрегатного объекта не обнаружено (КоличествоСтрок)». Что сделал не так? Извините за дилетантство.
(8) В цикле прочитай все строки, и запомни в переменную.
Тебе вообще зачем нужно-то?
Строка инициализации переменной file ?
Файл слишком большой, а мне надо получить ссылку на последний объект, с которым выполнялась работа. Он содержится в последней строке файла mlg. И чтобы не читать построчно весь файл — проще наверное сразу перейти на последнюю строку?
(11) А зачем тебе это? Если для регистрации изменений, то у меня получше кое-что есть.
(11) несомненно, сделай проекцию файла с конца и смещайся в поисках предыдущей #13#10
(13) Не знаю скрипт поддерживает ли это. На Дельфи-то все можно.
Да и непонятно зачем такие вещи. Типо чтобы было?
(15) мне при выполнении обработки надо получить данные из последнего проведенного в базе документа. сведения об этом документе я могу получить только в файле mlg. Вот для этого и надо
(11)(16) romix, я очень благодарен за участие, но мне на данный момент необходимо именно то, что указано в вопросе.