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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2009, 09:17   #1
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию Работа с файлом

Всем привет. вообщем пишу прогу для определения IP адреса и сохранения его в текстовый файл. сделал если ip равен 192.168.1.2 чтоб прога ошидала 5 сек и пробовала получить новый ip не 192*****. она сохраняет при норм ip и так же при 192****. и когда ip равен 192**** она ждет но как тока подключаюсь к нету и ip меняется она его не может записать ругается на rewrite в процедуре zap_2 подскажите в чем косяк???


Код:
Код:
program Project3;
uses
  Windows, Winsock, SysUtils, Classes,
  Dialogs, ExtCtrls;




function LocalIP: string;
type
 TaPInAddr=array [0..10] of PInAddr;
 PaPInAddr=^TaPInAddr;
var
 phe:PHostEnt;
 pptr:PaPInAddr;
 Buffer:array [0..63] of char;
 i:Integer;
  f: textfile;
 GInitData:TWSADATA;
begin
 WSAStartup($101, GInitData);
 Result:='';
 GetHostName(Buffer, SizeOf(Buffer));
 phe:=GetHostByName(buffer);
 if phe=nil then Exit;
 pptr:=PaPInAddr(Phe^.h_addr_list);
 i:=0;
 while pptr^[i]<>nil do
  begin
   result:=StrPas(inet_ntoa(pptr^[i]^));
   Inc(i);
  end;
 WSACleanup;
end;
procedure zap_2;
var
f :textfile;
begin
AssignFile(f, 'ip.txt');
rewrite(f);
writeln(f, localip);
closefile(f);
end;
procedure sravn;
var
f :textfile;
ip : string;
 begin
Assign(f, 'ip.txt');
reset(f);
while not EOF(f) do
   begin
   readln(f, ip);
   end;       // прочитать строку из файла
if ip<>localip then
begin
  Assignfile(f,'ip.txt');
rewrite(f);
  writeln(f,localip);
  closefile(f)
end
else
closefile(f);
end;
procedure local;
var
y :textfile;
ip : string;
begin
AssignFile(y, 'ip.txt');
reset(y);
while not EOF(y) do
   begin
   readln(y, ip);
   end;
 while localip='192.168.1.2' do
 begin
sleep(5000);
sravn;
end;
closefile(y);
localip;
sravn;
 end;
begin
  zap_2;
  local;
  end.
D_E_N вне форума Ответить с цитированием
Старый 17.07.2009, 10:04   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Причина в том, что ты пытаешься открыть не закрытый файл.

Код:
program Project3;
uses
  Windows, Winsock, SysUtils, Classes,
  Dialogs, ExtCtrls;




function LocalIP: string;
type
 TaPInAddr=array [0..10] of PInAddr;
 PaPInAddr=^TaPInAddr;
var
 phe:PHostEnt;
 pptr:PaPInAddr;
 Buffer:array [0..63] of char;
 i:Integer;
  f: textfile;
 GInitData:TWSADATA;
begin
 WSAStartup($101, GInitData);
 Result:='';
 GetHostName(Buffer, SizeOf(Buffer));
 phe:=GetHostByName(buffer);
 if phe=nil then Exit;
 pptr:=PaPInAddr(Phe^.h_addr_list);
 i:=0;
 while pptr^[i]<>nil do
  begin
   result:=StrPas(inet_ntoa(pptr^[i]^));
   Inc(i);
  end;
 WSACleanup;
end;

procedure zap_2;
var
f :textfile;
begin
AssignFile(f, 'ip.txt');
rewrite(f);
writeln(f, localip);
closefile(f);
end;

procedure sravn;
var
f :textfile;
ip : string;
 begin
Assign(f, 'ip.txt');
reset(f);
while not EOF(f) do
   begin
   readln(f, ip);
   end;      
closefile(f); <-- добавить
if ip<>localip then
begin
  Assignfile(f,'ip.txt');
rewrite(f);
  writeln(f,localip);
  closefile(f)
end
else
//closefile(f); <-- убрать
end;

