Проблема
Недопустимое положение файла возникает, когда аргумент положения файла 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;
}