Что такое код fgetpos


Функция fgetpos

Функция fgetpos() сохраняет в объекте, на который указывает параметр position , текущее значение указателя позиции файла из заданного потока. Объект, адресуемый элементом position , должен иметь тип fpos_t . Сохраняемое значение может быть полезно только для последующего обращения к функции fsetpos() .

Отметим, что в версии C99 к параметрам stream и position применяется квалификатор restrict .

При возникновении ошибки функция fgetpos() возвращает ненулевое значение; в противном случае возврашается нуль.

Пример

Следующий фрагмент программы присваивает переменной file_loc текущее знамение положения файла.

fgetpos fgetpos

Получает индикатор позиции файла потока. Gets a stream’s file-position indicator.

Синтаксис Syntax

Параметры Parameters

вышестоящий stream
Целевой поток. Target stream.

POS pos
Хранилище индикатора позиции. Position-indicator storage.

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

В случае успеха fgetpos возвращает 0. If successful, fgetpos returns 0. В случае сбоя он возвращает ненулевое значение и задает для нуля одну из следующих констант манифеста (определенных в stdio. З): Значение EBADF, что означает, что указанный поток не является допустимым указателем файла или недоступен, или еинвал, что означает, что значение потока или значение POS являются недопустимыми, например если либо является пустым указателем. On failure, it returns a nonzero value and sets errno to one of the following manifest constants (defined in STDIO.H): EBADF, which means the specified stream is not a valid file pointer or is not accessible, or EINVAL, which means the stream value or the value of pos is invalid, such as if either is a null pointer. Если Stream или POS является пустым указателем, функция вызывает обработчик недопустимого параметра, как описано в разделе Проверка параметров. If stream or pos is a NULL pointer, the function invokes the invalid parameter handler, as described in Parameter Validation.

Примечания Remarks

Функция fgetpos получает текущее значение индикатора положения файла в аргументе потока и сохраняет его в объекте, на который указывает POS. Функция fsetpos впоследствии может использовать информацию, хранящуюся в POS , для сброса указателя аргумента потока на его положение во время вызова fgetpos . The fgetpos function gets the current value of the stream argument’s file-position indicator and stores it in the object pointed to by pos. The fsetpos function can later use information stored in pos to reset the stream argument’s pointer to its position at the time fgetpos was called. Значение POS сохраняется во внутреннем формате и предназначено для использования только fgetpos и fsetpos. The pos value is stored in an internal format and is intended for use only by fgetpos and fsetpos.

Требования Requirements

Функция Function Обязательный заголовок Required header
fgetpos fgetpos

Дополнительные сведения о совместимости см. в разделе Совместимость. For additional compatibility information, see Compatibility.

‘fgetpos’ не возвращает правильную позицию

Обновление. Чтобы обойти проблему ниже, я сделал

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

Я хочу получить позицию в текстовом файле. Для большинства файлов я читал первую строчку, сохраняю позицию, делаю некоторые другие вещи и возвращаюсь в позицию потом.

Со всеми файлами, предоставленными мне, хранилище fgetpos и fsetpos работает правильно. Проблема связана с файлом, который я создал, который выглядит

который почти идентичен поставляемым файлам. Проблема в том, что для файла выше fgetpos(m_pFile, &position); не возвращает правильную position (я знаю, что fpos_t position является специфичной для реализации). После первой ReadLine я получаю position 58 (отредактирована с 60), так что, когда я пытаюсь прочитать вторую строку с

Почему fgetpos не возвращает позицию конца первой строки?

_Заметка. Метод Utils.ReadLine :

Редактировать. После предложений по отладке в комментариях я добавил следующий код

Что такое код fgetpos

Gets a stream’s file-position indicator.

Function Required Header Compatibility
fgetpos ANSI, Win 95, Win NT

For additional compatibility information, see Compatibility in the Introduction.

LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version

If successful, fgetpos returns 0. On failure, it returns a nonzero value and sets errno to one of the following manifest constants (defined in STDIO.H): EBADF, which means the specified stream is not a valid file handle or is not accessible, or EINVAL, which means the stream value is invalid.

The fgetpos function gets the current value of the stream argument’s file-position indicator and stores it in the object pointed to by pos. The fsetpos function can later use information stored in pos to reset the stream argument’s pointer to its position at the time fgetpos was called. The pos value is stored in an internal format and is intended for use only by fgetpos and fsetpos.

what is difference between fgetpos/fsetpos and ftell/fseek

What’s the difference between using the functions fgetpos() and fsetpos() and using the functions ftell() and fseek() to get and set a position in a file?

