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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 22:30   #1
coolpack
 
Регистрация: 28.11.2012
Сообщений: 5
Вопрос чтение из файла (делфи)

Всем привет!
У меня есть программа на делфи радиолокационная станция, когда запускаю программу выдает ошибку: project project2.exe raised exception class EInOutError with message 'I/O error 104'. Process stopped. Use step or run to continue.

Помогите, пожалуйста, никак не могу исправить ошибку.

2
350 600 60 450 700 60
1550 -20 30 1600 -20 30
5
эти данные находятся в текстовом документе, их теребуется заносить в программу

Листинг программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, Buttons;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    XPManifest1: TXPManifest;
    BitBtn1: TBitBtn;
    ListBox1: TListBox;
    Button2: TButton;
    ListBox2: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 mas: array of array of integer;
 xmax,hmax,ymax:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
FName: string; // файл
f: textfile; // имя файла
buf:string;  // буфер для чтения из файла
begin
if OpenDialog1.Execute then
 begin
  FName := OpenDialog1.FileName;
  Assignfile(f,fname); //{$!-}
  reset(f); // открыть для чтения {$I+}
  if IOResult <> 0 then
   begin
    messagedlg('Ошибка доступа к файлу '+ fname,mtError,[mbok],0);
    exit;
    end;
    while not EOF(f) do begin
    readln(f,buf);
    listbox1.Items.Add(buf);
    end;
 end;
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
listbox1.Clear;
listbox2.Clear;     //очистить поля

end;

procedure TForm1.Button2Click(Sender: TObject);
var
f: textfile; // имя файла
j,i,n,g:integer;
x1,y1,h1,x2,y2,h2:integer;
mx,my,mh,zx,zy,zh,wx,wy,wh:integer;
begin
read(f,n);      ------  выдает ошибку на этой строке.
setlength(mas,n,6);
for i:=1 to n do begin
 for j:=1 to 6 do begin
  read(f,mas[i,j]);
      end;
 end;
 read(f,g);

 for i:=1 to n do begin
 x1:=mas[i,0];
 y1:=mas[i,1];
 h1:=mas[i,2];
 x2:=mas[i,3];
 y2:=mas[i,4];
 h2:=mas[i,5];

 mx:=x1-x2;
 my:=y1-y2;
 mh:=h1-h2;

 zx:=mx*g;
 zy:=my*g;
 zh:=mh*g;

 wx:=x1+zx;
 wy:=y1+zy;
 wh:=h1+zh;

 if wx<xmax then
 listbox2.Items.add(inttostr(wx))
 else
 showmessage('цель потеряна');
 if wy<ymax then
 listbox2.Items.add(inttostr(wy))
 else
 showmessage('цель потеряна');
 if wh<hmax then
 listbox2.Items.add(inttostr(wh))
 else
 showmessage('цель потеряна');
 end;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
xmax:=1700;
hmax:=250;
ymax:=1700;
end;

end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.11.2012 в 09:42.
coolpack вне форума Ответить с цитированием
Старый 29.11.2012, 08:52   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Во-первых, оформляем код по правилам, кнопочка # при написании/редактировании поста.
Во-вторых, идём и читаем учебник по теме файлы.
В-третьих, учимся писать в чём проблема, а не "ничиво ни рботаит". Ведь кристально же ясно, что у Вас не при _запуске_ ошибка возникает, а именно при нажатии на кнопку3.

Далее, если Вам это писал кто-то, то просите его объяснять. Потому как мне тяжело верится, что человек в одном месте написал Assignfile(f,fname); и даже {$I+} вспомнил, а рядышком и не хочет применять. Хотя смотря на {$!-} скорее приходит на ум вывод про сканирование с учебника... Печально конечно, даже набрать код руками тяжело для нынешних учеников, как раз бы отложилось, что AssignFile нужен. Если писали сами, то ознакомьтесь с понятиями "отладка/трассировка" и их применением в дельфи.

Решение Вашей проблемы, в принципе, может быть несколькими путями достигнуто.
Можно сделать файл глобальной переменной, можно заново ассайнить, читать и закрывать (закрытия Вы вообще не делаете, что тоже плохо, ибо файл держится программой) его в каждой процедуре. Но самым нормальным решением будет отдельная процедура , что читает из файла в массив данные один раз и потом все остальные процедуры общаются только с массивом.
phomm вне форума Ответить с цитированием
Старый 29.11.2012, 20:21   #3
coolpack
 
Регистрация: 28.11.2012
Сообщений: 5
По умолчанию

Прошу прощения за ошибки, которые я сделал, спасибо за ответ.
Ошибка возникает при нажатии на кнопу1. Никак не могу понять как убрать эту ошибку.
Попробовал исправить ошибку, код программы получился таким:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, Buttons;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    XPManifest1: TXPManifest;
    BitBtn1: TBitBtn;
    ListBox1: TListBox;
    Button2: TButton;
    ListBox2: TListBox;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 mas: array of array of integer;
 xmax,hmax,ymax:integer;
 f: textfile; // èìÿ ôàéëà
j,i,n,g:integer;
x1,y1,h1,x2,y2,h2:integer;
mx,my,mh,zx,zy,zh,wx,wy,wh:integer;
FName: string; // ôàéë
buf:string;  // áóôåð äëÿ ÷òåíèÿ èç ôàéëà
implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
xmax:=1700;
hmax:=250;
ymax:=1700;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
 begin
  FName := OpenDialog1.FileName;
  Assignfile(f,fname); 
 {$I-}
  reset(f); 
 {$I+}
  if IOResult <> 0 then
   begin
    messagedlg('Îøèáêà äîñòóïà ê ôàéëó '+ fname,mtError,[mbok],0);
    exit;
    end;
    read(f,n);
setlength(mas,n,6);
for i:=1 to n do begin
 for j:=1 to 6 do begin
  read(f,mas[i,j]);
   read(f,g);
 end;
 end;
 end;
 closefile(f);
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
listbox1.Clear;
listbox2.Clear;     
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 for i:=1 to n do begin
 x1:=mas[i,0];
 y1:=mas[i,1];
 h1:=mas[i,2];
 x2:=mas[i,3];
 y2:=mas[i,4];
 h2:=mas[i,5];

 mx:=x1-x2;
 my:=y1-y2;
 mh:=h1-h2;

 zx:=mx*g;
 zy:=my*g;
 zh:=mh*g;

 wx:=x1+zx;
 wy:=y1+zy;
 wh:=h1+zh;

 if wx<xmax then
 listbox2.Items.add(inttostr(wx))
 else
 showmessage('öåëü ïîòåðÿíà');
 if wy<ymax then
 listbox2.Items.add(inttostr(wy))
 else
 showmessage('öåëü ïîòåðÿíà');
 if wh<hmax then
 listbox2.Items.add(inttostr(wh))
 else
 showmessage('öåëü ïîòåðÿíà');
 end;
 end;

end.

Последний раз редактировалось coolpack; 29.11.2012 в 23:05.
coolpack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла (Си!) kokoshasha Помощь студентам 2 12.07.2012 21:41
Чтение из XML файла средствами делфи Anatoliy19 Помощь студентам 2 19.11.2011 11:45
чтение из файла Niksan Общие вопросы C/C++ 3 02.05.2011 18:14
Чтение из файла! balamut Общие вопросы C/C++ 8 17.05.2010 02:39
Чтение из файла. Си. MAKEDON Помощь студентам 1 17.08.2009 16:42