Проблема
Недопустимая позиция файла возникает, когда аргумент позиции файла fsetpos() использует значение, которое не получено из fgetpos().
РискФункция fgetpos(FILE *stream, fpos_t *pos) получает текущее положение файла потока. При использовании любого другого значения в качестве аргумента позиции файла fsetpos(FILE *stream, const fpos_t *pos), вы можете получить доступ к непреднамеренному расположению в потоке.
ЗафиксироватьИспользовать значение, возвращенное при успешном вызове fgetpos() в качестве аргумента позиции файла fsetpos().
Пример - memset() Задание аргумента позиции файла#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *func(FILE *file)
{
fpos_t offset;
if (file == NULL)
{
/* Handle error */
}
/* Store initial position in variable 'offset' */
(void)memset(&offset, 0, sizeof(offset));
/* Read data from file */
/* Return to the initial position. offset was not
returned from a call to fgetpos() */
if (fsetpos(file, &offset) != 0)
{
/* Handle error */
}
return file;
}
В этом примере: fsetpos() использование offset в качестве аргумента позиции файла. Однако значение offset устанавливается по memset(). Предыдущий код может получить доступ к неверному местоположению в потоке.
Исправление - использовать позицию файла, возвращенную из fgetpos()Звонить fgetpos(), и если он успешно возвращается, используйте аргумент position в вызове fsetpos().
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *func(FILE *file)
{
fpos_t offset;
if (file == NULL)
{
/* Handle error */
}
/* Store initial position in variable 'offset'
using fgetpos() */
if (fgetpos(file, &offset) != 0)
{
/* Handle error */
}
/* Read data from file */
/* Back to the initial position */
if (fsetpos(file, &offset) != 0)
{
/* Handle error */
}
return file;
}