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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2011, 20:00   #1
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию ###I/O 32/103/123

Объясните пожалуйста, в чем ошибка? Что не делаю, все время выдает ошибку... то I/O 32, то I/O 103, то I/O 123...((

Код:
    repeat
    {$I-}
    Reset(FileOfData);
//    closefile(FileOfData);
    {$I+}
    if IOResult<>0
      then
        begin
        assignfile(FileOfData, FileNameIs);
        rewrite(FileOfData);
//        closefile(FileOfData);
        writeln(FileOfData, 'Ðåçóëüòàò òåñòèðîâàíèÿ');
        writeln(FileOfData, 'Òåñòèðîâàíèå ïðîøåë(à) ñòóäåíò(êà) ãðóïïû ¹', Form1.Gp.Text);
        writeln(FileOfData, Form1.NameSN.Text:Length(Form1.NameSN.Text), 
              Form1.NameN.Text:(Length(Form1.NameN.Text)+1), Form1.NameTN.Text:(Length(Form1.NameTN.Text)+1));
        writeln(FileOfData);
        closefile(FileOfData);
        IORE:=False;
        end
      else
        begin
        num:=num+1;
        case num of
        0..9: LLL:='00'+IntToStr(n);
        10..99: LLL:='0'+IntToStr(n);
        100..255: LLL:=IntToStr(n);
        else ShowMessage('Ïðåâûøåíî äîïóñòèìîå êîëëè÷åñòâî îäíîèìåííûõ ôàéëîâ');
        end;
        if num=0 then
          for count:=1 to Length(FileNameIs)-4 do
            F:=F+FileNameIs[count]
          else
          for count:=1 to Length(FileNameIs)-7 do
            F:=F+FileNameIs[count];
        FileNameIs:=F+IntToStr(num)+'.txt';
        assignfile(FileOfData, FileNameIs);
        IORE:=True;
        end;
    until IORE=False;
Ошибку выдает в
Код:
        rewrite(FileOfData);
//        closefile(FileOfData);
цель данной части программы состоит в том, чтобы при совпадении имен файла создавался ему подобный с номером из 3 цифр
Если лень что-то делать, заставь это делать машину ... =,

Последний раз редактировалось rpy3uH; 30.11.2011 в 21:08.
Katus вне форума Ответить с цитированием
Старый 30.11.2011, 20:20   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
FileOfData
кто такой? что там?
p51x вне форума Ответить с цитированием
Старый 30.11.2011, 20:26   #3
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию

Код:
FileOfData: Text;
FileNameIs: string;
Если лень что-то делать, заставь это делать машину ... =,
Katus вне форума Ответить с цитированием
Старый 30.11.2011, 21:07   #4
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию

FileOfData ассоциируется с FileNameIs на протяжении всей программы
Если лень что-то делать, заставь это делать машину ... =,
Katus вне форума Ответить с цитированием
Старый 30.11.2011, 21:56   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Учись делать нормальную обработку ошибок.

I/O error 32 = ERROR_SHARING_VIOLATION - файл уже кем-то открыт (возможно - тобою же)
I/O error 103 = "File not open" - возбуждается CloseFile, Read Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead или BlockWrite, если файл не открыт.
I/O error 123 = ERROR_INVALID_NAME - неверно указано имя файла (возможная причина - не был вызван AssignFile).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.11.2011, 22:06   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Далее, по коду: написан бред.

1. Где AssignFile до начала цикла? У тебя первым действием идёт Reset на неинициализированную переменную. Неудивительно, что его вызов даст что угодно - ведь ты суёшь Reset мусор.

Далее, если вызов (случайно) завершился успешно (т.е. IOResult = 0), то ты:

2. Изменяешь FileNameIs и заново вызываешь AssignFile - на уже открытый файл! (ветка else).

3. Если же вызов Reset завершился ошибкой (что более вероятно, ведь ты суёшь ему ерунду), то ты просто открываешь файл и начинаешь в него писать данные, как если бы всё было нормально O_o
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 30.11.2011 в 22:14.
GunSmoker вне форума Ответить с цитированием
Старый 30.11.2011, 22:22   #7
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию

...вот тогда весь код моей программы... мб так будет понятней...*scratch*
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Queshion: TLabel;
    IfYes: TLabel;
    IfNo: TLabel;
    InProcents: TLabel;
    Variant1: TCheckBox;
    Variant2: TCheckBox;
    Variant3: TCheckBox;
    Variant4: TCheckBox;
    ImEnd: TBitBtn;
    Reger: TButton;
    NameN: TEdit;
    NameSN: TEdit;
    NameTN: TEdit;
    Gp: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure ImEndClick(Sender: TObject);
    procedure RegerClick(Sender: TObject);
    procedure NameNKeyPress(Sender: TObject; var Key: Char);
    procedure GpKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TTester = record
    FirstName: String;
    SecondName: String;
    ThirdName: String;
    Group: integer;
    end;

var
  Form1: TForm1;
  n: byte; // Ìàêñ êîë-âî âîïðîñîâ
  i: byte; // Ñ÷åò÷èê âîïðîñà
  vrnt: byte; // Âàðèàíò
  Tester: TTester;
  FileNameIs: string;
  FileOfData: text;
  SSName, STName, SName: string;
  Quest: array [1..100,0..100,0..4] of string;

implementation

{$R *.dfm}

function ReWriter(SText: string):string;
var
  i: byte;
  S: string;
begin
S:='';
Если лень что-то делать, заставь это делать машину ... =,
Katus вне форума Ответить с цитированием
Старый 30.11.2011, 22:23   #8
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию

Код:
for i:=1 to length(SText) do
  begin
  case SText[i] of
  'À','à': S:=S+'A';
  'Á','á': S:=S+'B';
  'Â','â': S:=S+'V';
  'Ã','ã': S:=S+'G';
  'Ä','ä': S:=S+'D';
  'Å','å': S:=S+'E';
  '¨','¸': S:=S+'YO';
  'Æ','æ': S:=S+'ZH';
  'Ç','ç': S:=S+'Z';
  'È','è': S:=S+'I';
  'É','é': S:=S+'J';
  'Ê','ê': S:=S+'K';
  'Ë','ë': S:=S+'L';
  'Ì','ì': S:=S+'M';
  'Í','í': S:=S+'N';
  'Î','î': S:=S+'O';
  'Ï','ï': S:=S+'P';
  'Ð','ð': S:=S+'R';
  'Ñ','ñ': S:=S+'S';
  'Ò','ò': S:=S+'T';
  'Ó','ó': S:=S+'U';
  'Ô','ô': S:=S+'F';
  'Õ','õ': S:=S+'H';
  'Ö','ö': S:=S+'C';
  '×','÷': S:=S+'CH';
  'Ø','ø': S:=S+'SH';
  'Ù','ù': S:=S+'SCH';
  'Ú','ú': S:=S+'j';
  'Û','û': S:=S+'Y';
  'Ü','ü': S:=S+'y';
  'Ý','ý': S:=S+'YE';
  'Þ','þ': S:=S+'YU';
  'ß','ÿ': S:=S+'YA';
  end;
  end;
ReWriter:=S;
end;

procedure MainWriter(n: cardinal);
begin
with Form1 do
  begin
    Queshion.Caption:='Âîïðîñ:'+#13+Quest[n, vrnt, 0];
    Variant1.Caption:='1) '+ Quest[n, vrnt, 1];
    Variant2.Caption:='2) '+ Quest[n, vrnt, 2];
    Variant3.Caption:='3) '+ Quest[n, vrnt, 3];
    Variant4.Caption:='4) '+ Quest[n, vrnt, 4];
    Variant1.Checked:=False;
    Variant2.Checked:=False;
    Variant3.Checked:=False;
    Variant4.Checked:=False;
  end;
end;

procedure TForm1.ImEndClick(Sender: TObject);
begin
if (Variant1.Checked=False)and(Variant2.Checked=False)and
   (Variant3.Checked=False)and(Variant4.Checked=False)
  then
    ShowMessage('Âû íå âûáðàëè íè îäíîãî âàðèàíòà îòâåòà!')
  else
    begin
    n:=n+1;
    Form1.Queshion.Caption:='Âîïðîñ:'+#13+Quest[n, vrnt, 0];
    Form1.Variant1.Caption:='1) '+ Quest[n, vrnt, 1];
    Form1.Variant2.Caption:='2) '+ Quest[n, vrnt, 2];
    Form1.Variant3.Caption:='3) '+ Quest[n, vrnt, 3];
    Form1.Variant4.Caption:='4) '+ Quest[n, vrnt, 4];
    Form1.Variant1.Checked:=False;
    Form1.Variant2.Checked:=False;
    Form1.Variant3.Checked:=False;
    Form1.Variant4.Checked:=False;
    end;
end;

procedure TForm1.RegerClick(Sender: TObject);
var
  num: byte;
  count: byte;
  f: string;
  IORE: boolean;
  LLL: string[3];
begin
if (NameN.Text='')or(NameSN.Text='')or(NameTN.Text='')or(Gp.Text='')
  then
    ShowMessage('Çàïîëíèòå âñå ïîëÿ')
  else
    begin
    Label1.Visible:=False;
    Label2.Visible:=False;
    Label3.Visible:=False;
    Label4.Visible:=False;
    Label5.Visible:=False;
    NameN.Visible:=False;
    NameSN.Visible:=False;
    NameTN.Visible:=False;
    Gp.Visible:=False;
    Tester.FirstName:=NameN.Text;
    Tester.SecondName:=NameSN.Text;
    Tester.ThirdName:=NameTN.Text;
    Tester.Group:=StrToInt(Gp.Text);
    ImEnd.Visible:=True;
    Queshion.Visible:=True;
    Reger.Visible:=False;
    Variant1.Visible:=True;
    Variant2.Visible:=True;
    Variant3.Visible:=True;
    Variant4.Visible:=True;
    Form1.Width:=837;
    Form1.Height:=591;
    SSName:=ReWriter(NameSN.Text);
    SName:=ReWriter(NameN.Text);
    STName:=ReWriter(NameTN.Text);
    FileNameIs:='C:\TEST\G'+Gp.Text+'V'+IntToStr(vrnt)+'STF'+SSName+'STN'+SName+'STO'+STName+'.txt';
    assignfile(FileOfData, FileNameIs);
    num:=0;
    while IOResult=0 do
    begin
    {$I-}
    Reset(FileOfData);
    closefile(FileOfData);
    {$I+}
    if IOResult<>0
      then
        begin
        {$I-}
        assignfile(FileOfData, FileNameIs);
        rewrite(FileOfData);
        append(FileOfData);
        writeln(FileOfData, 'Ðåçóëüòàò òåñòèðîâàíèÿ');
        writeln(FileOfData, 'Òåñòèðîâàíèå ïðîøåë(à) ñòóäåíò(êà) ãðóïïû ¹', Form1.Gp.Text);
        writeln(FileOfData, Form1.NameSN.Text:Length(Form1.NameSN.Text), Form1.NameN.Text:(Length(Form1.NameN.Text)+1), Form1.NameTN.Text:(Length(Form1.NameTN.Text)+1));
        writeln(FileOfData);
        closefile(FileOfData);
        IORE:=False;
        {$I+}
        end
      else
        begin
        num:=num+1;
        case num of
        0..9: LLL:='00'+IntToStr(n);
        10..99: LLL:='0'+IntToStr(n);
        100..255: LLL:=IntToStr(n);
        else ShowMessage('Ïðåâûøåíî äîïóñòèìîå êîëëè÷åñòâî îäíîèìåííûõ ôàéëîâ');
        end;
        if num=1 then
          for count:=1 to Length(FileNameIs)-4 do
            F:=F+FileNameIs[count]
          else
          for count:=1 to Length(FileNameIs)-7 do
            F:=F+FileNameIs[count];
        FileNameIs:=F+LLL+'.txt';
        assignfile(FileOfData, FileNameIs);
        IORE:=True;
        end;
    end;
    n:=1;
    MainWriter(n);
    end;
end;

procedure TForm1.NameNKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'à'..'ÿ','À'..'ß': ;
#8: ;
else Key:=#0;
end;
end;

procedure TForm1.GpKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ;
#8: ;
else Key:=#0;
end;
end;

end.
Если лень что-то делать, заставь это делать машину ... =,
Katus вне форума Ответить с цитированием
Старый 30.11.2011, 22:50   #9
Katus
Форумчанин
 
Регистрация: 30.11.2011
Сообщений: 161
По умолчанию

Все, спасибо. Я нашел свои ошибки.

Во-первых я использовал "левую" переменную. Вместо NUM подставил N. Получалось одно и то же имя.

Во-вторых не обнулил переменную F, в которой, собственно и заисывался новый адресс... В результате получалось 'C:\<address 1>C:\<address 2>'
Если лень что-то делать, заставь это делать машину ... =,
Katus вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access Violation и I/O error 103 без видимых причин whatever Помощь студентам 2 10.12.2010 08:50
Почему через раз вылазить ошибка I/O 103? Marsel737 Общие вопросы Delphi 9 23.10.2010 00:34