procedure local;
var
y :textfile;
ip : string;
begin
AssignFile(y, 'ip.txt');
reset(y);
while not EOF(y) do
   begin
   readln(y, ip);
   end;
closefile(y); <-- добавить
 while localip='192.168.1.2' do
 begin
sleep(5000);
sravn;
end;
//closefile(y); <-- убрать
localip;
sravn;
 end;

var
  a: String;
begin
  zap_2;
  local;
end.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 17.07.2009, 11:47   #3
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

спасибо. попробую.

теперь ругается на reset в процедуре sravn. assign я поменял на assignfille но ничего это не поменяло.

Последний раз редактировалось Stilet; 20.07.2009 в 10:41.
D_E_N вне форума Ответить с цитированием
Старый 17.07.2009, 12:05   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

У меня все работает.
Ты closefile(f); добавил? как в моем посте?

Намудрил ты с кодом конечно.
Вот тоже самое, но все просто и понятно:
Код:
program Project3;
uses
  Windows, Winsock, SysUtils, Classes,
  Dialogs, ExtCtrls;

procedure WriteStringToFile(const Str: String);
var
  f :TextFile;
begin
  try
    Assignfile(f,'ip.txt');
    rewrite(f);
    writeln(f,Str);
  finally
    closefile(f);
  end;
end;

function ReadStringFromFile: String;
var
  f :TextFile;
begin
  try
    Result := '';
    AssignFile(f, 'ip.txt');
    reset(f);
    readln(f, Result);
  finally
    closefile(f);
  end;
end;

function GetLocalIP: string;
type
 TaPInAddr=array [0..10] of PInAddr;
 PaPInAddr=^TaPInAddr;
var
 phe:PHostEnt;
 pptr:PaPInAddr;
 Buffer:array [0..63] of char;
 i:Integer;
 GInitData:TWSADATA;
begin
 WSAStartup($101, GInitData);
 Result:='';
 GetHostName(Buffer, SizeOf(Buffer));
 phe:=GetHostByName(buffer);

   if phe = nil then Exit;

 pptr:=PaPInAddr(Phe^.h_addr_list);
 i:=0;

 while pptr^[i]<>nil do begin
   result:=StrPas(inet_ntoa(pptr^[i]^));
   Inc(i);
 end;

 WSACleanup;
end;

procedure Local;
begin
  while GetLocalIP = '192.168.1.2' do
    sleep(5000);

  WriteStringToFile(GetLocalIP);
end;

begin
  WriteStringToFile(GetLocalIP);
  Local;
end.
P.S. Нет смысла каждый раз читать IP из файла.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Stilet; 20.07.2009 в 10:42.
Daramant вне форума Ответить с цитированием
Старый 17.07.2009, 13:22   #5
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

всё добавил. спасибо.

а как сделать чтоб все 192.*.*.* такие адреса отсеивал ну то есть ждал? ну и висел в процессах и через каждый промежуток времени сравнивал ip и если он изменился то перезаписать файл и если нет то нет.

Последний раз редактировалось Stilet; 20.07.2009 в 10:42.
D_E_N вне форума Ответить с цитированием
Старый 17.07.2009, 13:32   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Код:
procedure Local;
var
  CurIP: String;
begin
  CurIP := GetLocalIP;

  while Copy(CurIP, 1, Pos('.', CurIP)-1) = '192' do begin
    sleep(5000);
    CurIP := GetLocalIP;
  end;

  WriteStringToFile(GetLocalIP);
end;
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 17.07.2009, 14:03   #7
D_E_N
Форумчанин
 
Регистрация: 04.05.2009
Сообщений: 149
По умолчанию

спасибо огромное
D_E_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ работа с файлом. НедоВовик Помощь студентам 1 05.07.2009 18:22
Си++. работа с файлом milate Помощь студентам 0 08.06.2009 12:52
Работа с файлом в C Mishka Помощь студентам 2 22.07.2008 13:28
Работа с текстовым файлом GazimagomedovM Помощь студентам 12 17.07.2008 18:24
Работа с текстовым файлом Vasya Помощь студентам 28 24.01.2008 01:15