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

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

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

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 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