Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы
Старый 05.04.2009, 11:53   #1
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию Удалить лишние пробелы

Помогите исправить ошибку. В файле удаляется вся первая строка, а остальные строки даже не программа не считывает Вот код:
Код:
procedure DeleteSpaces(p:byte; S:string);
begin
  repeat
    p:=Pos('  ',S);
    if p>0 then Delete (S,p,1);
  until p=0;
  if S[1]=' ' then
    Delete(S,1,1);
  if S[length(S)]=' ' then
    Delete(S,length(S),1);
end;

procedure InputData(var NameFile,S:string; var p:byte);
var FileIn:text;
begin
  write('Введите имя входного файла ');
  readln(NameFile);
  assign(FileIn,NameFile);
  {$I-}
  reset(FileIn);
  {$I+}
    if IOResult<>0 then
      begin
        writeln('Ошибка!Файл ',NameFile,' не найден!');
        readln;
        exit;
      end;
    while not Eof(FileIn) do
      begin
        readln(FileIn,S);
        DeleteSpaces(p,S);
      end;
    Close(FileIn);
end;

procedure OutputData(NameFile:string; var FileOut:text; S:string; p:byte);
var FileIn:text;
begin
  write('Введите имя выходного файла ');
  readln(NameFile);
  assign(FileOut,NameFile);
  rewrite(FileOut);
  writeln(FileOut,S);  
  Close(FileOut);
end;

var FileIn,FileOut:text;
    S,NameFile:string;
    p:byte;
begin
  InputData(NameFile,S,p);
  OutputData(NameFile,FileOut,S,p);
end.
Препод сказал, что в основной программе должнен быть только вывов процедур.
Иван 883 вне форума Ответить с цитированием
Старый 05.04.2009, 14:13   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Нет ) Так работать не будет.
Зачем вы передаете процедурам p, S и прочее? Определите их прямо в процедуре.
Дальше:
Код:
procedure DeleteSpaces(p:byte; S:string);
Строку-то вы изменяете, но только внутри процедуры.
А это вообще кошмар:
Код:
rewrite(FileOut);
  writeln(FileOut,S);  
  Close(FileOut);
В общем, вот:
Код:
uses crt;

procedure DeleteSpaces(var S:string);
var p : integer;
begin
  repeat
    p:=Pos('  ',S);
    if p>0 then Delete (S,p,1);
  until p=0;
  if S[1]=' ' then
    Delete(S,1,1);
  if S[length(S)]=' ' then
    Delete(S,length(S),1);
end;
{---------}

procedure InputData;
var NameFile,S:string;
FileIn:text;
FileOut : text;
begin
  write('Введите имя входного файла ');
  readln(NameFile);
  assign(FileIn,NameFile);
  {$I-}
  reset(FileIn);
  {$I+}
    if IOResult<>0 then
      begin
        writeln('Ошибка!Файл ',NameFile,' не найден!');
        readln;
        exit;
      end;
  write('Введите имя выходного файла ');
  readln(NameFile);
  assign(FileOut,NameFile);
  rewrite(FileOut);

    while not Eof(FileIn) do
      begin
        readln(FileIn,S);
        DeleteSpaces(S);
        writeln(FileOut,S);
      end;
    Close(FileIn);
    Close(FileOut);
end;


begin
  clrscr;
  InputData;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.04.2009, 15:13   #3
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Спасибо Sazary. А вообще возможно разбить процедуру InputData на 2, т.е. что б в одной процедуре учавствовал входной файл и действия над ним, а в другой выходной файл?
Иван 883 вне форума Ответить с цитированием
Старый 05.04.2009, 15:18   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
А вообще возможно разбить процедуру InputData на 2, т.е. что б в одной процедуре учавствовал входной файл и действия над ним, а в другой выходной файл?
Тогда придется заводить массив строк. Заполнять его в первой процедуре и писать из него во второй. А иначе-то как?
Действия-то тут какие? Запись из первого файла во второй (с некоторыми преобразованиями). Поэтому и в процедуре должны участвовать оба файла.
Смысла разбивать не вижу.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.04.2009, 22:33   #5
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