What are fgetpos() and fsetpos() good for? Why would they be used instead of ftell() and fseek() ?

4 Answers 4

None of the above answers are correct — in fact if you use fsetpos interchangeably with fseek you could introduce a security flaw (https://www.securecoding.cert.org/confluence/pages/viewpage.action?page >

The reason is that the fpos_t *pos argument to fsetpos isn’t actually an integer so it can’t be used to seek to arbitrary locations in a file. The only valid values are therefore ones obtained from fgetpos . As the docs say,

The internal file position indicator associated with stream is set to the position represented by pos , which is a pointer to an fpos_t object whose value shall have been previously obtained by a call to fgetpos .

If all you want is the ability to seek to arbitrary locations beyond 32-bit boundary, then use ftello / fseeko and compile with #define _FILE_OFFSET_BITS 64 .

Well, from the manpage we can see that ftell and fseek use type long int to represent offsets (positions) in a file, and may therefore be limited to offsets which can be represented in a long int. (Type long int is not guaranteed to hold values larger than 2**31-1, limiting the maximum offset to 2 gigabytes). The newer fgetpos and fsetpos functions, on the other hand, use a special typedef, fpos_t, to represent the offsets. The type behind this typedef, if chosen appropriately, can represent arbitrarily large offsets, so fgetpos and fsetpos can be used with arbitrarily huge files. fgetpos and fsetpos also record the state associated with multibyte streams.

fgetpos() goes with fsetpos(). And ftell() goes with fseek().

fgetpos() looks practically like ftell() because both take a FILE* parameter, and both return some kind of position in the file, albeit with a slightly different style. But get this: ONLY fseek() allows you to seek from the beginning of the file, from your current position in the file, and backwards from the end of the file (the third argument to fseek() being SEEK_SET, SEEK_CUR, and SEEK_END). fsetpos() doesn’t do this. fsetpos() is limited to going back to some position you got from fgetpos().

Let us say you want to read a file into memory. How much heap do you need from malloc()? You need the size of the file. And I have yet to find any function in the C Standard Library that will tell you the size of a file, though some C Compilers may add a non-standard function. For example, Borland Turbo C had filelength(). But I have not seen filelength() amongst the STANDARD C Library.

So, what you can do is use fseek() to 0 bytes before the END of the file. Then use ftell() to get the position in bytes, and base your calculation for amount of heap memory on that.

What else could you do to get the file size? You could use fgetc() to read each character, counting until you get to the end. But I think using fseek() and ftell() is better and easier.

Что такое код fgetpos

Для чего хороши fgetpos () и fsetpos ()? Почему они будут использоваться вместо ftell () и fseek ()?

Причина в том, что аргумент fpos_t * pos для fsetpos на самом деле не является целым числом, поэтому его нельзя использовать для поиска произвольных мест в файле. Поэтому единственными действительными значениями являются значения, полученные из fgetpos. Как говорят документы,

The internal file position indicator associated with stream is set to the position represented by pos , which is a pointer to an fpos_t object whose value shall have been previously obtained by a call to fgetpos .

Если все, что вам нужно, это возможность искать произвольные местоположения за пределами 32-битной границы, тогда используйте ftello / fseeko и скомпилируйте с помощью #define _FILE_OFFSET_BITS 64.

в чем разница между fgetpos /fsetpos и ftell /fseek

В чем разница между использованием функций fgetpos() и fsetpos() и используя функции ftell() и fseek() чтобы получить и установить позицию в файле?

Что такое fgetpos() и fsetpos() хорош для? Почему они должны использоваться вместо ftell() и fseek()

4 ответа

Итак, из man-страницы видно, что ftell и fseek используют тип long int для представления смещений (позиций) в файле и поэтому могут быть ограничены смещениями, которые могут быть представлены в long int. (Тип long int не гарантирует хранения значений больше 2 ** 31-1, ограничивая максимальное смещение до 2 гигабайт). Более новые функции fgetpos и fsetpos, с другой стороны, используют специальный typedef, fpos_t, для представления смещений. Тип, стоящий за этим typedef, при правильном выборе может представлять произвольно большие смещения, поэтому fgetpos и fsetpos могут использоваться с произвольно большими файлами. fgetpos и fsetpos также записывают состояние, связанное с многобайтовыми потоками.

Ни один из приведенных выше ответов не является правильным — фактически, если вы используете fsetpos взаимозаменяемо с fseek вы можете ввести уязвимость системы безопасности ( https://www.securecoding.cert.org/confluence/pages/viewpage.action?page >

Причина в том, что аргумент fpos_t *pos для fsetpos на самом деле не является целым числом, поэтому его нельзя использовать для поиска произвольных мест в файле. Поэтому единственными действительными значениями являются значения, полученные из fgetpos . Как говорят в документах,

Внутренний индикатор положения файла, связанный с потоком, устанавливается в положение, представленное pos , которое является указателем на fpos_t объект , значение которого было предварительно получено при вызове fgetpos

Если вам нужна только возможность поиска произвольных местоположений за 32-битной границей, используйте ftello / fseeko и скомпилируйте с помощью #define _FILE_OFFSET_BITS 64 .

fgetpos () идет вместе с fsetpos (). И ftell () идет вместе с fseek ().

fgetpos () выглядит практически как ftell (), потому что оба принимают параметр FILE *, и оба возвращают какую-то позицию в файле, хотя и с немного другим стилем. Но получите это: ТОЛЬКО fseek () позволяет вам искать от начала файла, от вашей текущей позиции в файле и обратно от конца файла (третий аргумент для fseek () — SEEK_SET, SEEK_CUR и SEEK_END ). fsetpos () не делает этого. Функция fsetpos () ограничена возвратом к той позиции, которую вы получили из fgetpos ().

Допустим, вы хотите прочитать файл в память. Сколько кучи вам нужно от malloc ()? Вам нужен размер файла. И мне еще предстоит найти какую-либо функцию в стандартной библиотеке C, которая сообщит вам размер файла, хотя некоторые компиляторы C могут добавить нестандартную функцию. Например, Borland Turbo C имеет длину файла (). Но я не видел filelength () среди библиотеки STANDARD C.

Итак, вы можете использовать fseek () для 0 байтов перед END файла. Затем используйте ftell (), чтобы получить позицию в байтах, и основывайте свои вычисления для объема памяти кучи на этом.

Что еще можно сделать, чтобы получить размер файла? Вы можете использовать fgetc () для чтения каждого символа, считая до конца. Но я думаю, что использовать fseek () и ftell () лучше и проще.

Функциональной разницы нет, хотя интерфейсы определены по-разному. Они оба реализованы, потому что оба являются частью POSIX.

Что такое код fgetpos

The ftell ();
function obtains the current value of the file position indicator for the stream pointed to by Fa stream .

The rewind ();
function sets the file position indicator for the stream pointed to by Fa stream to the beginning of the file. It is equivalent to:

except that the error indicator for the stream is also cleared (see clearerr(3)).

Since rewind ();
does not return a value, an application wishing to detect errors should clear errno then call rewind (,);
and if errno is non-zero, assume an error has occurred.

The fseeko ();
function is identical to fseek (,);
except it takes an Fa off_t argument instead of a Fa long . Likewise, the ftello ();
function is identical to ftell (,);
except it returns an Fa off_t .

The fgetpos ();
and fsetpos ();
functions are alternate interfaces for retrieving and setting the current position in the file, similar to ftell ();
and fseek (,);
except that the current position is stored in an opaque object of type Vt fpos_t pointed to by Fa pos . These functions provide a portable way to seek to offsets larger than those that can be represented by a Vt long int . They may also store additional state information in the Vt fpos_t object to facilitate seeking within files containing multibyte characters with state-dependent encodings. Although Vt fpos_t has traditionally been an integral type, applications cannot assume that it is; in particular, they must not perform arithmetic on objects of this type.

If the stream is a wide character stream (see fwide(3)), the position specified by the combination of Fa offset and Fa whence must contain the first byte of a multibyte sequence.

RETURN VALUES

Rv -std fgetpos fseek fseeko fsetpos

Upon successful completion, ftell ();
and ftello ();
return the current offset. Otherwise, -1 is returned and the global variable errno is set to indicate the error.

ERRORS

Bq Er EBADF The Fa stream argument is not a seekable stream. Bq Er EINVAL The Fa whence argument is invalid or the resulting file-position indicator would be set to a negative value. Bq Er EOVERFLOW The resulting file offset would be a value which cannot be represented correctly in an object of type Fa off_t for fseeko ();
and ftello ();
or Fa long for fseek ();
and ftell (.);
Bq Er ESPIPE The file descriptor underlying stream is associated with a pipe or FIFO or file-position indicator value is unspecified (see ungetc(3)).

The functions fgetpos (,);
fseek (,);
fseeko (,);
fsetpos (,);
ftell (,);
ftello (,);
and rewind ();
may also fail and set errno for any of the errors specified for the routines fflush(3), fstat(2), lseek(2), and malloc(3).

SEE ALSO


STANDARDS

The fseeko ();
and ftello ();
functions conform to St -p1003.1-2001 .

C library function — fgetpos()

Description

The C library function int fgetpos(FILE *stream, fpos_t *pos) gets the current file position of the stream and writes it to pos.

Declaration

Following is the declaration for fgetpos() function.

Parameters

stream − This is the pointer to a FILE object that identifies the stream.

pos − This is the pointer to a fpos_t object.

Return Value

This function returns zero on success, else non-zero value in case of an error.

Example

The following example shows the usage of fgetpos() function.

Let us compile and run the above program to create a file file.txt which will have the following content. First of all we get the initial position of the file using fgetpos() function and then we write Hello, World!in the file, but later we have used fsetpos() function to reset the write pointer at the beginning of the file and then over-write the file with the following content −

Now let us see the content of the above file using the following program −

Let us compile and run above program to produce the following result −

c список какая разница между fgetpos/fsetpos и ftell/fseek

список библиотек си (4)

fgetpos () идет с fsetpos (). И ftell () идет с fseek ().

fgetpos () выглядит практически так же, как ftell (), потому что оба имеют параметр FILE *, и оба возвращают некоторую позицию в файле, хотя и имеют немного другой стиль. Но получите это: ТОЛЬКО fseek () позволяет вам искать с начала файла, с вашей текущей позиции в файле и обратно с конца файла (третий аргумент fseek () — SEEK_SET, SEEK_CUR и SEEK_END ). Функция fsetpos () не делает этого. Функция fsetpos () ограничена возвратом к некоторой позиции, которую вы получили от fgetpos ().

Скажем, вы хотите прочитать файл в памяти. Сколько кучи вам нужно от malloc ()? Вам нужен размер файла. И еще мне нужно найти какую-либо функцию в стандартной библиотеке C, которая сообщит вам размер файла, хотя некоторые компиляторы C могут добавлять нестандартную функцию. Например, Borland Turbo C имеет длину файла (). Но я не видел filelength () среди STANDARD C Library.

Итак, что вы можете сделать, это использовать fseek () до 0 байт до END файла. Затем используйте ftell (), чтобы получить позицию в байтах, и основывайте свой расчет на количество памяти кучи на этом.

Что еще вы могли бы сделать, чтобы получить размер файла? Вы можете использовать fgetc () для чтения каждого символа, считая, пока не дойдете до конца. Но я думаю, что использование fseek () и ftell () лучше и проще.

В чем разница между использованием функций fgetpos() и fsetpos() и использованием функций ftell() и fseek() для получения и установки позиции в файле?

Для чего нужны fgetpos() и fsetpos() ? Почему они будут использоваться вместо ftell() и fseek() ?

Ни один из приведенных выше ответов не является правильным — на самом деле, если вы используете fsetpos взаимозаменяемо с fseek вы можете ввести недостаток безопасности ( https://www.securecoding.cert.org/confluence/pages/viewpage.action?page >

Причина в том, что аргумент fpos_t *pos для fsetpos самом деле не является целым числом, поэтому его нельзя использовать для поиска произвольных местоположений в файле. Поэтому единственными допустимыми значениями являются значения, полученные из fgetpos . Как говорят документы,

Внутренний индикатор положения файла, связанный с потоком, устанавливается в позицию, представленную pos , которая является указателем на объект fpos_t , значение которого должно быть предварительно получено вызовом fgetpos .

Если все, что вам нужно, это возможность искать произвольные местоположения за пределами 32-битной границы, тогда используйте ftello / fseeko и скомпилируйте с #define _FILE_OFFSET_BITS 64 .

Ну, из manpage мы видим, что ftell и fseek используют тип long int для представления смещений (позиций) в файле и поэтому могут быть ограничены смещениями, которые могут быть представлены в длинном int. (Тип long int не может содержать значения больше 2 ** 31-1, ограничивая максимальное смещение до 2 гигабайт). С другой стороны, новые функции fgetpos и fsetpos используют специальный typedef, fpos_t, для представления смещений. Тип за этим typedef, если он выбран соответствующим образом, может представлять собой сколь угодно большие смещения, поэтому fgetpos и fsetpos могут использоваться с произвольно огромными файлами. fgetpos и fsetpos также записывают состояние, связанное с многобайтовыми потоками.

Нет никакой разницы в функциональности, хотя интерфейсы определяются по-разному. Оба они реализованы, потому что оба являются частью POSIX.

Илон Маск рекомендует:  Что такое код printer_draw_line
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL