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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2010, 14:51   #21
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

могу привести довольно простое решение этой проблеммы, но скажите мне, в каком диапазоне находится id?

и возможно ли перезаписывать имеющиеся файлы, или нужно их сохранять?
Alex_FF вне форума Ответить с цитированием
Старый 14.01.2010, 15:01   #22
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ох.. самый простой вариант - дважды пройтись по файлу, первый раз удаляя существующие текстовые файлы, имена которых совпадают с ID

Код:
program Razor2;

uses DOS;
const
  Source = 'input.txt';

function FileExists(FileName : string; FileAttr : word ) : boolean;
var
  FileParameters : SearchRec;
begin
  FindFirst(FileName,FileAttr,FileParameters);
  if (DosError = 0)
    then
      FileExists := True
    else
      FileExists := False;
end;


var
  S, Target: String;
  Index: Integer;
  FI, FT: Text;
begin
  Assign(FI,Source);
  Reset(FI);
  {первый цикл чтения - удаляем все существующие файлы <id>.txt}
  while not EOF(FI) do
  begin
    ReadLn(FI, S);
    Index := Pos('|', S);
    if Index > 0 then begin
      Target := Copy(S,1, Index-1) + '.txt';
      if FileExists( Target, AnyFile) then begin
         Assign(FT, Target);
         Erase(FT)
      end;
    end;
  end;
  Close(FI); {закрыли исходный файл}

  {повторно открыли исходный файл}
  Reset(FI);
  while not EOF(FI) do
  begin
    ReadLn(FI, S);
    Index := Pos('|', S);
    if Index <= 0 then WriteLn('Ошибка во входном файле - не найден разделитель |')
    else begin
      Target := Copy(S,1, Index-1) + '.txt';
      Assign(FT, Target);

      if FileExists(Target, AnyFile) then
        Append(FT)
       else
        Rewrite(FT);


      Delete(S, 1, Index - 1);
      WriteLn(FT, S);
      Close(FT);
    end
  end;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.01.2010, 16:25   #23
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

1) ну никакого uses Dos конечно быть не может, т. к. в Delphi такого нет, а на паскале максимальная длина строки типа String равна 255, а учитывая, что текст "большой" и таблицы "большие", то может получиться потеря данных.
2) если у нас нет прав на удаление существующего файла, или если он имеет одновременно атрибуты System и ReadOnly? удалить ваша программа его не сможет, и, как следствие, ничего хорошего (кроме Error5: File access denied) от её выполнения мы не получим...
3) можно добавить обработку ошибок для описанного в п.2, но если нам попался файл, который мы не можем удалить, то что делать тогда? давать новое имя? но тогда нужно его запомнить, чтобы когда попадётся следующая запись с таким же id, мы записали ее в нужный файл. А сможем ли мы запомнить имена, к примеру, 10000000000000000000000000000000000 00000000000000000000000000000000000 00000000000000000000000000000000000 0000000000000000 файлов?
и четвертое - это мой вопрос - можно ли перезаписывать имеющиеся файлы?
Alex_FF вне форума Ответить с цитированием
Старый 14.01.2010, 16:32   #24
Panika
Пользователь
 
Регистрация: 08.11.2009
Сообщений: 28
По умолчанию

наверное 4 вопрос адресован мне??? Можно их перезаписывать новыми данными! т.е. старая должна удаляться, а новая загружаться...Alex_FF помогите мне пожалуйста!!! Я уже совсем отчаялась...

P.S. программа Serge_Bliznykov не работает(((
Panika вне форума Ответить с цитированием
Старый 14.01.2010, 16:36   #25
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Цитата:
P.S. программа Serge_Bliznykov не работает(((
её нужно на Pascal компилировать, а не на Delphi...

Цитата:
так, чтобы в начале каждой строки вместо того id, который Вы удалили вмещалась информация из 2, 3, и 4 идущих за id данных, таким образом будет создаваться уникальный id. Но при этом после этого id долны идти все данные, начиная со 2, иначе они потеряюся...
а что это за данные, в каком формате они идут, и пример входа и выхода приведите, а то сложно разобраться...

Последний раз редактировалось Alex_FF; 14.01.2010 в 16:40.
Alex_FF вне форума Ответить с цитированием
Старый 14.01.2010, 16:38   #26
Panika
Пользователь
 
Регистрация: 08.11.2009
Сообщений: 28
По умолчанию

ооо...ну куда уж мне...
Panika вне форума Ответить с цитированием
Старый 14.01.2010, 16:39   #27
Panika
Пользователь
 
Регистрация: 08.11.2009
Сообщений: 28
По умолчанию

я уже бьюсь головой о клавиатуру но чет мысли все и не лезут...
Alex_FF проверьте личные сообщения.
И очень Вас прощу, помогите мне!
Panika вне форума Ответить с цитированием
Старый 14.01.2010, 22:18   #28
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну раз речь идёт о Delphi,
то абсолютно несложно переписать код:
Код:
program razor3;
{$APPTYPE CONSOLE}
uses SysUtils;

const
  Source = 'input.txt';

var
  S, Target: String;
  Index: Integer;
  FI, FT: TextFile;
begin
  if Not FileExists(Source) then begin
    WriteLn('Error! File "'+Source+'" not found');
    Halt(1)
  end;
  AssignFile(FI,Source);
  Reset(FI);
  {первый цикл чтения - удаляем все существующие файлы <id>.txt}
  while not EOF(FI) do
  begin
    ReadLn(FI, S);
    Index := Pos('|', S);
    if Index > 0 then begin
      Target := Copy(S,1, Index-1) + '.txt';
      if FileExists( Target) then begin
         AssignFile(FT, Target);
         Erase(FT)
      end;
    end;
  end;
  Close(FI); {закрыли исходный файл}

  {повторно открыли исходный файл}
  Reset(FI);
  while not EOF(FI) do
  begin
    ReadLn(FI, S);
    Index := Pos('|', S);
    if Index <= 0 then
      WriteLn('Error in Input File! Not Found delimiter: |')
    else begin
      Target := Copy(S,1, Index-1) + '.txt';
      AssignFile(FT, Target);

      if FileExists(Target) then
        Append(FT)
       else
        Rewrite(FT);

      Delete(S, 1, Index - 1);
      WriteLn(FT, S);
      Close(FT);
    end
  end;
end.
p.s. без всяких проверок на аттрибуты файла и возможность его удалять/создавать/записывать..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.01.2010, 09:50   #29
Panika
Пользователь
 
Регистрация: 08.11.2009
Сообщений: 28
По умолчанию

Serge_Bliznykov спасибо огромное!!! очень Вам благодарна!!! Спасибо!!!
Panika вне форума Ответить с цитированием
Старый 15.01.2010, 18:36   #30
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

так вы же говорили, что после id еще какие-то данные идут, и программа их удаляет???
Alex_FF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Борьба с крякозябрами в консольном приложении fs444 C++ Builder 16 15.12.2009 19:04
Как создать базу данных в консольном приложении Lamarq Общие вопросы C/C++ 0 17.11.2009 21:07
Русский язык в консольном приложении С++ на VS2008 Munch Помощь студентам 3 17.10.2009 17:33
Цвет текста в консольном приложении Linux a10nan Общие вопросы C/C++ 14 21.08.2009 23:41
Содержимое экрана в полноекранном консольном приложении Роман Радер Win Api 1 29.03.2009 20:04