Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строки...

Автор: sandman 5.09.2003 2:00

Вроде несложная задачка..
"В текстовом файле (размер до 600kb) удалить все символы перевода строки."
А как подступиться не знаю.. Мозга не варит sad.gif Советом, хоть помогите...

Автор: trminator 5.09.2003 14:34

Первое, что пришло в голову - читать из файла ReadLn'ом, а писАть Write'ом (правда, придется заводить для этого разные файлы, но я все равно не знаю способа именно изменять файл - умею или только писАть, или только читать sad.gif)

Автор: Ivs 6.09.2003 1:15

Перевод строки это если я не ошибаюсь символ #10. Так что мешает. Читай Read'ом символ, и если он не "символ перевода строки", то пиши в новый файл Writ'ом.
Ну а дальше удаляй старый и переименовывай новый.

Автор: sandman 6.09.2003 1:23

Цитата
Перевод строки это если я не ошибаюсь символ #10. Так что мешает. Читай Read'ом символ, и если он не "символ перевода строки", то пиши в новый файл Writ'ом.
Ну а дальше удаляй старый и переименовывай новый.


тогда имхо быстрее будет так, как написал trminator...

Автор: Ivs 6.09.2003 1:30

Цитата

тогда имхо быстрее будет так, как написал trminator...

Нет, так будет неправильно.

Автор: zx1024 6.09.2003 1:40

>sandman
Pascal делает то же самое (читает перевод строки), поэтому скорость зависит от реализации.
>Ivs
#10 #13
>Ну а дальше удаляй старый и переименовывай новый.
Слишком долго, т.к. идёт обращение к винту.

Автор: Ivs 6.09.2003 1:43

Цитата
>Ivs
#10 #13
.

А я думал что это символы перевода строки и возврата корретки.

Автор: Ivs 6.09.2003 1:45

Цитата
>Ну а дальше удаляй старый и переименовывай новый.
Слишком долго, т.к. идёт обращение к винту.

Ваш вариант.

Автор: zx1024 6.09.2003 1:56

Ivs
Так они по одному редко используются. Тем более в этой задаче. Тем более после ответа про ReadLn.

Автор: zx1024 6.09.2003 1:58

Ivs.
Я имел ввиду то, что не стоит после каждого нахождения #10 работать с файлами (физически).

Автор: zx1024 6.09.2003 2:00

Ivs.
P.S. Просьба: не надо меня на Вы. Пожалуйста.

Автор: Ivs 6.09.2003 2:01

Хорошо тогда так: Читай Read'ом символ, и если он не "символ перевода строки" и "возврата корретки", то пиши в новый файл Writ'ом. Проверил работает.
Вариант с readln'ом не работает.

Автор: Ivs 6.09.2003 2:02

Цитата
Ivs.
P.S. Просьба: не надо меня на Вы. Пожалуйста.

Как хочешь.

Автор: zx1024 6.09.2003 2:33

Ivs.
Наверное, мне придётся извиниться за  <06.09.2003 00:40:07>.
Ведь в условии ничего не было про возврат корретки.

Автор: sandman 6.09.2003 10:57

Всем спасибо. Все понял. Во всем разобрался smile.gif

Автор: trminator 9.09.2003 22:11

Цитата
Вариант с readln'ом не работает.

Я согласен, правильнее было бы обрабатывать по символам, как ты рекомендовал. Но это грустно и тоскливо (по-моему). Поэтому я предложил такой способ.

Но мне интересно, почему он у тебя не проходит. Я его только что прогнал - он работает (Delphi console application)
Код

program Project2;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var input, output : text;
   s: string;
begin
 assign(input,'input.txt');
 assign(output,'output.txt');
 reset(input);
 rewrite(output);

 while not EOF(input) do begin
   ReadLn(input,s);
   Write(output,s)
 end;

 close(input);
 close(output);
end.

Сейчас проверю в BP7

Автор: GLuk 16.09.2003 9:39

А як же BlockRead/Write??!!

Автор: trminator 16.09.2003 12:37

ммм... при чем тут BlockRead? Это же текстовый файл, зачем BlockRead?

Автор: sandman 16.09.2003 12:54

Всем спасибо за ответы и предложения, но задача усложняется... smile.gif Возможно, что файл в koi8-r smile.gif
Тогда что? smile.gif

Автор: trminator 16.09.2003 22:23

так... По идее, нам все равно, в каком там порядке идут русские буковки (да хоть маковская кодировка, #10#13 они такими и будут). Но. Возможно, мы имеем тогда дело с файлом в стиле Unix, а там принято строку заканчивать не #10#13 а просто #10. Тогда читаем по байту, если это не #10, то записываем.

В общем, все то же самое

Автор: GLuk 17.09.2003 8:47

Цитата
ммм... при чем тут BlockRead? Это же текстовый файл, зачем BlockRead?


Какая разница, всяко лучше читать по блокам, чем по строкам. И выдает он тебе те ж самые данные, что и ReadLn только побыстрее.
Читаем данные в первый сегмент, затем чекаем на предмет 13,10, одновременно посылая отчеканенные данные в другой сегмент, потом пишем его на ЖД и так пока не кончатся данные...

И, к слову, понятия текстового файла на бинарном уровне принципиально не может быть.