![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
Как прочитать из файла только последнии 10 строк ?
|
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
переместить указатель на начало десятой строки и пошел читать
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| admsasha |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
||||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 2 Всего: 95 |
Такой функции не наблюдается, поэтому придется писать ручками Вариант 1: fgets'ом считываешь строки из файла, параллельно инкрементируешь переменную-счетчик строк. затем rewind'ом перемещаешься в начало и в цикле до (количества строк-10) делаешь снова fgets - в итоге оказываешься на первой необходимой тебе строке.... Это в лоб... Вариант 2: Заводишь массив из 10 строк. Пишешь небольшую функцию, которая будет в качестве параметра получать строку и производить с данным массивом стеко-подобные действия, т.е. десятому элементу присваиваешь 9-ю строку, 9-му - 8-ю и т.д. а первому - значение переданного параметра. Далее начинаешь читать построчно из файла и считанную строку передавать в эту функцию параметром.. В итоге после считывания всех строк у тебя в массиве будут последние 10 строк файла... Что и треба... Не реализовывал, это так - навскидку... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Это сообщение отредактировал(а) apook - 14.3.2007, 11:55 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Syle |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 16.4.2007 Где: Елисаветград Репутация: нет Всего: нет |
А что с конца файл точно открыть нельзя?... В Delphi такое вроде реализовано
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Syle, открыть можно и с начала, затем переместить указатель чтения в конец. Но все равно, это прочитать 10 последних строк не поможет.
Как вариант, можно посмотреть, как реализована программа tail в linux. |
|||
|
||||
| DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Невнимательно прочитал вопрос
Это сообщение отредактировал(а) DjoNIK - 4.9.2007, 20:11 -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Читаем внимательно изначальный вопрос. |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Ещё как поможет. Делаем input iterator char'ов, который бежит от конца к началу, попутно занимаясь вопросами кэширования данных, а дальше вообще просто. Этим итератором считываем строку, помещаем строку в стек. Как только в стеке будет 10 строк, или итератор загнется - раскручиваем стек и получаем десяток строк в исходном порядке. Самая сложная часть при такой схеме - обработка того, заканчивается последняя строка в файле '\n''ом или нет. Это сообщение отредактировал(а) Mayk - 4.9.2007, 21:21 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| BaD_SeCt0R |
|
|||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
OpenFile ---> SetFilePointer Это не в Делфи реализовано, а в WinAPI изначально Есть еще идея. Стро ка заканчивается символами с кодом 13 и 10. Так читать файл побайтно с конца и отсчитывать кол-во таких комбинаций. В обратном порядке, конечно - 10 и 13. -------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| regis |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 12.12.2005 Где: Москва, Россия Репутация: 2 Всего: 7 |
Ответ зависит от того, возможен ли к файлу произвольный доступ.
Если возможен (файл на диске, и т.п.) -- наиболее оптимально читать данные блоками (напр, по 1Kb) с конца, и каждый сканировать назад на предмет EOF, пока не найдем начало 10-й строки. Если нет -- единственный вариант, создать в памяти очередь из последних 10-ти строк, и читать строки из файла по порядку (записывая туда) до исчерпания файла. --------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |