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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 15:21   #1
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию Динамически считать Данные из файла, и вывести результат в файл

Здравствуйте уважаемые эксперты. Помогите решить следующую задачу:Удалить лишние пробелы в тексте. Данные считать из файла, и вывести результат в файл Поискав по форуму нашел, похожую тему, но мне нужно чтобы память выделялась динамически.. В общем вот мой код:
Код:
{$R-}
type TMas=array[1..1] of string;
     PMas=^TMas;

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

procedure ReadCountOfStringFromFile(var FileIn:text; var S:string; var n:longint);
begin
  n:=0;
  while not Eof(FileIn) do
    begin
      readln(FileIn,S);
      inc(n);
    end;
end;

procedure ReadFileInDinamicMas(var FileIn:text; var a:PMas);
var i:integer;
begin
  i:=0;
  while not Eof(FileIn) do
    begin
      inc(i);
      readln(FileIn,a^[i]);
    end;
    Close(FileIn);
end;

procedure InputData(a:PMas; S:string; var n:longint);
var FileIn:text;
    NameFile:string;
begin
  OpenFile(NameFile,FileIn);
  ReadCountOfStringFromFile(FileIn,S,n);
  GetMem(a,SizeOf(string)*n);
  ReadFileInDinamicMas(FileIn,a);
end;

procedure DeleteSpacesInString(var S:string);
var p,i:integer;
begin
  for i:=1 to length(S) do
    begin
      repeat
        p:=Pos('  ',S);
        if p>0 then Delete(S,p,1);
      until p=0;
    end;
      if S[1]=' ' then Delete(S,1,1);
        if S[length(S)]=' ' then Delete(S,length(S),1);
end;

procedure DeleteSpacesInMas(n:longint; var a:PMas);
var i:integer;
begin
  for i:=1 to n do
    DeleteSpacesInString(a^[i]);
end;

procedure OutputData(a:PMas; 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]);
    FreeMem(a,SizeOf(string)*n);
    Close(FileOut);
end;

var a:PMas;
    n:longint;
    S:string;
begin
  InputData(n,S,a);
  DeleteSpacesInMas(n,a);
  OutputData(a,n);
end.
В выходной файл выводится какие то непонятные "корявины". Помогите пожалуйста, не знаю в чем ошибка... Заранее огромное спасибо
StudeHt вне форума Ответить с цитированием
Старый 24.05.2009, 22:24   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Там в паре мест забыли var приписать. А еще, когда вы считаете количество строк в файле, указатель-то остается на конце. Поэтому дальнейшее чтение уже не проходит.
Исправил.
Код:
{$R-}
type TMas=array[1..1] of string;
     PMas=^TMas;

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

procedure ReadCountOfStringFromFile(var FileIn:text; var S:string; var n:longint);
begin
  n:=0;
  while not Eof(FileIn) do
    begin
      readln(FileIn,S);
      inc(n);
    end;
close(FileIn);
reset(FileIn);
end;

procedure ReadFileInDinamicMas(var FileIn:text; var a:PMas);
var i:integer;
begin
  i:=0;
  while not Eof(FileIn) do
    begin
      inc(i);
      readln(FileIn,a^[i]);
    end;
    Close(FileIn);
end;

procedure InputData(var a:PMas; var S:string; var n:longint);
var FileIn:text;
    NameFile:string;
begin
  OpenFile(NameFile,FileIn);
  ReadCountOfStringFromFile(FileIn,S,n);
  GetMem(a,SizeOf(string)*n);
  ReadFileInDinamicMas(FileIn,a);
end;

procedure DeleteSpacesInString(var S:string);
var p,i:integer;
begin
  for i:=1 to length(S) do
    begin
      repeat
        p:=Pos('  ',S);
        if p>0 then Delete(S,p,1);
      until p=0;
    end;
      if S[1]=' ' then Delete(S,1,1);
        if S[length(S)]=' ' then Delete(S,length(S),1);
end;

procedure DeleteSpacesInMas(n:longint; var a:PMas);
var i:integer;
begin
  for i:=1 to n do
    DeleteSpacesInString(a^[i]);
end;

procedure OutputData(a:PMas; 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]);
    FreeMem(a,SizeOf(string)*n);
    Close(FileOut);
end;

var a:PMas;
    n:longint;
    S:string;
begin
  InputData(a,S,n);
  DeleteSpacesInMas(n,a);
  OutputData(a,n);
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Спасибо Вам огромное Sazary! Вы очень выручили!!!
StudeHt вне форума Ответить с цитированием
Старый 25.05.2009, 09:04   #4
cu2zoff
Новичок
Джуниор
 
Регистрация: 20.05.2009
Сообщений: 2
По умолчанию

Присоединяюсь к вышесказаному! Спасибо, я почти это же хотел спросить)))
cu2zoff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно вывести результат класса prikolist Общие вопросы C/C++ 20 23.05.2009 20:06
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Множества. Не получается вывести результат RECREATOR Общие вопросы Delphi 3 24.12.2007 23:31
Как в Microsoft Visual Basic 6.0 открыть Exel файл, считать с него данные(числа) и дальше работать с ними Dimon88 Microsoft Office Excel 7 20.10.2007 13:30
как считать данные с Txt файла? Alar Общие вопросы Delphi 0 29.10.2006 20:12