
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.152.207] |
![]() |
|
Сообщ.
#1
,
|
|
|
У меня имеется файл-записей. Я хочу в него дописать ещё запись. Append здесь отдыхает, так как файл не текстовый. Можно ли сделать seek(f,filesize(f)), что тем самым мы перейдем на конечный компонент? Или есть другие способы?
|
Сообщ.
#2
,
|
|
|
Так ты перейдешь на конец файла. Нельзя в принципе, потому что,
Цитата Rewrite creates a new external file with the name assigned to F. If an external file with the same name already exists, it is deleted and a new empty file is created in its place. If F is already open, it is first closed and then re-created. The current file position is set to the beginning of the empty file. |
Сообщ.
#3
,
|
|
|
Цитата Brain @ Можно ли сделать seek(f,filesize(f)), что тем самым мы перейдем на конечный компонент Можно ![]() Добавлено Хм, тормознул, низзя. |
Сообщ.
#4
,
|
|
|
Если файл обьявлен как типизированный то можно
Добавлено И это самый простой вариант -юсртыхэю Цитата Оззя @ Так ты перейдешь на конец файла. Так ему это и надо |
Сообщ.
#5
,
|
|
|
Если нетипизированный - можно сделать свои функции ввода/вывода через прерывания DOS. Это не долго.
|
Сообщ.
#6
,
|
|
|
Если он работает с записями - прямая дорога к типизированному файлу
|
Сообщ.
#7
,
|
|
|
Damirjano
Ему нужно добавить в существующий файл. Который будет удален (ReWrite так работает) и создан заново и в него будет записаны записи заново. Записали в файл 2 записи ![]() ![]() type Date = record D, M, Y: Integer; end; var F: File Of Date; aDate: Date; begin Assign(F, 'TEST.dat'); Rewrite(F); With aDate do begin d:=10; m:=2; y:=1999; end; Write(F, aDate); Write(F, aDate); Close(F); { Close file, save changes } Readln; end. Все ок, в файле 2 записи. Открыли существующий, пытаемся добавить в конец файла ![]() ![]() type Date = record D, M, Y: Integer; end; var F: File Of Date; aDate: Date; begin Assign(F, 'TEST.dat'); Rewrite(F); { Create new file } With aDate do begin d:=10; m:=2; y:=1999; end; Seek(F, FileSize(F)); Write(F, aDate); Close(F); { Close file, save changes } Readln; end. Оп! В файле 1 запись. |
Сообщ.
#8
,
|
|
|
А какого X.. использовать REWRITE !!!!!!
Надо использовать RESET !!!! ![]() ![]() Reset ( procedure) Opens an existing file Цитата из HELPa |
Сообщ.
#9
,
|
|
|
Damirjano
Пора мне на покой, похоже. Старею. ![]() Конечно, ReSet Добавлено Риторический вопрос: Почему у меня в голове закрепилось, что ReWrite - только для записи, а ReSet - только для чтения? ![]() |
Сообщ.
#10
,
|
|
|
Хм. Вот, написал кое-что:
![]() ![]() type {file handle} HFILE = Word; {seek mode} TSeekMode = (FILE_BEGIN, FILE_CURRENT, FILE_END); {open mode} TOpenMode = (FILE_READ, FILE_WRITE, FILE_READWRITE); const file_name = 'G:\test.bin'+#0; {file attributes} FA_NORMAL = $00; FA_READ_ONLY = $01; FA_HIDDEN = $02; FA_SYSTEM = $04; FA_ARCHIVE = $20; var h: HFILE; a: string; function CreateFile(szFileName: PChar; wAttr: Word): HFILE; assembler; asm push dx push cx push ds mov ax,[bp+8] mov ds,ax mov ah,03Ch mov cx,wAttr mov dx,di int 21h jnc @@exit xor ax,ax @@exit: pop ds pop cx pop dx end; function OpenFile(szFileName: PChar; wMode: TOpenMode): HFILE; assembler; asm push dx push ds mov ax,[bp+8] mov ds,ax mov ah,040h mov dx,[bp+6] mov ah,03Dh mov al,wMode int 21h jnc @@exit xor ax,ax @@exit: pop ds pop dx end; function SeekFile(h: HFILE; LoOffset, HiOffset: Word; wMode: TSeekMode): Word; assembler; asm push dx push cx push bx mov ah,042h mov al,wMode mov cx,HiOffset mov dx,LoOffset mov bx,h int 21h pop bx pop cx pop dx end; function ReadFile(h: HFILE; pBuf: Pointer; wBytesCount: Word): Word; assembler; asm push dx push cx push bx push ds mov ax,word [bp+4] mov ds,ax mov ah,03Fh mov dx,[bp+2] mov cx,wBytesCount mov bx,h int 21h pop ds pop bx pop cx pop dx end; function WriteFile(h: HFILE; pBuf: Pointer; wBytesCount: Word): Word; assembler; asm push dx push cx push bx push ds mov ax,[bp+8] mov ds,ax mov ah,040h mov dx,[bp+6] mov cx,wBytesCount mov bx,h int 21h pop ds pop bx pop cx pop dx end; procedure CloseFile(h: HFILE); assembler; asm push bx mov ax,03E00h mov bx,h int 21h pop bx end; procedure DeleteFile(szFileName: PChar); assembler; asm push dx push ds mov ax,[bp+6] mov ds,ax mov dx,[bp+4] mov ax,04100h int 21h pop ds pop dx end; begin h:=OpenFile(file_name, FILE_READWRITE); if (h <> 0) then begin a:='Hello, world!'; SeekFile(h, 0, 0, FILE_END); WriteFile(h, @a[1], Length(a)); CloseFile(h); end; end. Добавлено Цитата Оззя @ Риторический вопрос: Почему у меня в голове закрепилось, что ReWrite - только для записи, а ReSet - только для чтения Потому что так было, есть и будет ![]() |
Сообщ.
#11
,
|
|
|
Оззя, я так понимаю стереотип... раз можно читать, значит только для чтения
![]() Ct757, асмовые процедуры конечно вещь, но они в данной ситуации просто не нужны... |
Сообщ.
#12
,
|
|
|
Vesper, да, че-то я разогнался. Reset открывает в режиме read only, только если файл текстовый
![]() |
Сообщ.
#13
,
|
|
|
Огромное спасибо всем! Разобрался. Вопрос решён.
|
Сообщ.
#14
,
|
|
|
Цитата Ct757 @ ... да, че-то я разогнался. Reset открывает в режиме read only, только если файл текстовый... Или если system.filemode установлена в 0! ![]() |