Помощь - Поиск - Пользователи - Календарь
Полная версия: обнуление и удаление строк в файле
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
дан файл со строками (их кол-во не известно). Если в 3 или 5 строке 4-й элемент пробел, то скопировать этот файл в другойб заменив при этом эти символы нулём. Если это условие не выполняется , то удалить эти строки, создав новый файл (имеется в виду переписать в новый файл исходный файл без 3-й и 5-й строк)

использовать только write, read, assign, rewrite, reset, eof, erase, rename, seek

прежде всего не знаю ,как ввести в файл текст по строкам, с вводом в моем варианте решения полная ерунда, получается что-то бесконечно..

ещё не пойму, как переписать в новый файл исходный файл без 3-й и 5-й строк



uses crt;
procedure save_file ( filename : string );
var
f : file of string;
s : string;
c : char;
begin
assign ( f, filename);
rewrite (f);
writeln ('vvedite dannye v file');
repeat
readln ( c );
s := s+c;
until c='.';
readkey;
write (f, s);
close (f);
end;

procedure print_file ( filename : string );
var
f : file of string;
s: string;
i : byte;
begin
assign ( f, filename );
reset (f);
while not eof (f) do
begin
for i := 1 to length (s) do
begin
read (f, s);
writeln (s[i]);
end;
end;
close (f);
end;

procedure file_preobrazovanie ( f_in,f_out : string );
var
f, f1 : file of string;
s : string;
i : byte;
begin
assign (f, f_in );
reset (f);
seek (f, 2 );
if (s[4] = ' ') then
begin
s[4] := '0';
assign (f1, f_out );
rewrite (f1);
while not eof (f) do
write ( f1, s );
close ( f1 );
end;
seek (f, 4);
if (s[4] = ' ') then
begin
s[4] := '0';
assign (f1, f_out );
rewrite (f1);
while not eof (f) do
write ( f1, s );
close ( f1 );
end;
close (f);
end;
vAR
fil : file of string;
begin
clrscr;
save_file ('x-files.bin');
writeln ('============================');
print_file ('x-files.bin');
file_preobrazovanie ('x-files.bin','x-files1.bin');
writeln ('========================');
print_file ('x-files1.bin');
readkey;
end.

Bokul
Конец ввода строки - "." (точка)
Конец ввода (вообще) - Enter


uses crt;
procedure save_file ( filename : string );
var
f : file of string;
s : string;
c : char;
begin
assign(f,filename);
rewrite(f);
writeln('vvedite dannye v file');
repeat
s:='';
repeat
c:=readkey;
write©;
s:=s+c;
until (c='.') or (c=#13);
write(f,s);
writeln;
until c=#13;
close(f);
end;

procedure print_file(filename:string);
var
f:file of string;
s:string;
i:byte;
begin
assign(f,filename);
reset(f);
while not eof(f) do
begin
read(f,s);
writeln(s);
end;
close (f);
end;

procedure file_preobrazovanie ( f_in,f_out : string );
var
f,f1:file of string;
s:string;
i:byte;
b:boolean;
begin
assign(f,f_in);
reset(f);
seek(f,2);
read(f,s);
b:=false;
if (s[4]=' ') then
b:=true
else
begin
seek(f,4);
read(f,s);
if s[4]=' ' then
b:=true;
end;
assign(f1,f_out);
rewrite(f1);
i:=0;
seek(f,0);
while not eof(f) do
begin
inc(i);
read(f,s);
if (i=3) or (i=5) then
if b then
s[4]:='0'
else
continue;
write(f1,s);
end;
close(f);
close(f1);
end;
vAR
fil : file of string;
begin
clrscr;
save_file('x-files.bin');
writeln ('============================');
print_file('x-files.bin');
file_preobrazovanie('x-files.bin','x-files1.bin');
writeln ('========================');
print_file('x-files1.bin');
readkey;
end.


18192123
Цитата(Bokul @ 17.12.2006 20:32) *


continue;




никогда с таким не сталкивалась? что это обозначает?
Bokul
Справка Паскаля:
Цитата

Continues a for, while, or repeat statement.

Declaration:
procedure Continue

Target:
Windows, Real, Protected

Remarks:
Causes the innermost enclosing for, while, or
repeat statement to
immediately proceed with the next iteration.

The compiler will report an error if a call to
Continue is not enclosed by a
for, while, or repeat statement.



while not eof(f) do
begin
inc(i);<---------------<-------------|
read(f,s); |
if (i=3) or (i=5) then |
if b then |
s[4]:='0' |
else |
continue;---------->------->---|
write(f1,s);
end;

18192123
я пытаюсь что-то ввести в файл, но нажимая буквы получаю только изменение положения курсора

но чаще всего - ошибка 100


????????????

ой, ой! все получилось! спасибо большое!!!!!
Bokul
Цитата
я пытаюсь что-то ввести в файл, но нажимая буквы получаю только изменение положения курсора

Глюк форума:

procedure save_file ( filename : string );
var
f : file of string;
s : string;
c : char;
begin
assign(f,filename);
rewrite(f);
writeln('vvedite dannye v file');
repeat
s:='';
repeat
c:=readkey;
write©; {поставь после write "с" в дужках}
s:=s+c;
until (c='.') or (c=#13);
write(f,s);
writeln;
until c=#13;
close(f);
end;

18192123
Цитата(Bokul @ 17.12.2006 21:08)
Глюк форума:


Да, я уже поняла! сегодня когда выкладывала этот код, было тот самое!
Еще раз спасибо!!!!!!
Bokul
Цитата
а как сделать, чтоб в результирующий файл записывались строки кроме 3-й и 5-й??

Для этого у меня continue и стоит. Посмотри внимательно на тот кусок кода, должна понять, как все работает...
18192123
а как сделать, чтоб в новый файл записывались строки кроме 3-й и 5-й??

у меня вообще нет никаких предположений...


теперь разобралась... уфффффффффффффф....
Bokul
Я наверное читаю твои мысли... lol.gif Посмотри на на мой пост выше...
18192123
а можно как-нибудь без continue, а то наш препад, как всегда скажет: ".... я вам этого не объяснял"....
Bokul
Цитата
а можно как-нибудь без continue,

Можно и goto использовать... smile.gif

А если только проверками, то так:

while not eof(f) do
begin
inc(i);
read(f,s);
if (i=3) or (i=5) then
begin
if b then
begin
s[4]:='0';
write(f1,s);
end;
end
else
write(f1,s);
end;
18192123
Цитата(Bokul @ 17.12.2006 22:00) *

А если только проверками, то так:

while not eof(f) do
begin
inc(i);
read(f,s);
if (i=3) or (i=5) then
begin
if b then
begin
s[4]:='0';
write(f1,s); end;
end
else
write(f1,s); end;




Почему так, где я выделила красным цветом мы пишем одно и то же?
Bokul
Почему же одно и то же? Ты не заметила вот эту строчку:
s[4]:='0';

перед первым write(f1,s);
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.