Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Ошибка создания файла


Автор: neic 17.12.2009, 12:03
Ругается на то, что файл отсутствует:

Код

Append(f);


Файла реально нет, но(!), на следующей строке указано, что нужно делать:
Код

if IOResult<> 0 then
    Rewrite(f); // если файла нет и нужно его создать или перезаписать.


Полностью:
Код

unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
    f: TextFile; // файл — база данных
      fname:string;
begin
    fname:='c:\pogoda1.txt';
    AssignFile(f, fname);
    Append(f);
    if IOResult<> 0 then
    Rewrite(f); // если файла нет и нужно его создать или перезаписать.
    writeln(f, edit1.text);
    writeln(f, edit2.text);
    closefile(f);

    form1.StringGrid1.Cells[0,0]:='1';
end;

end.


Что ему (делфи) не хватает???

Автор: Akella 17.12.2009, 12:09
Код

AssignFile(f, fname);
Reset(f);

Автор: neic 17.12.2009, 12:20
Выдаёт это

Автор: neic 17.12.2009, 12:22
Написал так:
Код

    fname:='c:\pogoda1.txt';
    AssignFile(f, fname);
    Reset(f);
    if IOResult<> 0 then
      begin
      Rewrite(f); // если файла нет и нужно его создать или перезаписать.
      end
    else
      begin
      Append(f);
    end;
    writeln(f, edit1.text);
    writeln(f, edit2.text);
    closefile(f);

Автор: Данкинг 17.12.2009, 12:26
Код

AssignFile(f, fname);
if not fileexists(fname) then rewrite(fname) else append (fname);


Автор: Snowy 17.12.2009, 12:27
2010 год на носу, а люди всё ещё пользуются AssignFile...
"В то время, когда космические корабли бороздят просторы большого театра..." ©

Автор: neic 17.12.2009, 12:48
Snowy
А что ты предлагаешь? В 7 делфи.

Добавлено через 2 минуты и 22 секунды
Данкинг
спасибо.

Только подредактировать пришлось:
Код

if not fileexists(fname) then rewrite(f) else append (f);

Автор: Данкинг 17.12.2009, 12:51
Дык, а что такого: AssignFile и мне нравится. smile Наглядно и понятно.

Автор: Snowy 17.12.2009, 12:57
Да какая разница, какая дельфи.
TStream (любой), TStringList...
Зачем пользоваться методами, оставшимися в наследство от DOS?

Автор: Данкинг 17.12.2009, 13:45
Ну так а если надо считать текстовый файл в миллион строк - сколько времени он будет грузиться в TStringList ?

Автор: Snowy 17.12.2009, 13:53
Судя по коду, там до миллиона лет 200 активного пользования.
А для больших размеров - стримы. И форматы посеръёзнее текстовых.

Автор: Akella 17.12.2009, 17:14
Snowy, а если нужно загрузить 100 строк текстового файла. А файл размером 5-10 мегабайт.

Автор: Snowy 17.12.2009, 17:58
Ага, особенно, если это последние 5 строк...
Что за попытки выискать мифическую ситуацию?
Мне подобные что-то никогда не попадаются.

Что касается первоначального вопроса - ответ есть в справке по IOResult ( {$I-} )

Автор: Akella 17.12.2009, 22:59
У меня есть такая ситуация. Например, когда пользователю нужно показать кусок файла, чтобы он выбрал, нужно ли выполнять Dos->Win или нет для дальнейшей обработки текста.

Автор: Snowy 18.12.2009, 11:24
Ну так тем более - в стрим загружаешь 200 символов и показываешь.
Небольшой - это в символах.
В строках может быть совсем не небольшим.

Вобщем флейм уже пошёл...

Автор: SlaUr 18.12.2009, 15:16
Код

procedure TForm3.Button1Click(Sender: TObject);
var
    f: TextFile; // файл — база данных
      fname:string;
begin
    fname:='c:\pogoda1.txt';
    AssignFile(f, fname);
    Append(f);
    if IOResult<> 0 then
    Rewrite(f); // если файла нет и нужно его создать или перезаписать.
    writeln(f, edit1.text);
    writeln(f, edit2.text);
    closefile(f);

    form1.StringGrid1.Cells[0,0]:='1';
end;

 А кто будет ставить {$I-}  {$I+}
Вот что должно быть
Код

{$I-}  Append(f);{$I+}
    if IOResult<> 0 then
{$I-}    Rewrite(f);{$I+}
    if IOResult<> 0 then showmessage('Error');


Ничего не имею против этих якобы устаревших комманд они работают и иногда их использовать лучше.Если например использовать tsringlist то в данном конкретном случае сначала бы пришлось считывать файл (если он есть) потом добавлять строки а потом только записывать.

