Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 19
1

Откорректировать файл, удаляя пустые строки, пробелы в конце и вначале строк и оставляя между словами по одному пробелу

28.01.2020, 15:53. Просмотров 1284. Ответов 5
Метки нет (Все метки)


Дан текстовый файл Т. Откорректировать его, удаляя пустые строки, пробелы в конце и вначале строк и оставляя между словами по одному
пробелу. Собственно код внизу, уважаемые знатоки, не могли бы описать что происходит на каждом этапе выполнения, проще говоря - комментарии, буду очень признателен, хотелось бы понимать что к чему.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Program k1;
const
 f='text.txt';
 g='aaa.txt';
var
 t,a: text;
 st: string;
function pr1(x: string): string;
var i:integer;
begin
if x[1]=' ' then
while x[1]=' ' do
delete(x,1,1);
pr1:=x;
end;
function pr2(x: string): string;
var i: integer;
begin
if x[length(x)]=' ' then
while x[length(x)]=' ' do
delete(x,length(x),1);
pr2:=x;
end;
function prob(x: string): string;
var i,j: integer;
begin
while pos('  ',x)>0 do{здесь везде по 2 пробела}
delete(x,pos('  ',x),1);
prob:=x;
end;
begin
assign(t,f);
assign(a,g);
reset(t);
rewrite(a);
while not eof(t) do
 begin
  readln(t,st);
  if length(st)>0 then
    begin
     st:=pr1(st);
     st:=pr2(st);
     st:=prob(st);
     writeln(a,st);
    end;
 end;
close(t);
close(a);
erase(t);
rename(a,f);
writeln('Файл отредактирован');
readln
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2020, 15:53
Ответы с готовыми решениями:

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

Откорректировать файл, удаляя пустые строки, пробелы в конце и вначале строк и оставляя между словами по одному пробелу
Помогите пожалуйста. Задание. Дан текстовый файл Т. Откорректировать его, удаляя пустые строки,...

Отредактировать предложение, удаляя из него лишние пробелы, оставляя по одному пробелу между словами
Отредактировать предложение, удаляя из него лишние пробелы, оставляя по одному пробелу между...

Отредактировать предложение, удаляя из него лишние пробелы, оставляя только по одному пробелу между словами
Отредактировать предложение, удаляя из него лишние пробелы, оставляя только по одному пробелу между...

5
Модератор
62900 / 46930 / 32344
Регистрация: 18.05.2008
Сообщений: 113,713
28.01.2020, 16:07 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//функция удаления пробелов в начале строки
function pr1(x: string): string;
var i:integer;
begin
if x[1]=' ' then//если первый символ пробел
while x[1]=' ' do //то пока пробелы
delete(x,1,1); //удаляем из по одному
pr1:=x;//значение функции измененная строка
end;
//функция удаления пробелов в конце строки
function pr2(x: string): string;
var i: integer;
begin
if x[length(x)]=' ' then//если последний символ пробел
while x[length(x)]=' ' do // то пока пробелы
delete(x,length(x),1);//удаляем их по одному
pr2:=x;//значение функции измененная строка
end;
//функция удаления лишних пробелов в строке
function prob(x: string): string;
var i,j: integer;
begin
//пока есть 2 пробела рядом
while pos('  ',x)>0 do{здесь везде по 2 пробела}
delete(x,pos('  ',x),1);//один удаляем
prob:=x;//значение функции измененная строка
end;
begin
assign(t,f);//связываем переменную t с исходным файлом
assign(a,g);//связываем переменную а с вспомогательным файлом
reset(t); //открываем исходный для чтения
rewrite(a);//открываем вспомогательный для записи
while not eof(t) do //пока не конец файла
 begin//читаем строки
  if length(st)>0 then//если строка не пустая
    begin
     st:=pr1(st);//удаляем пробелы в начале
     st:=pr2(st);//удаляем пробелы в конце
     st:=prob(st);//удаляем лишние пробелы
     writeln(a,st);//пишем строку в файл а
    end;
 end;
close(t); //закрываем файлы
close(a);
erase(t);//удаляем исходный файл
rename(a,f);//переименовываем вспомогательный в исходный
writeln('Файл отредактирован');
readln
end.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5693 / 3408 / 2429
Регистрация: 22.11.2013
Сообщений: 9,562
Записей в блоге: 1
28.01.2020, 16:54 3
Строки 5 и 14 лишние, их можно смело выкинуть, while сам себе if.
0
0 / 0 / 0
Регистрация: 04.05.2018
Сообщений: 19
28.01.2020, 17:02  [ТС] 4
Сейчас проверил, программе не оставляет пробел между словами, подскажите, пожалуйста, что и куда нужно добавить?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5693 / 3408 / 2429
Регистрация: 22.11.2013
Сообщений: 9,562
Записей в блоге: 1
28.01.2020, 17:24 5
Удаление лишних пробелов можно было сделать много проще:
Pascal
1
2
3
4
5
6
7
8
9
10
11
function Trim(s: String): String;
var p: Integer;
begin
  p:=Pos('  ',s);
  while p>0 do begin
    Delete(s,p,1); p:=Pos('  ',s); { удалим пробел из пары }
  end;
  if s[1]        =' ' then Delete(s,1,        1); { удалим пробел в начале }
  if s[Length(s)]=' ' then Delete(s,Length(s),1); { удалим пробел в конце }
  Trim:=s;
