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