IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задача по удалению компонента из файла, Помогите, пожалуйста, найти ошибку в коде
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Задача такова. Создаешь файл с символьными данными. Делаешь процедуру, которая удаляет из файла все '#' КРОМЕ первой '#'.

Вот я не долго думая написал:

program pavel;
uses crt;
type tyfile=file of char;
Var
k:tyfile; i,n:integer; b:char;
procedure first(var f1:tyfile);
Var
x,a:char; i,n,t,k:integer;
Begin
reset(f1); n:=0;
while not eof(f1) do begin
t:=filepos(f1);
read(f1,x);
if (x='#') then n:=n+1;
if (x='#') and (n>1) then
for i:=filepos(f1)-1 to filesize(f1)-2 do begin
seek(f1,i+1);
read(f1,a);
seek(f1,i);
write(f1,a) end;
seek(f1,t+1) end;
seek(f1,filesize(f1)-n+1); truncate(f1);
close(f1) end;
procedure vivod(var f:tyfile);
var t:char;
begin
reset(f);
while not eof(f) do begin
read(f,t);
write(t)
end;
close(f);
end;
BEGIN
clrscr;
assign(k,'E:/Pavel.txt');
rewrite(k);
write('Введите кол-во символов в файле ');
readln(n);
for i:=1 to n do begin
write('Символ '); readln(b);
write(k,b) end;
close(k);
vivod(k); writeln;
writeln('FIRST');
first(k);
vivod(k);
readln
End.


Я понимаю, что процедура косячная и работает далеко не всегда. Не подскажите как ее правильно написать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Eskel @ 22.12.2008 2:07) *
не долго думая написал:
...
процедура косячная и работает далеко не всегда. Не подскажите как ее правильно написать?
Как говаривал Люис Кэррол, "а подумать не мешало бы" smile.gif

Во-первых, хотя в твоей программе есть намеки на форматирование, оно такое, что лучше бы их не было.. smile.gif Я переформатировал твой код (без изменений, кроме удаления вредных clearscr и CRT), попробуй вникнуть в суть сделанного.
type
tyfile=file of char;
Var
k:tyfile;
i,n:integer;
b:char;

procedure first(var f1:tyfile);
Var
x,a:char;
i,n,t,k:integer;
Begin
reset(f1); n:=0;
while not eof(f1) do begin
t:=filepos(f1);
read(f1,x);
if (x='#') then n:=n+1;
if (x='#') and (n>1) then for i:=filepos(f1)-1 to filesize(f1)-2 do begin
seek(f1,i+1);
read(f1,a);
seek(f1,i);
write(f1,a)
end;
seek(f1,t+1)
end;
seek(f1,filesize(f1)-n+1); truncate(f1);
close(f1)
end;

procedure vivod(var f:tyfile);
var
t:char;
begin
reset(f);
while not eof(f) do begin
read(f,t);
write(t)
end;
close(f);
end;

BEGIN
assign(k,'pavel.txt');
rewrite(k);
write('Введите кол-во символов в файле ');
readln(n);
for i:=1 to n do begin
write('Символ ');
readln(b);
write(k,b)
end;
close(k);
vivod(k);
writeln;
writeln('FIRST');
first(k);
vivod(k);
readln
End.


Далее..
Читать из файла и писать в него одновременно в принципе можно, но не во всех случаях желательно. Я бы даже сказал, нежелательно везде, кроме случаев, где этого избежать нельзя либо слишком накладно. И мне кажется, что это не тот случай.. Обычная схема такова:
1. пишешь во временный файл;
2. по окончании удаляешь исходный файл;
3. переименовываешь временный файл.

Вот, примерно так:
var
f,g: file of char;
c: char;
Flag: boolean;

begin
Assign(f,'pavel.txt');
ReSet(f);
Assign(g,'pavel.tmp');
ReWrite(g);
Flag:=true;
while not EoF(f) do begin
Read(f,c);
if (c<>'#')or Flag then Write(g,c);
Flag:=Flag and (c<>'#')
end;
Close(f);
Close(g);
Erase(f);
ReName(g,'pavel.txt')
end.

Если я не прав, и тебе необходимо работать с одним файлом (например, по условию) - скажи, продолжим smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.05.2024 7:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name