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


Автор: Fir 10.3.2005, 18:19
При повторном объявлении и открытия для дозаписи или перезаписи
выводит error 32 , хотя, если открывать для чтения, то всё нормально.
Чё такое? (файл в предидущих процедурах был закрыт) smile smile smile

Автор: Alex 10.3.2005, 18:26
Ошибка в 17 строке.

Автор: The MASTER 10.3.2005, 18:44
Alex Ты что телепат? smile

Автор: Alex 10.3.2005, 18:48
The MASTER, нет. Просто товарищь Fir думает, что тут форум телепатов.

Автор: Fedor 10.3.2005, 18:50
Alex и прикинь, угадаешь smile

Автор: Poseidon 11.3.2005, 03:46
Я думаю Fir еще не понял, почему ему не отвечают! Fir, приведи пример кода! По-моему ошибка пустяковая, так сказать "описка где-нибудь". Так что если будет код, то ты сразу же получишь ответ в чем дело.

PS. хотя 17 строку можешь проверить. А вдруг действительно Alex угадал! smile

Автор: Bes 11.3.2005, 07:27
1) Не закрыл файл.
2) Не той командой открывает.

Автор: p0s0l 11.3.2005, 12:04
Еще один вариант: файл открыт еще какой-нибудь прогой...

Цитата(Alex @ 10.3.2005, 18:26)
Ошибка в 17 строке.
По смыслу надо говорить 13-ая строка... Всё-таки 13 - несчастливое число... Или 666...



Автор: Fir 11.3.2005, 19:43
ВОТ КОД!!! ТЕЛЕПАт - это оскарбление, я инопланетянин. Можно и помоч, мозов не хватает!!
Код

procedure TForm1.BitBtn4Click(Sender: TObject);
var
f:TextFile;
i:integer;
begin
Assignfile(f, fname);
{$I-}
Append(f);
{$I+}
if IOResult<>0 then REwrite(f);
FilePos(f);
writeln(f, #13);
writeln(f, ('###_'+edit1.Text));
for i:=0 to Memo3.Lines.Count do
 begin
  writeln(f, (Memo3.Lines[i]));
 end;
Closefile(f);
end;

Автор: z-END 11.3.2005, 19:49
ошибок пруд-пруди и конструкция устаревшая лучше использовать TFileStream
делай так:
Код

AssignFile (F, FName);
if FileExists (FName)  then Append (F) else Rewrite (F);
Writeln (F);
For i := 0 to Memo3.Lines.Count - 1 do Writeln(F,Memo3.Lines[i]);
CloseFile (F);



Автор: Fir 11.3.2005, 20:28
За код спасибо, но канает!!!!!!!!!!!!!!!!!
Ошибка времени на строчке
if FileExists (FName) then Append (F) else Rewrite (F);
или как было
Append (F) {Rewrite (F)}
Причём иногда работает, добавляет в файл, а иногда нет!!!!
smile smile smile smile smile smile smile smile smile smile
Добавлено @ 20:29
Пардон за небольшую тупость. Инет ограничен очень сильно smile

Автор: Poseidon 12.3.2005, 04:48
Цитата
Причём иногда работает, добавляет в файл, а иногда нет!!!!
Может быть действительно ты открываешь этот файл в какой-то другой процедуре (или функции). Просмотри весь код. Может где еще встречается открытие этого файла. А то ведь что бы ошибка времени, да еще и через раз! Скорее всего не сакрыл файл где-то.
А вообще, на сколько я вижу, ты сохраняешь весь текст в Мемо в файл. Так почему бы не воспользоваться Memo1.Lines.SaveToFile?
Я конечно вижу, что если файл есть, то нужно его не перезаписать, а добавить. Но ведь и это решаемо без прямой записи в файл.



p0s0l
Цитата
По смыслу надо говорить 13-ая строка... Всё-таки 13 - несчастливое число... Или 666...
На сколько я помню, в резделе Форум программистов -> Разделы помощи -> Раздел помощи, в словаре терминов сказано следующее
Цитата
Ошибка в 17й строке - Ну, нет тут телепатов, нет! Нужен пример кода с которым проблемы, иначе догадаться что вы там делаете невозможно!
Так что...

Автор: z-END 12.3.2005, 09:54
Fir давай сделаем так:
Код

begin
var 
S: TStringList;
begin
S := TStringList.Create;
try
 If FileExists (FName) then S.LoadFromFile (FName);
  S.Add ('###'+Edit1.Text);
  S.AddStrings (Memo1.Lines);
  S.SaveToFile (FName);
finally
 FreeAndNil (S);
end;


ЗЫ: ты скажи есть ли еще какие нибудь процедуры или процессы которые работают с данным файлом?!
ЗЫЫ: этот код случайно не в таймере висит?!

Автор: Poseidon 12.3.2005, 20:14
z-END, интересный способ. Это как раз то, что я предлагал выше, использовать SaveToFile. Конечно, код не совсем закончен, т.к. если
Код
not FileExists (FName)
то нужно создать файл и записать в него. Но это уже мелочи. smile

Автор: Vit 13.3.2005, 02:42
Код

procedure TForm1.BitBtn4Click(Sender: TObject);
var
  f:TextFile;
  i:integer;
begin
  Assignfile(f, fname);
  try
    if FileExists(fname) then Append(f) else Rewrite(f);
  except
    on e:exception do 
      begin
         Showmessage('File could not be opened. Error:'+e.message);
         exit;
      end;
  end;
  writeln(f, '');
  writeln(f, ('###_'+edit1.Text));
  for i:=0 to Memo3.Lines.Count-1 do
    writeln(f, (Memo3.Lines[i]));
  Closefile(f);
end;


Примечания к коду

1) Файл надо проверять на наличие а не дожидаться ошибок
2) Применение FilePos(f); для текстовых файлов бессмыслено
3) writeln(f, #13); - вы реально добавите #13#10#13
4) for i:=0 to Memo3.Lines.Count do - тут вас выбьет по range error или запортите память и выбьет где-то ещё, очень нехорошая ошибка, постарайтесь её никогда не делать, её крайне трудно потом отлавливать, посмотрите на мой код

