Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтения файла с конца 
:(
    Опции темы
admsasha
Дата 14.3.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Как прочитать из файла только последнии 10 строк ?  smile 
PM MAIL WWW ICQ Jabber   Вверх
apook
Дата 14.3.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



переместить указатель на начало десятой строки и пошел читать smile 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
admsasha
Дата 14.3.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(apook @  14.3.2007,  18:30 Найти цитируемый пост)
переместить указатель на начало десятой строки и пошел читать smile  


Так не от начала 10 строк, а от конца 10 строк. (Тогда как узнать, сколько строк ? )
PM MAIL WWW ICQ Jabber   Вверх
ama_kid
Дата 14.3.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Цитата(admsasha @  14.3.2007,  11:34 Найти цитируемый пост)
а от конца 10 строк. (Тогда как узнать, сколько строк ? )

Такой функции не наблюдается, поэтому придется писать ручками
Вариант 1:
fgets'ом считываешь строки из файла, параллельно инкрементируешь переменную-счетчик строк. затем rewind'ом перемещаешься в начало и в цикле до (количества строк-10) делаешь снова fgets  - в итоге оказываешься на первой необходимой тебе строке.... Это в лоб...
Вариант 2:
Заводишь массив из 10 строк. Пишешь небольшую функцию, которая будет в качестве параметра получать строку и производить с данным массивом стеко-подобные действия, т.е. десятому элементу присваиваешь 9-ю строку, 9-му - 8-ю и т.д. а первому - значение переданного параметра. Далее начинаешь читать построчно из файла и считанную строку передавать в эту функцию параметром.. В итоге после считывания всех строк у тебя в массиве будут последние 10 строк файла... Что и треба...

Не реализовывал, это так - навскидку...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
apook
Дата 14.3.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Код

#include<iostream.h>
#include<fstream.h>


void main()
{
int i, j;
char buf[ 100 ];
fstream f( "skry.ly", ios::in | ios::out );
if( !f ) return;

f.seekp( 0, ios::beg );
for( i=0; !f.eof(); ++i ) // подсчитал
    f.getline(buf, 100);

f.clear();
f.seekp( 0, ios::beg );
for( j=0; !f.eof(); ++j ) // прочитал
    if( f.getline(buf, 100) && j>=(i-10) ) cout << buf << endl;

return;
}


Это сообщение отредактировал(а) apook - 14.3.2007, 11:55


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Syle
Дата 4.9.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.4.2007
Где: Елисаветград

Репутация: нет
Всего: нет



А что с конца файл точно открыть нельзя?... В Delphi такое вроде реализовано
PM MAIL ICQ   Вверх
bsa
Дата 4.9.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Syle, открыть можно и с начала, затем переместить указатель чтения в конец. Но все равно, это прочитать 10 последних строк не поможет.
Как вариант, можно посмотреть, как реализована программа tail в linux.
PM   Вверх
DjoNIK
Дата 4.9.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Невнимательно прочитал вопрос smile

Это сообщение отредактировал(а) DjoNIK - 4.9.2007, 20:11


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
bsa
Дата 4.9.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(DjoNIK @ 4.9.2007,  17:38)
Код

...
fstream f;
...
fseekg( -10*sizeof(TYPE_OF_DATA), ios::end);
...

Читаем внимательно изначальный вопрос.
PM   Вверх
Mayk
Дата 4.9.2007, 21:20 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(bsa @  4.9.2007,  21:29 Найти цитируемый пост)
Syle, открыть можно и с начала, затем переместить указатель чтения в конец. Но все равно, это прочитать 10 последних строк не поможет.

Ещё как поможет. Делаем input iterator char'ов, который бежит от конца к началу, попутно занимаясь вопросами кэширования данных, а дальше вообще просто.
Этим итератором считываем строку, помещаем строку в стек.
Как только в стеке будет 10 строк,  или итератор загнется - раскручиваем стек и получаем десяток строк в исходном порядке.

Самая сложная часть при такой схеме - обработка того, заканчивается последняя строка в файле '\n''ом или нет.

Это сообщение отредактировал(а) Mayk - 4.9.2007, 21:21


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
BaD_SeCt0R
Дата 4.9.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: нет
Всего: 18



Цитата(Syle @  4.9.2007,  15:31 Найти цитируемый пост)
А что с конца файл точно открыть нельзя?... В Delphi такое вроде реализовано


OpenFile ---> SetFilePointer
Это не в Делфи реализовано, а в WinAPI изначально smile

Есть еще идея. Стро ка заканчивается символами с кодом 13 и 10. Так читать файл побайтно с конца и отсчитывать кол-во таких комбинаций. В обратном порядке, конечно - 10 и 13. 


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
regis
Дата 6.9.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: 2
Всего: 7



Ответ зависит от того, возможен ли к файлу произвольный доступ.

Если возможен (файл на диске, и т.п.) -- наиболее оптимально читать данные блоками (напр, по 1Kb) с конца, и каждый сканировать назад на предмет EOF, пока не найдем начало 10-й строки.

Если нет -- единственный вариант, создать в памяти очередь из последних 10-ти строк, и читать строки из файла по порядку (записывая туда) до исчерпания файла.

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.