Её явно закрыли, а вопросы остались.
Спасибо тем, кто помог. Сейчас буду сидеть разбиратся.
Ну а вот на счёт первой задачи как быть? У меня единственнйы вопрос, как там сделать замену числа? Решать её ненадо !!! Просто подскажите, как заменить в файле чётное число на его произведние, Т.е.
К примеру у нас в файле написано: 2, 13, 45, 56. Нам надо, чтоб там стало 4, 13, 45, 112. Вот как сделать, чтоб чётное число заменялось, без создание нового файла и писалось на том же месте.
СРазу говорю, число максимальное будет 15000. Чтоб не было лишних разговоров. Ну а если Я там был не прав, то извиняюсь. Хотя наврядли !
Дык, я ж исходник выложил, может тебя смущает немного асма, но основная идея должна быть понятна. В файле есть так называемый указатель позиции записи/чтения. Который после чтения числа увеличивается на длину прочитанных данных которое, по ходу, нужно изменить я уменьшаю на 2 байта, а после записываю удвоенное/утроенное число, и указатель снова становится на место...
всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту
такс
у к примеру :
Procedure ReadInt;Assembler;
asm
mov ah,3Fh
mov bx,Handle
mov cx,2
lea dx,W
int 21h
end;
нет
Она проще должна решатся....... Но всё равно спасибо, может довиду до ума.
щас третий период досмотрю и напишу
как и обещал:
program For_Forum;
uses Crt;
type
MyFile = File of Integer;
var
F: MyFile;
i: Integer;
Begin
ClrScr;
WriteLn('Исходное содержание файла:');
Assign(F, 'C:InFile.dat');
Rewrite(F);
for i := 1 to 19 do begin Write(F, i); Write(i:4); end;
WriteLn;
WriteLn('Конечное содержание файла:');
Seek(F, 0);
while not Eof(F) do begin
Read(F, i);
if i mod 2 = 0 then begin
Seek(F, FilePos(F) - 1);
i := i * 2; { так пишу потому что компилятор
сразу писать Write(F, 2 * i) не даёт и даже
приведение не помогает типа Write(F, Integer(2 * i)) ! }
Write(F, i);
end;
Write(i:4);
end;
Close(F);
Erase(F);
repeat until KeyPressed
End.
Спасибо Alex за задачу.
Если есть мыло или Аська то дай плиз, чтоб форум н забивал если буду вопросы.
Ты ж говорил, что все это реализуется через BlockRead/Write. Через типизированный я и сам мог сделать, а если попробовать через эти функции, то ничего не получится (ошибка №6). А все из-за чего, из-за кривого кода работы с FSB в паскале! Поэтому и сделал через дескрипторы. По асме книг нету, только в электр. виде (авторы в явном виде не задаются).
To Geroi: Фишка в том, что переменную W нужно не возводить в квадрат, а умножать на 2. Поэтому происходит такая фигня. Прога хоть файл то создает?
program For_Forum;
uses Crt;
var
F: File;
i: Byte;
Begin
ClrScr;
WriteLn('Исходное содержание файла:');
Assign(F, 'C:InFile.dat');
Rewrite(F, 1);
for i := 1 to 19 do begin BlockWrite(F, i, 1); Write(i:4); end;
WriteLn;
WriteLn('Конечное содержание файла:');
Seek(F, 0);
while not Eof(F) do begin
BlockRead(F, i, 1);
if i mod 2 = 0 then begin
Seek(F, FilePos(F) - 1);
i := i * 2;
BlockWrite(F, i, 1);
end;
Write(i:4);
end;
Close(F);
Erase(F);
repeat until KeyPressed
End.
Не работает нифига, я примерно так сначала и сделал, как и раньше, выдает мне ошибку №6 (это типа несуществующий дескриптор) ??? :o А с типизированным работает...
to GLuk
в каком месте ошибка происходит?
И что этот номер ошибки значит?
У меня всё работает...
Выдает ошибку после третьего обращения к BlockWrite, а ошибка эта значит, что ДОС передан неверный номер дескриптора... эта ошибка в принципе не может возникнуть, если конечно не затереть номер дескриптора в блоке описаловки файла открытого ТП.
И самое обидное:Потестил на другой машине - все идет :'(
Меня терзают смутные сомнения, может что с машиной не так :( :o