Помогите написать программу которая в текстовом файле удаляет все пробелы. Сам вроде написал. Знаю как их отследить и удалить, но не могу понять как проделаное программой записать в этот же файл...
Lapp
27.07.2011 15:35
Цитата(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
27.07.2011 17:53
Спасибо! Но я не очень понял твой способ, поому что не знаю тех функций.
Глянь код, и скажи если не сложно как дополнить что бы результат функции 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
27.07.2011 21:00
Кстате по поводу файлов еще вопрос. У меня текстовый файл с десятью строками. Как я могу получить доступ к одной определенной строке, например к третей ??
Lapp
28.07.2011 0:30
Твое "удаление пробелов" будет работать неправильно. Не хочу в теоретическом разделе разбирать конкретную задачу с кодом. Попозже перенесу и разделю тему - тогда отвечу.. А вообще, думай, в каком разделе создавать. И еще.. Не знаешь функции? Ну, посмотри в книге или а Инете.. Или спроси тут.
Цитата(FYzeST @ 27.07.2011 18:00)
Кстате по поводу файлов еще вопрос. У меня текстовый файл с десятью строками. Как я могу получить доступ к одной определенной строке, например к третей ??
Прямо - никак. Ресетни файл, пропусти нужное кол-во строк, n-1 - и читай. Вот так:
Reset(f); for i:=2 to n do readln(f); readln(f,s);
FYzeST
28.07.2011 1:18
Спасибо большое.
Lapp
28.07.2011 4:09
Непонятно, как делить тему. Ладно, пусть остается, как есть..
Вот удаление пробелов из файла без переписывания его в новый файл и без особых затрат памяти.
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.