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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2011, 23:57   #1
Tattoquardas
Пользователь
 
Регистрация: 15.10.2011
Сообщений: 16
Восклицание Задача про файл

Дано текстовый файл. Нужно везде заменить подстроку Р1 подстрокой Р2 и результат записать в новый файл.

uses crt;
var f1,f2: text;
p1,p2:string;
l,i:integer;
begin
clrscr;
writeln('Знайти рядок: ');
readln(p1);
writeln('Замінити на рядок: ');
readln(p2);
assign(f1,'C:\Documents and Settings\Admin\Рабочий стол\file.txt');
reset (f1);
assign(f2,'C:\Documents and Settings\Admin\Рабочий стол\file1.txt');
rewrite(f2);
while not eof(f1) do
begin
for i:=1 to length(p1) do
begin
read(f1,p1); ????
end;
delete(p1, 0,length(p1));
insert(p2,p1,0);
????
end;
close(f1);
close(f2);
end.

вот что-то типо этого я написала. непонятно конкретно как найти строку в файле и как записать эту информацию в новый файл.
Tattoquardas вне форума Ответить с цитированием
Старый 08.12.2011, 00:32   #2
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Что-то ты такое вот такое написала, и совсем не то что надо.
Ну для начала.
Ты условие внимательно читала?

1) Дано текстовый файл! значит что файл надо чем-то забить или же он уже чем-то забит. ( не вижу намека на заполнение файла, или хоть что-то связанное с этим )
2) Подключать файл желательно заранее чтобы потом считать из файлов нужную тебе инфу.( в паскале насколько помню важна последовательность действий );
3) а вот уже потом вводиш слово и заменяеш его на то что тебе надо.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 08.12.2011, 04:22   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Леший.. что-то ты не то говоришь.
Дан текстовый файл - это значит, что файл где-то был кем-то создан (в Блокноте или там Word'е..) и дан тебе (название и положение, например file.txt на флешке).
У ТС файл подключается где и как надо.

Tattoquardas (откудово такое нико? ответь плз, забавново..)), тут не надо проходить циклом по символам, а нужно просто использовать функцию Pos. Ниже я привожу два варианта. Сначала первый - он будет работать хорошо в "обычных" случаях, типа заменить CAT на TIGER. У меня к тебе просьба: разберись с ним (не читая дальше), пожалуйста, а потом подумай - чем он может быть плох? Когда немного подумаешь, тогда читай то, что я напишу после первого варианта кода.
Код:
var
  f1,f2: text;
  s,s1,s2: string;
  p: integer;
begin
  writeln('Знайти рядок: ');
  readln(s1);
  writeln('Замiнити на рядок: ');
  readln(s2);
  assign(f1,'file1.txt');
  reset (f1);
  assign(f2,'file2.txt');
  rewrite(f2);
  while not eof(f1) do  begin
    readln(f1,s);   // читаем след. строку из файла
    while Pos(s1,s)>0 do begin   // цикл по всем вхождениям s1
      //  из-за чего я разлюбил Паскаль - в подобных случаях:
      p:= Pos(s1,s);   // приходится делать ту же самую операцию заново
      Delete(s,p,Length(s1));  // удаляем вхождение s1
      Insert(s2,s,p)    // вставляем s2
    end;
    writeln(f2,s)   // пишем в выходной файл
  end;
  close(f1);
  close(f2);
end.
Даю некоторое пространство, чтоб то, что не надо, не лезло в глаза. Это к делу отношения не имеет и можно совсем не читать..

Баллада о старом Вильяме

Автор: Льюис Кэрролл, перевод Самуила Маршака

— Папа Вильям, — сказал любопытный малыш, -
Голова твоя белого цвета,
Между тем ты всегда вверх ногами стоишь.
Как ты думаешь, правильно это?

— В ранней юности, — старец, промолвил в ответ, -
Я боялся раскинуть мозгами,
Но, узнав, что мозгов в голове моей нет,
Я спокойно стою вверх ногами.

