Subrutina fopen, fopen64, freopen, freopen64, fopen_s o fdopen

Finalidad

Abre una corriente y maneja las violaciones de restricción de tiempo de ejecución.

Biblioteca

Biblioteca C estándar (libc.a)

Sintaxis

#include <stdio.h>
#define STDC_WANT_LIB_EXT1 1
FILE  *fopen ( Path Type)
const char *Path, *Type;

FILE  *fopen64 ( Path Type)
char  *Path, *Type;

FILE  *freopen (PathType Stream)
const char *Path, *Type;
FILE  *Stream;

FILE  *freopen64 (PathType Stream)
char  *Path, *Type;
FILE  *Stream;

FILE  *fdopen ( FileDescriptorType)
int   FileDescriptor;
const char *Type;


errno_t fopen_s ( streamptrnombre de archivomodo)
ARCHIVO * *streamptr ;
const char * nombre de archivo ;
const char * modo ;

Descripción

Las subrutinas fopen y fopen64 abren el archivo denominado por el parámetro Vía y asocian una corriente con ella y devuelven un puntero a la estructura ARCHIVO de esta corriente.

Al abrir un archivo para la actualización, puede realizar operaciones de entrada y salida en la corriente resultante. Sin embargo, una operación de salida no puede ser seguida directamente por una operación de entrada sin una llamada de subrutina fflush o una operación de posicionamiento de archivos (subrutinafseek, fseeko, fseeko64, fsetpos, fsetpos64 o rebobinado ). Además, una operación de entrada no puede ser seguida directamente por una operación de salida sin una operación de vaciado o posicionamiento de archivo, a menos que la operación de entrada encuentre el final del archivo.

Cuando se abre un archivo para la adición (es decir, cuando el parámetro Tipo se establece en a), es imposible sobrescribir la información que ya está en el archivo.

Si dos procesos separados abren el mismo archivo para añadir, cada proceso puede escribir libremente en el archivo sin destruir la salida que está escribiendo el otro. La salida de los dos procesos se entremezcla en el orden en que se graba en el archivo.

Nota: Si los datos se almacenan en el almacenamiento intermedio, en realidad no se graban hasta que se desechan.

Las subrutinas freopen y freopen64 primero intentan vaciar la corriente y cerrar cualquier descriptor de archivo asociado con el parámetro Corriente . Se ignora el error al desechar la corriente o cerrar el descriptor de archivo.

Las subrutinas freopen y freopen64 sustituyen el archivo con nombre en lugar de la corriente abierta. La corriente original se cierra independientemente de si la apertura posterior tiene éxito. Las subrutinas freopen y freopen64 devuelven un puntero a la estructura ARCHIVO asociada al parámetro Corriente . Las subrutinas freopen y freopen64 se utilizan normalmente para conectar las corrientes preabiertas asociadas con las corrientes de entrada estándar (stdin), salida estándar (stdout) y error estándar (stderr) a otros archivos.

La subrutina fdopen asocia una corriente con un descriptor de archivo obtenido de una subrutina openx , subrutina dup , subrutina creat o subrutina pipa . Estas subrutinas abren archivos pero no devuelven punteros a estructuras ARCHIVO . Muchas de las subrutinas de paquete de E/S estándar requieren punteros a estructuras ARCHIVO .

El parámetro Tipo para la subrutina fdopen especifica la modalidad de la corriente, como por ejemplo r para abrir un archivo para lectura, o a para abrir un archivo para la adición (escritura al final del archivo). El valor de modalidad del parámetro Tipo especificado con la subrutina fdopen debe estar de acuerdo con la modalidad del archivo especificado cuando el archivo se abrió o creó originalmente.

Nota: Debe evitarse la utilización de la subrutina fdopen con un descriptor de archivo obtenido de una llamada a la subrutina shm_open y puede provocar un error en la siguiente llamada fread, fwrite o fflush .

El valor más grande que se puede representar correctamente en un objeto de tipo off_t se establecerá como el máximo de desplazamiento en la descripción de archivo abierto.

La subrutina fopen_s abre el archivo utilizando el nombre de la serie al que apunta el parámetro nombre de archivo y asocia una corriente con el archivo.

Los archivos se abren para escritura con acceso exclusivo (también conocido como no compartido). Si se crea el archivo y el primer carácter del parámetro modo no es u, y si el sistema subyacente da soporte al concepto de modalidad exclusiva, el archivo tiene un permiso que impide que otros usuarios del sistema accedan al archivo.

