C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Аналог Truncate, Работа с файлами
Virus
  Отправлено: 17.10.2006, 18:13


Ученик-кочегар

Группа: Участник
Сообщений: 17



Какой эквивалент Pascal'евской функции Truncate есть в BCB?
Я в смысле урезания файла на определённой позиции.
AVC
Отправлено: 18.10.2006, 08:43


Ветеран

Группа: Модератор
Сообщений: 1583



Например SetEndOfFile.
Virus
Отправлено: 19.10.2006, 21:21


Ученик-кочегар

Группа: Участник
Сообщений: 17



Спасибо, попробую.
Grigoriy
Отправлено: 20.10.2006, 01:14


Мастер участка

Группа: Участник
Сообщений: 381



SetEndOfFile, насколько мне известно — это API-функция.
AVC
Отправлено: 20.10.2006, 08:29


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Grigoriy @ 20.10.2006, 01:14)
SetEndOfFile, насколько мне известно — это API-функция.

И ?
Virus
Отправлено: 20.10.2006, 19:09


Ученик-кочегар

Группа: Участник
Сообщений: 17



То, что API меня не смущает, но появился ещё вопрос:
Я использовал для работы с файлами функции я использовал fopen, а он возвращает указатель (FILE *). SetEndOfFile возвращает дексриптор файла (int).
Есть ли другя функция или придётся переписывать код для работы с файлами?
Grigoriy
Отправлено: 20.10.2006, 19:56


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Virus @ 20.10.2006, 20:09)
Есть ли другя функция или придётся переписывать код для работы с файлами?

API-функция

HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);

возвращает ХЕНДЛ создаваемого или открываемого файла.

Затем устанавливаем указатель файла в необходимую позицию API-функцией

DWORD SetFilePointer(
HANDLE hFile, // handle of file
LONG lDistanceToMove, // number of bytes to move file pointer
PLONG lpDistanceToMoveHigh, // address of high-order word of distance to move
DWORD dwMoveMethod // how to move
);

и используем API-функцию

BOOL SetEndOfFile(
HANDLE hFile // handle of file whose EOF is to be set
);

Закрываем файл API-функцией
BOOL CloseHandle(
HANDLE hObject // handle to object to close
);

В Windows SDK (в Билдере) на эти функции есть HELP.
По предметному указателю можно легко найти.
Admin
Отправлено: 20.10.2006, 20:37


Владимир

Группа: Администратор
Сообщений: 1190



Связать FILE* и Handle:

FILE *temp_file;
int handle;

/* получить дескриптор данного файла */

handle = fileno(temp_file);
Grigoriy
Отправлено: 20.10.2006, 22:07


Мастер участка

Группа: Участник
Сообщений: 381



Простите, а еще вопрос...
А какой подключаемый файл нужно использовать, чтобы можно было использовать функцию

HANDLE fileno( FILE*)

?
Admin
Отправлено: 21.10.2006, 09:06


Владимир

Группа: Администратор
Сообщений: 1190



Напишите эту функцию в коде C++Builder нажите F1
и получите по ней справку с примером.

Header File

stdio.h
Grigoriy
Отправлено: 22.10.2006, 02:13


Мастер участка

Группа: Участник
Сообщений: 381



В общем _fileno — это макрос
wink.gif
а не функция.

А работа этого макроса заключается в том, чтобы извлечь двухбайтное значение ячейки памяти со смещением 0x16 относительно указателя
FILE*
и расширить его до четырехбайтного со знаковым расширением.
Virus
Отправлено: 23.10.2006, 19:21


Ученик-кочегар

Группа: Участник
Сообщений: 17



Извиняюсь, что давно не был, времени не хватало.
В общем, fileno. Хорошо попробую.
Спасибо всем.
Boyko
Отправлено: 26.10.2006, 16:05


Станционный диспетчер

Группа: Участник
Сообщений: 88



Тоже давно не был.

Когда-то писал

CODE
fHandle=FileOpen(fName,fmOpenWrite);
FileSeek(fHandle,-truncationSize,2);
SetEndOfFile((HANDLE) fHandle);
FileClose(fHandle);

Вернуться в Вопросы программирования в C++Builder