Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2009, 06:38   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov
А что, с конца файла нельзя считать k строк?!
??? Саша, я потрясён... o_O
Всё свою долгую жизнь я был уверен, что НЕЛЬЗЯ прочитать последние несколько строк из текстового файла!!

Цитата:
Сообщение от Sasha_Smirnov
(Да ещё их там может и не оказаться, да?)
в жизни - да, может и не оказаться. Но, по условиям задачи, этой проверкой можно пренебречь - там прямо сказано, что строк в файле больше, чем число необходимых строк k.

Цитата:
Сообщение от OCTAGRAM
Можно
Как?!! устанавливать указатель и читать кусками, отсчитывая сколько строк попало в буфер, если недостаточно, то сдвигать указатель и повторять цикл? Или ставить указатель на предпоследний байт, читать байт, сдвигать указатель на один байт назад, опять читать байт и т.д. ?! так это же ОГРОМНЫЙ удар по скорости работы!
Поделитесь идей, плиз...

p.s. если считаете, что тут это будет слишком сложно - то можно или в ЛС или отдельную тему создать (вдруг кому-то ещё интересно...) хотя, я думаю, что можно опубликовать Ваш алгоритм прямо здесь...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2009, 07:49   #12
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

А если так? Правда да дельфях, но вроде ничего не паскалевского не юзал.
Код:
program files;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var
  k:byte;
  size:integer;
  old: file of byte;
  newfile: file of byte;
  buffer,buffer2:array [1..2560] of byte;
  i:integer;
  counter:integer;
begin
  WriteLn('Input K');
  ReadLn(k);
  AssignFile(old,'c:\old.txt');
  Reset(old);
  size:=FileSize(old);
  Seek(old,size-(k*256));
  BlockRead(old,buffer,k*256);
  CloseFile(old);
  i:=0;
  counter:=0;
  while i< k do
    begin
      if buffer[(k*256)-counter]=$0A then
        inc(i);
      inc(counter);
    end;
  dec(counter);
  Move(Buffer[(k*256)-(counter-1)],buffer2[1],counter);
  AssignFile(newfile,'C:\new.txt');
  Rewrite(newfile);
  BlockWrite(newfile,buffer2,counter);
  CloseFile(newfile);
end.
Aristarh Dark вне форума Ответить с цитированием
Старый 16.04.2009, 14:26   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Aristarh Dark, э не... так не пойдёт..
1) ну.. нечестно.. это грубый хакерский способ... (про него я выше писал..)

2) алгоритм рабочий. но есть ошибочка в реализации: какой размер будет иметь файл из 20 строк по 5 символов в строке? 140 байт?
а куда установится указатель Seek(old,size-(k*256)); при к = 10? в минуса?!
и при попытке прочитать BlockRead(old,buffer,k*256); в TP выдаётся ошибочка - Error 100 (Disk read error)

хотя, в целом, конечно, такой подход имеет право на существование.
Более того, в практической жизни (ну если подправить ошибку, когда размер меньше чем k*256) этот подход будет намного более эффективен, чем построчное чтение с начала файла! Особенно для больших файлов!

кстати, возьму на себя смелость выложить модифицированный для Pascal'я код:
Код:
var
  k:byte;
  size, ReadSize : integer;
  old, newfile   : file;
  buffer,buffer2 : array [1..2560] of byte;
  i:integer;
  counter:integer;
begin
  WriteLn('Input K');
  ReadLn(k);
  Assign(old,'w_old.txt');
  Reset(old,1);
  size:=FileSize(old);
  if (k*256)<size then
     Seek(old,size-(k*256));
  BlockRead(old,buffer,k*256,ReadSize);
  Close(old);
  i:=0;
  counter:=0;
  while (i< k) and (counter<ReadSize) do
    begin
      if buffer[ReadSize-counter]=$0A then
        inc(i);
      inc(counter);
    end;
  dec(counter);
  Move(Buffer[ReadSize-(counter-1)],buffer2[1],counter);
  Assign(newfile,'w_new.txt');
  Rewrite(newfile,1);
  BlockWrite(newfile,buffer2,counter);
  Close(newfile);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2009, 18:51   #14
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Почему сразу "хакерский" - это просто способ.
А вот про побайтовое чтение я не прочитал, на вторую станицу вообще не заглянул Идея пришла, я ее и реализовал. А то что ошибки с размером буфера - потому что реализовывалось за 5 минут, просто как пример иного подхода.
Aristarh Dark вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BMP-файл внутри другого файла Pashan Общие вопросы C/C++ 0 08.04.2009 16:37
Помогите создать компонент на основе PageControl SibBear Компоненты Delphi 5 23.03.2009 16:28
Паскаль, файл с данными Алина-малина Помощь студентам 11 13.12.2008 21:38
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15