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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2009, 20:18   #1
lexab18
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 14
По умолчанию ошибка I/O 104 (Delphi)

Здраствуйте!
В общем нужно реализовать игру города.(все наверное знают как в неё играть), где для игры компьютер использует собственную базу в виде текстового файла примерно из 25 городов.
Что же все-таки неверно написано у меня, постояно вылетает ошибка I/O 104, перепробывал в разных вариантах, но выскакивают другие ошбики I/O 6 или EAccessViolation ?

Код:
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var f:textfile;
    S:string;
    l:integer;
    g,i,m:string;
begin
    S:=Edit1.text;
    AssignFile(f,'Города.txt');
    {$I-}
  append(f);
  {$I+}
  if IOResult<> 0
  then rewrite(f);
  l:=length(s);
  if Key=13 then  writeln(f,S);
   while not eof(f) do begin
  reset(f);
  read(f,g);
  end;
  if s[l]=g[1] then label2.Caption:=g;
  closefile(f);
end;
lexab18 вне форума Ответить с цитированием
Старый 23.06.2009, 21:14   #2
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

1) Если файл открыт на запись (append), то на чтение (reset) его не открыть, нужно предварительно его закрыть (CloseFile).
2) Reset вынести за пределы цикла (ведь нам нужно открыть файл один раз!), иначе он будет бесконечным.
3) Условие
Код:
if s[l]=g[1] then label2.Caption:=g;
поместить внутрь цикла (наоборот - его нужно проверять при каждой итерации) и изменить его так:
Код:
if s[l] = g[1] then 
 begin
 label2.Caption := g;
 break; // нашли нужный город - выходим из цикла
 end;
Если помог - поднимите репутацию (весы слева).
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс

Последний раз редактировалось Олвин; 23.06.2009 в 21:16.
Олвин вне форума Ответить с цитированием
Старый 23.06.2009, 21:43   #3
lexab18
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 14
По умолчанию

хм, теперь вобще не запускается , пишет BREAK or CONTINUE outside of loop
lexab18 вне форума Ответить с цитированием
Старый 24.06.2009, 01:48   #4
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Весь код сюда!
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 24.06.2009, 13:07   #5
lexab18
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 14
По умолчанию

Код:
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var f:textfile;
    S:string;
    l:integer;
    g,i,m:string;
begin
    S:=Edit1.text;
    AssignFile(f,'Города.txt');
    {$I-}
  append(f);
  {$I+}
  if IOResult<> 0
  then rewrite(f);
  l:=length(s);
  if Key=13 then  writeln(f,S);
  closefile(f);
  reset(f);
   while not eof(f) do begin
  read(f,g);
  end;
  if s[l]=g[1] then
   begin
   label2.Caption:=g;
  break;
end;
end;
end.
lexab18 вне форума Ответить с цитированием
Старый 24.06.2009, 13:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
AssignFile(f,'Города.txt');
{$I-}
append(f);
{$I+}
if IOResult<> 0
then rewrite(f);
Не согласен. Замени на:
Код:
    
AssignFile(f,'Города.txt');
 if Fileexists('Города.txt') then  append(f) else rewrite(f);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2009, 13:55   #7
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Условие (в котором содержится break) находится вне цикла while, а должно быть внутри!
Правильно пишет "BREAK or CONTINUE outside of loop" - у нас ведь действительно break за пределами цикла! (для справки: break - это выход из цикла)
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс

Последний раз редактировалось Олвин; 24.06.2009 в 15:36.
Олвин вне форума Ответить с цитированием
Старый 24.06.2009, 16:35   #8
lexab18
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 14
По умолчанию

Не одно так другое, теперь выскакивает ошибка EAccessVialation

Код:
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var f:textfile;
    S:string;
    l:integer;
    g,i,m:string;
begin
    S:=Edit1.text;
   AssignFile(f,'Города.txt');
 if Fileexists('Города.txt') then  append(f) else rewrite(f);
  l:=length(s);
  if Key=13 then  writeln(f,S);
  closefile(f);
  reset(f);
  while not eof(f) do begin
  read(f,g);
  if s[l]=g[1] then
  begin
  label2.Caption:=g;
  break;
  end;
end;
end;
end.
lexab18 вне форума Ответить с цитированием
Старый 24.06.2009, 16:42   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
выскакивает ошибка EAccessVialation
На какой строке?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2009, 16:44   #10
lexab18
Пользователь
 
Регистрация: 08.06.2009
Сообщений: 14
По умолчанию

на
Код:
if s[l]=g[1] then
lexab18 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка - [Error] GraphUnit.pas(104): Types of actual and formal var parameters must be identical Ash Общие вопросы Delphi 8 30.10.2012 21:01
Ошибка Delphi Степа Верхозин Помощь студентам 2 31.05.2009 11:45
Ошибка I/O error 104 ptz2010 Общие вопросы Delphi 8 31.03.2009 20:45
Прошу помочь, на жестком диске вникуда ушли (!!!)104(!!!)Гб BloodDoc Компьютерное железо 18 05.06.2008 22:27
ошибка в Delphi 6 Ms-dos4 Софт 7 26.08.2007 14:09