end;
Кроме того, не исключено, что на пустоту строку нужно проверять не до удаления лишних пробелов, а после:
Pascal
36
37
38
39
  while not EoF(t) do begin
    ReadLn(t,st); st:=Trim(st);
    if Length(st)>0 then WriteLn(a,st);
  end;
Добавлено через 16 минут
Другой вариант удаления пробелов:
Pascal
1
2
3
4
5
6
7
8
9
10
11
procedure Trim(var s: String);
var i, j: Integer;
begin
  j:=0; i:=1; while s[i]=' ' do Inc(i);  { FPC гарантирует #0 в конце строки }
  for i:=i to Length(s) do
    if (s[i]<>' ') or (s[i]=' ') and (s[i-1]<>' ') then begin
      Inc(j); s[j]:=s[i];
    end;
  if (j>0) and (s[j]=' ') then Dec(j);
  SetLength(s,j);
end;
1
Модератор
8397 / 4151 / 2871
Регистрация: 17.08.2012
Сообщений: 13,231
02.02.2020, 21:19 6
Лучший ответ Сообщение было отмечено SamaelHelb как решение

Решение

SamaelHelb, программа содержит алгоритмическую ошибку: если прочитанная из файла строка содержит только пробелы, на строе 12 произойдёт выход индекса за границы строки. Если бы функция pr2 вызывалась до функции pr1, эта же ошибка возникала бы на строке 20. А за объявление без надобности глобальных переменных до подпрограмм нужно в угол ставить, как минимум. Чтобы неповадно было. И ещё... А на кой чёрт в Ваших функциях объявлены локальные переменные i и j?

Программу лучше переделать. Что именно нужно переделать, не известно, поскольку не известно, нужно ли вообще что-либо переделывать. И, всё-таки, на программу смотреть противно. По минимуму, можно исправить вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Program kr1;
 
function pr1(x: string): string; //функция удаления пробелов в начале строки
begin
  while (length(x) > 0) and (x[1] = ' ') do delete(x, 1, 1); //удаление ведущих пробелов
  pr1 := x //возврат результата
end;
 
function pr2(x: string): string; //функция удаления пробелов в конце строки
begin
  while (length(x) > 0) and (x[length(x)] = ' ') do delete(x, length(x), 1);
  pr2 := x
end;
 
function prob(x: string): string; //функция замены многократного пробела на одинарный
begin
  while pos('  ', x) > 0 do delete(x, pos('  ', x), 1);//пока в строке есть два пробела подряд, удалять один пробел
  prob:=x //возврат результата
end;
 
const
  f = 'text.txt';
  g = 'aaa.txt';
 
var
  t, a: text;
  st: string;
 
begin
  assign(t, f); //входной файл
  reset(t);
  assign(a, g); //выходной файл
  rewrite(a);
  while not eof(t) do //пока не конец файла, цикл
    begin
      readln(t, st); //чтение строки из файла
      st := prob(pr2(pr1(st))); //удаление лишних пробелов
      if length(st) > 0 then writeln(a, st) //если строка не пустая, то записать полученную строку в файл
    end;
  close(t);
  close(a);
  erase(t); //стереть входной файл
  rename(a, f); //дать выходному файлу имя входного файла
  writeln('Файл отредактирован');
  readln
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2020, 21:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Удалить повторяющиеся пробелы между отдельными словами строки (оставляя по одному пробелу)
Введите предложение, слова в котором разделены пробелами и в конце которого стоит точка. Удалите...

Удалить из строки лишние пробелы, оставляя между словами только по одному пробелу
Удалить из строки лишние пробелы, оставляя между словами только по одному пробелу

Ввести текст.Отредактировать текст,удаляя из него лишние пробеоы,оставляя только по одному пробелу между словами
Ввести текст.Отредактировать текст,удаляя из него лишние пробеоы,оставляя только по одному пробелу...

Откорректировать файл, удаляя пустые строки
Дан текстовый файл Т. Откорректировать его, удаляя пустые строки, пробелы в конце и вначале строк и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.