Автор: SoWa 13.3.2005, 17:09
Цитата
var
f:TextFile;

Может не надо TextFile а надо просто Text ???
Я его всю свою олимпиадную жизнь использую, и работает...

Автор: Fir 13.3.2005, 18:55
После следующей функции файл остаётся открыт или ещё чё-то!! smile smile

Код
procedure TForm1.ComboBox1Click(Sender: TObject);
var
f:Textfile;
s:string;
begin
Assignfile(f, fname);
Reset(f);
if ComboBox1.ItemIndex=0 then
 begin
 memo1.Lines.Clear;
   repeat
    begin
    readln(f, s);
    if Copy(s, 0, 4)<>'###_'
    then memo1.Lines.Add(s)
    else memo1.Lines.Add(#13);
    end;
  until (EOF(f)=True);
end;
//-------------------------------
repeat
 begin
  readln(f, s);
  if Copy(s, 0, length(s))=('###_'+ComboBox1.Text) then
   begin
    memo1.Lines.Clear;
    Memo1.Lines.Add('------'+comboBox1.Text+'------');
    s:='';
       repeat
         begin
          Memo1.Lines.Add(s);
          readln(f, s);
         end;
       until (EOF(f)=True) or (Copy(s, 0, 4)='###_');
    Exit;
   end;
 end;
until EOF(f)=true;
Closefile(f);
end;

smile smile

Автор: [EViL] 13.3.2005, 19:50
Тебе же умные люди подсказали юзать TFileStream или TStringList.
Вся эта чушь с textfile и text - фигня, каменный век.
Они оставлены ТОЛЬКО ДЛЯ СОВМЕСТИМОСТИ с Borland Pascal.

Автор: Vit 14.3.2005, 16:54
Код

procedure TForm1.ComboBox1Click(Sender: TObject);
var
f:Textfile;
s:string;
begin
Assignfile(f, fname);
Reset(f);
if ComboBox1.ItemIndex=0 then
 begin
 memo1.Lines.Clear;
   repeat //<-Vit: лучше использовать While на случай если файл пустой
    begin
    readln(f, s);
    if Copy(s, 0, 4)<>'###_'
    then memo1.Lines.Add(s)
    else memo1.Lines.Add(#13);
    end;
  until (EOF(f)=True);
end; 
//<-Vit: а где здесь закрытие файла? Ты дочитал его до конца и опять пытаешься читать?
// ну ды у тебя текущая позиция в конце файла!
//-------------------------------
repeat
 begin
  readln(f, s);
  if Copy(s, 0, length(s))=('###_'+ComboBox1.Text) then
   begin
    memo1.Lines.Clear;
    Memo1.Lines.Add('------'+comboBox1.Text+'------');
    s:='';
       repeat
         begin
          Memo1.Lines.Add(s);
          readln(f, s);
         end;
       until (EOF(f)=True) or (Copy(s, 0, 4)='###_');
    Exit;
   end;
 end;
until EOF(f)=true;
Closefile(f);
end;

Добавлено @ 16:55
Цитата(SoWa @ 13.3.2005, 08:09)
Может не надо TextFile а надо просто Text ???


нет, всё правильно...

Цитата
, 13.3.2005,  10:50]Тебе же умные люди подсказали юзать TFileStream или TStringList.
Вся эта чушь с textfile и text - фигня, каменный век.
Они оставлены ТОЛЬКО ДЛЯ СОВМЕСТИМОСТИ с Borland Pascal.


Тут мог бы поспорить... Но не буду офтопить... В любом случае эти функции работают совершенно нормально.

Автор: Fir 15.3.2005, 18:58
Спосибо! Всё ок! smile smile smile smile

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