IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> В продолжение прошлой темы о Файлах
Geroi
сообщение 2.05.2003 16:17
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


Её явно закрыли, а вопросы остались.
Спасибо тем, кто помог. Сейчас буду сидеть разбиратся.
Ну а вот на счёт первой задачи как быть? У меня единственнйы вопрос, как там сделать замену числа? Решать её ненадо !!! Просто подскажите, как заменить в файле чётное число на его произведние, Т.е.
К примеру у нас в файле написано: 2, 13, 45, 56. Нам надо, чтоб там стало 4, 13, 45, 112. Вот как сделать, чтоб чётное число заменялось, без создание нового файла и писалось на том же месте.
СРазу говорю, число максимальное будет 15000. Чтоб не было лишних разговоров. Ну а если Я там был не прав, то извиняюсь. Хотя наврядли !
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 2.05.2003 17:26
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Дык, я ж исходник выложил, может тебя смущает немного асма, но основная идея должна быть понятна. В файле есть так называемый указатель позиции записи/чтения. Который после чтения числа увеличивается на длину прочитанных данных которое, по ходу, нужно изменить я уменьшаю на 2 байта, а после записываю удвоенное/утроенное число, и указатель снова становится на место... 1.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 2.05.2003 17:37
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Geroi
сообщение 2.05.2003 18:28
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


такс sad.gif
у к примеру :
Procedure ReadInt;Assembler; 
asm
  mov ah,3Fh
  mov bx,Handle
  mov cx,2
  lea dx,W
  int 21h
end;

расшифруй пожалуйста "asm, lea"
Alex сделать через "BlockWrite/BlockRead/Seek " это ты имеешь ввиду заменить там существующие функции на эту? Разъясни.
P.S. ну хрен с ним что Я ламер в Паскале.......... пока.... smile.gif Все там были
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 2.05.2003 18:59
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Цитата
всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту


Реализуй пожалуйста, после хоккея  ;)
В плане исходника...

To Geroi: lea dx,W - это значит загрузка относительного смещения переменной W в регистр dx (по англ. load effective address). В данном случае получается, что DS:DX указывает на переменную W, что используется (как эквивалент можно привести тип Pointer) в качестве исходных данных для записи, т.к. пишем тип Integer, то в CX помещаем 2.
Кстати, работает прога то?...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Geroi
сообщение 2.05.2003 19:22
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


нет sad.gif
Она проще должна решатся....... Но всё равно спасибо, может довиду до ума.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 2.05.2003 19:35
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


щас третий период досмотрю и напишу smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 2.05.2003 20:49
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


как и обещал:

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.


Без BlockRead/... но это без разницы - принцип там тот же - делал как по условию задачи от Нас требовали

to GLuk
У тебя по асме какая книжка?
to Geroi
"Сейчас буду сидеть разбиратся. "
Вот это уважаю!
вот слова написанные одной программистой
"Никакой Интернет со всеми его конференциями, статьями и примерами никогда не заменит программисту собственного опыта. Только то, что добыто (разобрано и понято) своими силами, запоминается надолго и приносит пользу.
Опыта надо набираться обязательно. Читайте help, ищите ответ в исходниках, экспериментируйте с проектом сколько душе угодно, но только обязательно сами... "

в них Истина!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Geroi
сообщение 3.05.2003 6:17
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


Спасибо Alex за задачу.
Если есть мыло или Аська то дай плиз, чтоб форум н забивал если буду вопросы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 3.05.2003 6:27
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Ты ж говорил, что все это реализуется через BlockRead/Write. Через типизированный я и сам мог сделать, а если попробовать через эти функции, то ничего не получится (ошибка №6). А все из-за чего, из-за кривого кода работы с FSB в паскале! Поэтому и сделал через дескрипторы. По асме книг нету, только в электр. виде (авторы в явном виде не задаются).

To Geroi: Фишка в том, что переменную W нужно не возводить в квадрат, а умножать на 2. Поэтому происходит такая фигня. Прога хоть файл то создает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 3.05.2003 6:58
Сообщение #11


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Цитата
Её явно закрыли, а вопросы остались.

Её закрыли из-за хамского поведения участников форума. Будет повторяться - темы будут закрываться!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 3.05.2003 10:24
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


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.


to GLuk
вот если так хотелось
никакой кривоты я тут не увидел
to Geroi
___ALex___@inbox.ru
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 3.05.2003 11:03
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Не работает нифига, я примерно так сначала и сделал, как и раньше, выдает мне ошибку №6 (это типа несуществующий дескриптор)  ??? :o А с типизированным работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 3.05.2003 11:10
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


to GLuk
в каком месте ошибка происходит?
И что этот номер ошибки значит?
У меня всё работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 3.05.2003 12:19
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Выдает ошибку после третьего обращения к BlockWrite, а ошибка эта значит, что ДОС передан неверный номер дескриптора... эта ошибка в принципе не может возникнуть, если конечно не затереть номер дескриптора в блоке описаловки файла открытого ТП.

И самое обидное:Потестил на другой машине - все идет  :'(

Меня терзают смутные сомнения, может что с машиной не так  :( :o
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 18:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"