Помощь - Поиск - Пользователи - Календарь
Полная версия: Удаление всех пробелов
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
FYzeST
Помогите написать программу которая в текстовом файле удаляет все пробелы. Сам вроде написал. Знаю как их отследить и удалить, но не могу понять как проделаное программой записать в этот же файл...
Lapp
Цитата(FYzeST @ 27.07.2011 11:31) *
Помогите написать программу которая в текстовом файле удаляет все пробелы. Сам вроде написал. Знаю как их отследить и удалить, но не могу понять как проделаное программой записать в этот же файл...

Поскольку тема в теор.разделе, я не буду писать код, а постараюсь сказать словами..

Заводишь два числа типа LongInt - это будут указатели на место чтения и место записи. Например, rRec и wRec. Инициализируй их нулями.
Файл объяви как file of char и открой через Reset.
Дальше читаешь по одному символу и каждый раз увеличиваешь счетчик чтения.
Если прочитанный символ НЕ является пробелом - делаешь Seek(f,wRec), записываешь этот символ туда, увеличиваешь wRec на 1 и возвращаешься к месту чтения, Seek(f,rRec). Если он является пробелом - не делаешь ничего, а просто читаешь дальше. По окончании файла снова идешь к месту wRec и обрезаешь файл (Truncate(f)). Потом закрываешь файл. Все.
FYzeST
Спасибо! Но я не очень понял твой способ, поому что не знаю тех функций.

Глянь код, и скажи если не сложно как дополнить что бы результат функции Delete записался в файл.... Или я тут вобще неправильно все сделал?



 program counter;

uses crt;
var
infile : text;
file_name, s : String;
i : integer;

begin
clrscr;
write('имя файла: ');
readln(file_name);
Assign(infile, file_name);
reset(infile);
while not Eof(infile) do
begin
readln(infile, s);
for i:=1 to length(s) do
begin
if s[i] = ' ' then

delete(s, i, 1);

end;
end;

close(infile);


Writeln('Нажмите <Enter>:');
readln;
end.

FYzeST
Кстате по поводу файлов еще вопрос. У меня текстовый файл с десятью строками. Как я могу получить доступ к одной определенной строке, например к третей ??
Lapp
Твое "удаление пробелов" будет работать неправильно. Не хочу в теоретическом разделе разбирать конкретную задачу с кодом. Попозже перенесу и разделю тему - тогда отвечу.. А вообще, думай, в каком разделе создавать.
И еще.. Не знаешь функции? Ну, посмотри в книге или а Инете.. Или спроси тут.

Цитата(FYzeST @ 27.07.2011 18:00) *
Кстате по поводу файлов еще вопрос. У меня текстовый файл с десятью строками. Как я могу получить доступ к одной определенной строке, например к третей ??

Прямо - никак. Ресетни файл, пропусти нужное кол-во строк, n-1 - и читай. Вот так:

Reset(f);
for i:=2 to n do readln(f);
readln(f,s);
FYzeST
Спасибо большое.
Lapp
Непонятно, как делить тему. Ладно, пусть остается, как есть..

Вот удаление пробелов из файла без переписывания его в новый файл и без особых затрат памяти.
var
f: file of char;
c: char;
r,w: LongInt;

begin
Assign(f,'test.txt');
r:= 0;
w:= 0;
Reset(f);
while not EoF(f) do begin
Read(f,c);
Inc®;
if c<>' ' then begin
Seek(f,w);
Write(f,c);
Inc(w);
Seek(f,r)
end
end;
Seek(f,w);
Truncate(f);
Close(f)
end.


Твой способ удаления пробелов из строки неверен по сути. Он будет удалять только одиночные (или каждый второй в группе) пробелы, а также будет выходить за пределы строки. Если ты заменишь прямой цикл (to) на обратный (downto), то ты исправишь эти ошибки, но останется проблема с его низкой производительностью. Рекомендую почитать вот это: Многократное удаление символов из строки . Там используется фактически тот же способ, что я применил выше к файлу. Если ты хочешь (или должен) обязательно использовать именно текстовые файлы (типа text), то можешь продолжать делать, как делал - читать построчно, удалять пробелы из строки, писать строку в другой файл, потом удалить исходный файл и переименовать результат. При этом ты можешь исправить свою прогу, как я сказал выше, или использовать метод TarasBer'а из FAQ. Но если задача поставлена без ограничений на средства выполнения, то лучше все же работать напрямую с файлом типа file of char.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.