ltrunc()

Обрезать файл в заданной позиции

Прототип:

#include <sys/types.h>
#include <unistd.h>
off_t ltrunc( int fildes,
off_t offset,
int whence );

Аргументы:

fildes
Файловый дескриптор файла, который необходимо обрезать.
offset
Относительное смещение от позиции файла, определяемое аргументом whence.
whence
Позиция в файле. Возможные значения (определенные в <unistd.h>):
SEEK_CUR
Новая позиция файла вычисляется относительно текущей позиции файла. Значение смещения offset может быть положительным, отрицательным или нулевым.
SEEK_END
Новая позиция файла вычисляется относительно конца файла.
SEEK_SET
Новая позиция файла вычисляется относительно начала файла. Значение смещения offset не должно быть отрицательным.

Библиотека:

libc

Описание:

Функция ltrunc() пытается обрезать файл в указанной позиции. Файл, на который ссылается дескриптор открытого файла fildes, должен быть открыт O_WRONLY или O_RDWR. Точка обрезания файла вычисляется с использованием значения смещения offset как относительного смещения offset от позиции файла, определяемого значением аргумента whence. Значение смещения offset может быть отрицательным, хотя отрицательная точка обрезания файла (перед началом файла) является ошибкой.


Note: Функция ltrunc() игнорирует многопоточную синхронизацию блокировки, которая могла быть установлена с помощью fcntl().

Вычисленная точка обрезания файла, если она находится в пределах существующих границ файла, определяет новый размер файла; все данные после точки обрезания файла больше не существуют. Если точка обрезания файла находится за существующим концом файла, размер файла не изменяется. Ошибка возникает при попытке обрезания файла до начала файла (то есть отрицательной точки обрезания файла).


Note: Текущая позиция поиска не изменяется этой функцией ни при каких обстоятельствах, включая случай, когда текущая позиция поиска находится за точкой обрезания файла.

Возвращаемое значение:

После успешного завершения эта функция возвращает новый размер файла. Если была указана точка обрезания файла за пределами существующего конца файла, возвращается нынешний размер файла, и файл остается неизменным. В противном случае ltrunc() возвращает значение -1 и устанавливает номер ошибки errno для указания ошибки. В случае ошибки размер файла не изменится.

Коды ошибок:

EBADF
Аргумент fildes не является допустимым файловым дескриптором, открытым для записи.
EINVAL
Аргумент whence имеет неподходящее значение, или полученный размер файла будет недопустимым.
ENOSYS
Была сделана попытка обрезать файл, тип которого не поддерживает обрезание файлов (например, файл, связанный с диспетчером устройств).
ESPIPE
Аргумент fildes связан с неименованными (pipe) или именованными (fifo) каналами.

Примеры:

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
char buffer[1000];
int main( void )
{
int fd, stat;
fd = open( "test", O_CREAT | O_RDWR, 0666 );
if ( fd == -1 )
{
fprintf( stderr, "Open error\n" );
exit( -1 );
}
/* Create a 1000-byte file */
write( fd, buffer, 1000 );
/* Seek back to offset 500 and truncate the file */
if ( ltrunc( fd, 500, SEEK_SET ) == -1 )
{
fprintf( stderr, "ltrunc error\n" );
exit( -1 );
}
close( fd );
fd = open( "test", O_CREAT | O_RDWR, 0666 );
printf( "File size = %ld\n", lseek( fd, 0, SEEK_END ) );
close( fd );
return (0);
}

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

Функция ltrunc() не переносима и не должна использоваться в новом коде. Вместо этого рекомендуется использовать ftruncate().

Тематические ссылки:

errno, ftruncate(), lseek()




Предыдущий раздел: Описание API системной библиотеки