Si el archivo se crea y el primer carácter del parámetro modo es u, el archivo retiene los permisos de acceso al archivo por omisión del sistema hasta que se cierra el archivo.

Si el archivo se abre satisfactoriamente, el puntero a la estructura ARCHIVO al que apunta el parámetro streamptr se establece en el puntero que apunta al objeto que controla el archivo abierto. De lo contrario, el puntero a la estructura ARCHIVO al que apunta el parámetro streamptr se establece en un puntero nulo y el archivo retiene los permisos de acceso de archivo por omisión del sistema hasta que se cierra el archivo.

Restricciones de tiempo de ejecución

  1. Para la subrutina fopen_s , los parámetros streamptr, nombre de archivo o modo no deben ser un puntero nulo.
  2. Si hay una violación de restricción de tiempo de ejecución, la subrutina fopen_s no intenta abrir un archivo. Si el parámetro streamptr no es un puntero nulo, la subrutina fopen_s establece el parámetro streamptr en el puntero nulo.

Parámetros

Elemento Descripción
Vía Apunta a una serie de caracteres que contiene el nombre del archivo que se va a abrir.
tipo Apunta a una serie de caracteres que tiene uno de los valores siguientes:
:NONE.
Abre un archivo de texto para lectura.
w
Crea un nuevo archivo de texto para escribir o abre y trunca un archivo a una longitud de 0.
<
Añade (abre un archivo de texto para escribir al final del archivo o crea un archivo para escribir).
RB
Abre un archivo binario para lectura.
WB
Crea un archivo binario para escribir o abre y trunca un archivo a 0.
ab
Añade (abre un archivo binario para escribir al final del archivo o crea un archivo para escribir).
r +
Abre un archivo para la actualización (lectura y escritura).
w +
Trunca o crea un archivo para la actualización.
a +
Añade (abre un archivo de texto para escribir al final del archivo o crea un archivo para escribir).
r + b , rb +
Abre un archivo binario para la actualización (lectura y escritura).
w + b , wb +
Crea un archivo binario para la actualización, o abre y trunca un archivo a una longitud de 0.
a + b , ab +
Añade (abre un archivo binario para la actualización, escribe al final del archivo o crea un archivo para escribir).
wx
Crea un archivo de texto para escribir.
wbx
Crea un archivo binario para escribir.
w + x
Crea un archivo de texto para su actualización.
w + bx o wb + x
Crea un archivo binario para la actualización.
Nota:
  • El sistema operativo no distingue entre archivos de texto y binarios.
  • El valor b del parámetro Tipo se ignora.
  • La apertura de un archivo con modalidad exclusiva (x como último carácter en el argumento de modalidad) falla, si el archivo ya existe o no se puede crear. De lo contrario, el archivo se crea con acceso exclusivo (también conocido como no compartido) si el sistema subyacente da soporte al acceso exclusivo.
  • La subrutina fdopen no tiene ningún impacto en la modalidad exclusiva.
Flujo Especifica la corriente de entrada.
FileDescriptor Especifica un descriptor de archivo abierto válido.
streamptr Especifica la corriente que está asociada al nombre de archivo y el valor no puede ser nulo.
nombrearchivo Especifica el nombre de archivo que se debe abrir y el valor no puede ser nulo.
modalidad El valor no puede ser nulo. El parámetro de modalidad es el mismo que el parámetro Tipo descrito para la subrutina fopen , con la adición de que las modalidades que empiezan por el carácter w o a pueden ir precedidas por el carácter u tal como se muestra a continuación:
uw
Trunca a 0 o crea un archivo de texto para escribir y tiene permisos predeterminados.
uwx
Crea un archivo de texto para escribir y tiene permisos predeterminados.
Ui
Abre o crea un archivo de texto para escribir al final del archivo y tiene los permisos predeterminados.
uwb
Trunca a 0 o crea un archivo binario para escribir y tiene permisos predeterminados.
uwbx
Crea un archivo binario para escribir y tiene permisos predeterminados.
UAB
Abre o crea un archivo binario para escribir al final del archivo y tiene los permisos predeterminados.
uw +
Trunca a 0 o crea un archivo de texto para la actualización y tiene los permisos predeterminados.
uw + x
Crea un archivo de texto para la actualización y tiene los permisos predeterminados.
ua + añadir
Abre o crea un archivo de texto para la actualización y la escritura en el final del archivo y tiene los permisos predeterminados.
uw + b o uwb +
Trunca a 0 o crea un archivo binario para la actualización y tiene los permisos predeterminados.
uw + bx o uwb + x
Crea un archivo binario para la actualización y tiene los permisos predeterminados.
ua + b o uab + append
Abre o crea un archivo binario para la actualización y la escritura en el final del archivo y tiene los permisos predeterminados.
Nota: Si el parámetro modo no está precedido por u, los permisos de archivo sólo son usuarios.

