std:: fseek
|
Definido en el encabezado
<cstdio>
|
||
|
int
fseek
(
std::
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
Establece el indicador de posición del archivo para el flujo de archivo stream .
Si el stream está abierto en modo binario, la nueva posición es exactamente offset bytes medidos desde el inicio del archivo si origin es SEEK_SET , desde la posición actual del archivo si origin es SEEK_CUR , y desde el final del archivo si origin es SEEK_END . Los flujos binarios no están obligados a soportar SEEK_END , particularmente si se emiten bytes nulos adicionales.
Si el stream está abierto en modo texto, los únicos valores soportados para offset son cero (que funciona con cualquier origin ) y un valor devuelto por una llamada anterior a std::ftell en un stream asociado al mismo archivo (que solo funciona con origin de SEEK_SET ).
Si el stream está orientado a caracteres anchos, se aplican las restricciones tanto de flujos de texto como binarios (el resultado de std::ftell está permitido con SEEK_SET y el desplazamiento cero está permitido desde SEEK_SET y SEEK_CUR , pero no desde SEEK_END ).
Además de cambiar el indicador de posición del archivo,
fseek
deshace los efectos de
std::ungetc
y limpia el estado de fin de archivo, si es aplicable.
Si ocurre un error de lectura o escritura, se activa el indicador de error para el flujo ( std::ferror ) y la posición del archivo no se ve afectada.
Contenidos |
Parámetros
| stream | - | flujo de archivo a modificar |
| offset | - | número de caracteres para desplazar la posición relativa al origen |
| origin | - | posición a la cual se añade offset . Puede tener uno de los siguientes valores: SEEK_SET , SEEK_CUR , SEEK_END |
Valor de retorno
0 en caso de éxito, valor distinto de cero en caso contrario.
Notas
Después de buscar una posición que no sea el final en un flujo amplio, la siguiente llamada a cualquier función de salida puede dejar el resto del archivo indefinido, por ejemplo, al generar una secuencia multibyte de una longitud diferente.
POSIX permite buscar más allá del final existente del archivo. Si se realiza una salida después de esta búsqueda, cualquier lectura del espacio devolverá bytes cero. Donde sea compatible con el sistema de archivos, esto crea un archivo disperso .
POSIX también requiere que
fseek
primero realice
fflush
si hay datos no escritos (pero si el estado de desplazamiento se restaura está definido por la implementación). Los flujos de archivos estándar de C++ garantizan tanto el vaciado como la restauración del desplazamiento:
std::basic_filebuf::seekoff
.
POSIX especifica que
fseek
debe retornar
-
1
en caso de error, y establecer
errno
para indicar el error.
En Windows,
_fseeki64
puede utilizarse para trabajar con archivos mayores a 2 GiB.
Ejemplo
#include <cassert> #include <cstdio> #include <cstdint> #include <fstream> #include <vector> int main() { std::ofstream("dummy.nfo") << "8 bytes\n"; // crear el archivo std::FILE* fp = std::fopen("dummy.nfo", "rb"); assert(fp); std::fseek(fp, 0, SEEK_END); // desplazarse al final const std::size_t filesize = std::ftell(fp); std::vector<std::uint8_t> buffer(filesize); std::fseek(fp, 0, SEEK_SET); // desplazarse al inicio std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp); std::fclose(fp); std::printf("I've read %zi bytes\n", filesize); }
Salida posible:
I've read 8 bytes
Véase también
|
mueve el indicador de posición del archivo a una ubicación específica en un archivo
(función) |
|
|
obtiene el indicador de posición del archivo
(función) |
|
|
devuelve el indicador de posición actual del archivo
(función) |
|
|
mueve el indicador de posición del archivo al principio de un archivo
(función) |
|
|
Documentación de C
para
fseek
|
|