К сожалению препод сказал, что нужно разбить процедуру на 2. Вот некоторые соображения:
Код:
type Mas=array[1..50] of string;

function InputData(var a:Mas):integer;
var FileIn:text;
    NameFile:string;
    i:integer;
begin
  write('Введите имя входного файла ');
  readln(NameFile);
  assign(FileIn,NameFile);
  {$I-}
  reset(FileIn);
  {$I+}
    if IOResult<>0 then
      begin
        writeln('Ошибка!Файл ',NameFile,' не найден!');
        readln;
        exit;
      end;
    i:=0;
    while not Eof(FileIn) do
      begin
        inc(i);
        readln(FileIn,a[i]);
      end;
  Close(FileIn);
  InputData:=i;
end;

procedure DeleteSpaces(var a:Mas; SizeOfFile:integer);
var p,i:integer;
begin
  for i:=1 to SizeOfFile do
    repeat
      p:=Pos('  ',a[i]);
      if p>0 then Delete (a[i],p,1);
    until p=0;
    if a[1]=' ' then
      Delete(a[i],1,1);
    if a[length(a[i])]=' ' then
      Delete(a[i],length(a[i]),1);
end;
function OutputData(a:Mas):integer;
var NameFile:string;
    FileOut:text;
    i:integer;
begin
  write('Введите имя выходного файла ');
  readln(NameFile);
  assign(FileOut,NameFile);
  rewrite(FileOut);
  inc(i);
  writeln(FileOut,a[i]);
  Close(FileOut);
  OutputData:=i;
end;

var a:Mas;
    SizeOfFile:integer;
begin
  clrscr;
  InputData(a);
  DeleteSpaces(a,SizeOfFile);
  OutputData(a);
  readln;
end.
Но я не зная как в таком случае организовать вывод данных. Помогите пожалуйста

Спасибо Sazary. К сожалению не могу оставить Вам отзыв, т.к. Вы были последним кому я его оставлял.

Последний раз редактировалось Иван 883; 06.04.2009 в 22:54.
Иван 883 вне форума Ответить с цитированием
Старый 06.04.2009, 22:45   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ваш код не смотрел, т.к. проще сориентироваться в том, что было.
Рабочий вариант:
Код:
uses crt;

type Mas=array[1..50] of string;

procedure DeleteSpaces(var a : mas; n : integer);
var p,i : integer;
begin
for i:=1 to n do
 begin
  repeat
    p:=Pos('  ',a[i]);
    if p>0 then Delete (a[i],p,1);
  until p=0;
  if a[i][1]=' ' then
    Delete(a[i],1,1);
  if a[i][length(a[i])]=' ' then
    Delete(a[i],length(a[i]),1);
 end;
end;
{---------}

procedure InputData(var a : mas; var n : integer);
var NameFile:string;
FileIn:text;
begin
  write('Введите имя входного файла ');
  readln(NameFile);
  assign(FileIn,NameFile);
  {$I-}
  reset(FileIn);
  {$I+}
    if IOResult<>0 then
      begin
        writeln('Ошибка!Файл ',NameFile,' не найден!');
        readln;
        exit;
      end;
    n := 0;
    while not Eof(FileIn) do
      begin
      inc(n);
      readln(FileIn,a[n]);
      end;
    Close(FileIn);
end;
{-----------}
procedure OutputData(a : mas; n : integer);
var
FileOut : text;
NameFile:string;
i : integer;
begin
write('Введите имя выходного файла ');
readln(NameFile);
assign(FileOut,NameFile);
rewrite(FileOut);

for i:=1 to n do
 writeln(FileOut,a[i]);

close(FileOut);
end;
{----------}
var M : mas;
n : integer;

begin
  clrscr;
  InputData(M,n);
  DeleteSpaces(M,n);
  OutputData(M,n);
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу delphi MASIK Общие вопросы Delphi 7 22.12.2010 18:23
Удалить лишние ячейки Ilya87 Microsoft Office Excel 8 25.02.2009 13:46
Помогите решить. Паскаль. Работа со строками. Удалить лишние пробелы. Комильфо Помощь студентам 3 10.11.2007 21:42
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу c++ DimaG Общие вопросы C/C++ 1 01.11.2007 21:50
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36