Консультация № 175187
13.12.2009, 10:54
35.00 руб.
0 7 1
Уважаемые эксперты, Дан текстовый файл F. Требуется написать программу исключающую пробелы, стоящие в конце строк, а также заменить на одинарные все повторные пробелы(двойные, тройные) внутри строк

Обсуждение

Неизвестный
13.12.2009, 14:29
общий
это ответ
Здравствуйте, Кусмарцев Андрей Валерьевич.
Вот в приложении программа, решающая Вашу задачу. Комментарии писал, но если ещё что-то не понятно - спрашивайте
Принцип работы: пишу обработанные строки в буферный файл, потом исходный удаляю, а буферный переименовываю

Приложение:
uses CRT;
VAR
t, t_buf: Text;
S: String;
fName: String; {Имя файла}
BEGIN
Write('Введите имя файла: '); ReadLn(fName);
Assign(t, fName);
{$I-}
{Защищаемся от сбоя, если файла нет или его нельзя открыть
В данном режиме отключается контроль операций ввода-вывода
Вернее - реакция на ошибки, но вырабатывается код завершения
операции. Особенно в чистом ДОС этого нельзя было делать надолго}
Reset(t);
{$I+} {Включаем контроль}
{Узнаем код открытия. Достаточно значть, что 0 - это хорошо}
if IOResult <> 0 then begin
WriteLn('Не удается открыть файл ', fName);
WriteLn('Работа программы завершается. Нажмите любую клавишу');
ReadKey;
Halt(1)
end;
{Сюда попадем, если все хорошо}
Assign(t_buf, 'buf.txt');
Rewrite(t_buf);
{Измененные строки будем писать в новый фавый буферный файл, который
потом перименуем и удалим}
{Функция EOF = EndOfFile определяет, достигнут ли конец файла}
{Возвращается в начало файла}
Reset(t);
While NOT EOF(t) do begin
{Здесь также надо бы проверять на првильность чтения, как
при открытии файла. Если нужно, скажите - допишу}
ReadLn(t, S);
{Следующая строка для контроля. В обычном режиме
не нужна - поэтому закомментировал}
{ WriteLn('"',S,'"'); }
{Удаляем пробелы в начале, но если строка содержит одни пробелы,
то хотя бы один оставим}
While (S[1] = ' ') and (length(S) > 1) do delete(S, 1, 1);
{Пробелы в конце}
While (S[length(S)] = ' ') and (length(S) > 1) do
delete(S, length(S), 1);
{Двойные внутри: с помощью POS находим места, где два пробела}
While (POS(' ', S) <> 0 ) do delete(S, POS(' ',S), 1);
WriteLn(t_buf, S);
end;
Flush(t_buf);
{заставляет ждать, пока все перепишется в файл
Информация в текстовый файл пишется относительно долго
Может случится, что программа завершит работу, и файл
закроется, а еще не все дописано}
Close(t); Close(t_buf);
Erase(t);
Rename(t_buf, fName);
END.
Прикрепленные файлы:
5
Неизвестный
13.12.2009, 15:57
общий
erase(t) что делает?
Неизвестный
13.12.2009, 16:05
общий
и почему то не удаляет пробелы в конце строк
Неизвестный
13.12.2009, 16:06
общий
и если пробел в начале делает чето непонятное
Неизвестный
13.12.2009, 19:55
общий
Хм. Проверял - удаляет. Сейчас еще раз посмотрю
Erase(t) удаляет исходный файл, чтобы файл buf.txt (временный файл) можно было переименовать в имя пока еще существующего файла
Неизвестный
13.12.2009, 19:57
общий
А в чем писали текстовый файл?
Неизвестный
13.12.2009, 20:03
общий
Какова кодировка файла текстового у Вас?
Если файл текстовый писать в редакторе Borland Pascal, то учтите, что он пробелы в конце строки убирает при сохранении

Опять проверил - все нормально:
Вот окно вывода измененной чуть программы (добавил строки для показа строк в исходном файле и в измененном):
Код:
Введите имя файла: 175187.txt
" 878 098 7 8 "
" 12d f 7 7 "
>878 098 7 8<
>12d f 7 7<

Вот текст программы:
Код:
uses CRT;
VAR
t, t_buf: Text;
S: String;
fName: String; {Имя файла}
BEGIN
Write('Введите имя файла: '); ReadLn(fName);
Assign(t, fName);
{$I-}
{Защищаемся от сбоя, если файла нет или его нельзя открыть
В данном режиме отключается контроль операций ввода-вывода
Вернее - реакция на ошибки, но вырабатывается код завершения
операции. Особенно в чистом ДОС этого нельзя было делать надолго}
Reset(t);
{$I+} {Включаем контроль}
{Узнаем код открытия. Достаточно значть, что 0 - это хорошо}
if IOResult <> 0 then begin
WriteLn('Не удается открыть файл ', fName);
WriteLn('Работа программы завершается. Нажмите любую клавишу');
ReadKey;
Halt(1)
end;
{Сюда попадем, если все хорошо}
Assign(t_buf, 'buf.txt');
Rewrite(t_buf);
{Измененные строки будем писать в новый фавый буферный файл, который
потом перименуем и удалим}
{Функция EOF = EndOfFile определяет, достигнут ли конец файла}
{Возвращается в начало файла}
Reset(t);
While NOT EOF(t) do begin
{Здесь также надо бы проверять на првильность чтения, как
при открытии файла. Если нужно, скажите - допишу}
ReadLn(t, S);
{Следующая строка для контроля. В обычном режиме
не нужна - поэтому закомментировал}
{!!!! ЗДЕСЬ ИЗМЕНИЛ - убрал комментарий}
WriteLn('"',S,'"');
{Удаляем пробелы в начале, но если строка содержит одни пробелы,
то хотя бы один оставим}
While (S[1] = ' ') and (length(S) > 1) do delete(S, 1, 1);
{Пробелы в конце}
While (S[length(S)] = ' ') and (length(S) > 1) do
delete(S, length(S), 1);
{Двойные внутри: с помощью POS находим места, где два пробела}
While (POS(' ', S) <> 0 ) do delete(S, POS(' ',S), 1);
WriteLn(t_buf, S);
end;
Flush(t_buf);
{заставляет ждать, пока все перепишется в файл
Информация в текстовый файл пишется относительно долго
Может случится, что программа завершит работу, и файл
закроется, а еще не все дописано}
Close(t); Close(t_buf);
Erase(t);
Rename(t_buf, fName);
{!!!! ЗДЕСЬ ИЗМЕНИЛ}
Reset(t);
while NOT EOF(t) do begin
ReadLn(t, S);
WriteLn('>', S,'<');
end;
END.

Сохраненный файл В ТОЧНОСТИ соответствует выводу
Форма ответа