Автор: profesiachuvak 19.12.2009, 15:07
Цитата(SlaUr @  18.12.2009,  15:16 Найти цитируемый пост)
 А кто будет ставить {$I-}  {$I+}


SlaUr,  что это значит?, Вы хотите сказать что без этого работать не будет?

Автор: SlaUr 21.12.2009, 08:18
В этом коде возникает ошибка и ioresult=0

Код

procedure TForm1.Button1Click(Sender: TObject);

begin
AssignFile(F1,'c:\1.tmp');
try
Append(F1);
except
Showmessage(inttostr(ioresult));
end;
end;



В этом коде ошибки не возникает и ioresult=2
Код

procedure TForm1.Button1Click(Sender: TObject);

begin
AssignFile(F1,'c:\1.tmp');
{$I-}Append(F1){$I+};
Showmessage(inttostr(ioresult));
end;


У neic программа вываливалась по ошибке поэтому никакого файла не создавалось

Автор: profesiachuvak 21.12.2009, 14:51
SlaUr, Ситуация ясна, вот только эта запись не понятна для меня :

Код

{$I-}Append(F1){$I+};


Как понимать это штуку: {$I-}; ? smile 

Автор: Snowy 21.12.2009, 15:05
А справку посмотреть?
Директива, которая как раз и вырубает вываливание с ошибкой.

Автор: profesiachuvak 21.12.2009, 15:22
Цитата(Snowy @  21.12.2009,  15:05 Найти цитируемый пост)
Директива, которая как раз и вырубает вываливание с ошибкой. 


Да я так и сделал, не успел отписаться.    
{$I-} - отключает генерацию исключений.

Автор: Демо 21.12.2009, 16:12
Я бы не рекомендовал использовать {$I-} без глубокого понимания этого механизма.
Отключение проверки ошибок может повлечь за собой труднонаходимые ошибки и глюки.
Лучше использовать обработку исключений.

Автор: Snowy 21.12.2009, 16:16
Без глубокого понимания можно использовать готовый пример.
Например из справки Delphi (TurboPascal)
В ТрупоПаскале по другому и никак было.
А это наследство покойного...

Автор: Данкинг 21.12.2009, 16:44
Цитата(profesiachuvak @  21.12.2009,  14:51 Найти цитируемый пост)
Как понимать это штуку: {$I-}; ?

Видимо, ты в Паскале ничего не писал? smile 

Автор: profesiachuvak 21.12.2009, 16:56
Цитата(Данкинг @  21.12.2009,  16:44 Найти цитируемый пост)

Видимо, ты в Паскале ничего не писал?


В лет 13 в Pascal 5 а потом Turbo что-то писал, но видимо не сталкивался с обработкой исключений. А почему там невозможно было без {$I-} ???
Мне аж интересно стало.

Автор: Данкинг 21.12.2009, 20:32
Цитата(profesiachuvak @  21.12.2009,  16:56 Найти цитируемый пост)
А почему там невозможно было без {$I-} ???

Вообще я смутно помню, что там в ТП было.  smile Но там же обработчика ошибок не было (try...catch), вот и приходилось отключать проверку ошибок.

Автор: bems 24.12.2009, 18:11
Там не было не только обработки исключений, но и самих исключений. А проверка ошибок как раз и делалась через IOResult. И директивы компилятора соответственно там тоже не было.

Автор: Snowy 24.12.2009, 18:28
Цитата(bems @  24.12.2009,  18:11 Найти цитируемый пост)
И директивы компилятора соответственно там тоже не было.

Из справки TP7:
Код
{
 Замечания:
Чтобы контролировать ошибки ввода/вывода с помощью функции IOResult, опция
проверки ввода/вывода должен быть выключена ({$I-}). Если происходит ошибка
ввода/вывода, и проверка ввода/вывода выключена, то все последующие операции
ввода/вывода игнорируются, пока не будет сделано обращение к функции
IOResult, при котором очищается внутренний флаг ошибки.
}

Var F : File Of Byte;

Begin
 { Получаем имя файла из командной строки }
 Assign(F, ParamStr(1));
 {$I-}
 Reset(F);
 {$I+}
 If IOResult=0 Then WriteLn('Размер файла: ', FileSize(F), ' байт.'))
               Else WriteLn('Файл не найден.');
End.

Автор: bems 24.12.2009, 18:44
Убедил. Но исключений-то не было smile

Автор: Snowy 25.12.2009, 12:48
Так я про то и говорю - обработчиков исключений не было, поэтому использовались директивы компилятора.  smile 
Теперь обработчики есть, но старьё с собой до сих пор тянем.  smile 
Я к тому и клоню, что это всё устарело ещё в прошлом тысячелетии, а у нас 2010 год на носу уже.  smile 
С наступающим  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)