Valores de retorno

Si la subrutina fdopen, fopen, fopen64, freopen o freopen64 no es satisfactoria, se devuelve un puntero nulo y la variable global errno se establece para indicar el error.

La subrutina fopen_s devuelve un cero si abre el archivo. Si el archivo no se abre o si hay una violación de restricción de tiempo de ejecución, la subrutina fopen_s devuelve un valor distinto de cero.

Códigos de error

Las subrutinas fopen, fopen64, freopen y freopen64 no tienen éxito si se cumple lo siguiente:

Elemento Descripción
EACCES Se deniega el permiso de búsqueda en un componente del prefijo de vía de acceso, el archivo existe y se deniegan los permisos especificados por la modalidad, o el archivo no existe y se deniega el permiso de escritura para el directorio padre del archivo que se va a crear.
ELOOP Se han encontrado demasiados enlaces simbólicos en la vía de acceso de resolución.
EINTR Se ha recibido una señal durante el proceso.
EISDIR El archivo con nombre es un directorio y el proceso no tiene acceso de escritura.
ENAMETOOLONG La longitud del nombre de archivo excede PATH_MAX o un componente de nombre de vía de acceso es más largo que NAME_MAX.
EMFILE El número máximo de archivos permitidos actualmente está abierto.
ENOENT El archivo especificado no existe o el parámetro Descriptor de archivo apunta a una serie vacía.
ENOSPC El archivo aún no se ha creado y el directorio o el sistema de archivos para contener el archivo nuevo no se puede expandir.
ENOTDIR Un componente del prefijo de vía de acceso no es un directorio.
ENXIO El archivo con nombre es un archivo especial de tipo carácter o bloque, y el dispositivo asociado a este archivo especial no existe.
EVERFLOW El archivo con nombre es un archivo normal y el tamaño del archivo no se puede representar correctamente en un objeto de tipo off_t.
EROFS El archivo especificado reside en un sistema de archivos de sólo lectura y no tiene acceso de escritura.
ETXBSY El archivo es un archivo de procedimiento puro (texto en rojo) que se está ejecutando y el proceso no tiene acceso de escritura.

Las subrutinas fdopen, fopen, fopen64, freopen y freopen64 no tienen éxito si se cumple lo siguiente:

Elemento Descripción
EINVAL El valor del argumento Tipo no es válido.
EINVAL El valor del argumento modo no es válido.
EMFILE Las corrientes de FOPEN_MAX están abiertas actualmente en el proceso de llamada.
EMFILE Las corrientes de STREAM_MAX están abiertas actualmente en el proceso de llamada.
ENAMETOOLONG La resolución de nombre de vía de acceso de un enlace simbólico produjo un resultado intermedio cuya longitud excede de PATH_MAX.
ENOMEM No hay suficiente espacio de almacenamiento disponible.

Las subrutinas freopen y fopen no tienen éxito si se cumple lo siguiente:

Elemento Descripción
EVERFLOW El archivo con nombre es un tamaño mayor que 2 Gigabytes.

La subrutina fdopen no es satisfactoria si se cumple lo siguiente:

Elemento Descripción
EBADF El valor del parámetro Descriptor de archivo no es válido.

POSIX

Elemento Descripción
w Trunca a 0 longitud o crea un archivo de texto para escritura.
w + Trunca a 0 la longitud o crea el archivo de texto para la actualización.
< Abre o crea un archivo de texto para escribir al final del archivo.
a + Abre o crea un archivo de texto para la actualización, escribiendo al final del archivo.

SAA

Al menos ocho corrientes, incluyendo tres corrientes de texto estándar, pueden abrirse simultáneamente. Se admiten las modalidades tanto binarias como de texto.