— Ты старик, — продолжал любопытный юнец. -
Этот факт я отметил вначале.
Почему ж ты так ловко проделал, отец,
Троекратное сальто-мортале?

— В ранней юности, — сыну ответил старик, -
Натирался я мазью особой,
По два шиллинга банка — один золотник.
Вот, не купишь ли банку на пробу?

— Ты немолод, — сказал любознательный сын, -
Сотню лет ты без малого прожил.
Между тем двух гусей за обедом один
Ты от клюва до лап уничтожил.

— В ранней юности мышцы своих челюстей
Я развил изучением права,
И так часто я спорил с женою своей,
Что жевать научился на славу!

— Мой отец, ты простишь ли меня, несмотря
На неловкость такого вопроса:
Как сумел удержать ты живого угря
В равновесье на кончике носа?

— Нет, довольно! — сказал возмущенный отец.
Есть границы любому терпенью.
Если новый вопрос ты задашь, наконец, -
Сосчитаешь ступень за ступенью!


Перемена окончена, начинается второй час пары.. ))
Надеюсь, ты проверила работу программы на семплах TinMan и Tattoquardas )). Работает? Okay, поехали дальше..

Попробуй проверить на таких семплах (только надо, чтоб первый действительно присутствовал в файле!!)
INFINITY и INFINITY
То есть, чтоб первый был равен второму. Что имеем?
Зациклились.. Жми Ctrl-C.

Не убедил? Еще один пример:
ERROR заменить на EERROR
На этот раз прога сработает, но внутри выходного файла будет несколько не то, что мы хотели.. Красиво? ))

Вот тебе второй вариант, который свободен от этих багов (проверь!). Можно было бы ожидать, что он стал сложнее - но нет, он стал даже проще, мне кажется..
Код:
var
  f1,f2: text;
  s,s1,s2: string;
  p: integer;
begin
  writeln('Знайти рядок: ');
  readln(s1);
  writeln('Замiнити на рядок: ');
  readln(s2);
  assign(f1,'file1.txt');
  reset (f1);
  assign(f2,'file2.txt');
  rewrite(f2);
  while not eof(f1) do  begin
    readln(f1,s);
    while Pos(s1,s)>0 do begin
      p:= Pos(s1,s);
      write(f2,Copy(s,1,p-1)+s2);  // записываем кусок ДО вхождения s1, а сзади s2
      Delete(s,1,p+Length(s1)-1)   // удаляем кусок от начала и по s1 включительно
    end;
    writeln(f2,s)  // дописываем строку
  end;
  close(f1);
  close(f2);
end.
Успехов тебе. Спрашивай, что неясно.
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 08.12.2011 в 04:28.
TinMan вне форума Ответить с цитированием
Старый 08.12.2011, 14:13   #4
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Цитата:
Леший.. что-то ты не то говоришь.
Дан текстовый файл - это значит, что файл где-то был кем-то создан (в Блокноте или там Word'е..) и дан тебе (название и положение, например file.txt на флешке).
У ТС файл подключается где и как надо.
Согласен что не то говорю Итог по двум темам неудовлетворительный. Надо бы вернутся к старым добрым строкам и файлам, и ещё раз про шерстить материал. ( таки есть пробелы ). Но все же благодарю за критику.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 09.12.2011, 02:20   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Leshii Посмотреть сообщение
Согласен что не то говорю Итог по двум темам неудовлетворительный. Надо бы вернутся к старым добрым строкам и файлам, и ещё раз про шерстить материал. ( таки есть пробелы ). Но все же благодарю за критику.
Все норм, не расстраивайся. Все учились чему-то когда-то. Не унывай )).

Ты на правильном пути )
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача про списки Алекс12345 Паскаль, Turbo Pascal, PascalABC.NET 2 20.08.2011 19:33
задача про расписание любаша Общие вопросы C/C++ 1 25.11.2009 07:55
Задача про зарплаты GorNikSar Помощь студентам 4 24.10.2009 08:06