Namespaces
Variants

fopen, fopen_s

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
(1)
FILE * fopen ( const char * filename, const char * mode ) ;
(hasta C99)
FILE * fopen ( const char * restrict filename, const char * restrict mode ) ;
(desde C99)
errno_t fopen_s ( FILE * restrict * restrict streamptr,

const char * restrict filename,

const char * restrict mode ) ;
(2) (desde C11)
1) Abre un archivo indicado por filename y devuelve un puntero al flujo de archivo asociado con ese archivo. mode se utiliza para determinar el modo de acceso al archivo.
2) Igual que (1) , excepto que el puntero al flujo de archivo se escribe en streamptr y los siguientes errores se detectan en tiempo de ejecución y llaman a la función constraint handler actualmente instalada:
  • streamptr es un puntero nulo
  • filename es un puntero nulo
  • mode es un puntero nulo
Como con todas las funciones con verificación de límites, fopen_s solo está garantizada su disponibilidad si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdio.h> .

Contenidos

Parámetros

filename - nombre de archivo para asociar al flujo de archivo
mode - cadena de caracteres terminada en nulo que determina el modo de acceso al archivo
streamptr - puntero a un puntero donde la función almacena el resultado (un parámetro de salida)

Banderas de acceso a archivos

Cadena de modo de acceso
a archivo
Significado Explicación Acción si el archivo
ya existe
Acción si el archivo
no existe
"r" lectura Abrir un archivo para lectura leer desde el inicio error al abrir
"w" escritura Crear un archivo para escritura destruir contenido crear nuevo
"a" añadir Añadir a un archivo escribir al final crear nuevo
"r+" lectura extendida Abrir un archivo para lectura/escritura leer desde el inicio error
"w+" escritura extendida Crear un archivo para lectura/escritura destruir contenido crear nuevo
"a+" añadir extendido Abrir un archivo para lectura/escritura escribir al final crear nuevo
La bandera de modo de acceso a archivo "b" puede especificarse opcionalmente para abrir un archivo en modo binario. Esta bandera no tiene efecto en sistemas POSIX, pero en Windows desactiva el manejo especial de ' \n ' y ' \x1A ' .
En los modos de acceso de añadir, los datos se escriben al final del archivo independientemente de la posición actual del indicador de posición del archivo.
El comportamiento es indefinido si el modo no es una de las cadenas listadas arriba. Algunas implementaciones definen modos adicionales soportados (ej. Windows ).
En modo de actualización ( '+' ), tanto entrada como salida pueden realizarse, pero la salida no puede seguir a la entrada sin una llamada intermedia a fflush , fseek , fsetpos o rewind , y la entrada no puede seguir a la salida sin una llamada intermedia a fseek , fsetpos o rewind , a menos que la operación de entrada encuentre el final del archivo. En modo de actualización, se permite a las implementaciones usar modo binario incluso cuando se especifica modo texto.
La bandera de modo de acceso a archivo "x" puede añadirse opcionalmente a los especificadores "w" o "w+" . Esta bandera fuerza a la función a fallar si el archivo existe, en lugar de sobrescribirlo. (C11)
Cuando se usa fopen_s o freopen_s , los permisos de acceso al archivo para cualquier archivo creado con "w" o "a" impiden que otros usuarios accedan a él. La bandera de modo de acceso a archivo "u" puede anteponerse opcionalmente a cualquier especificador que comience con "w" o "a" , para habilitar los permisos predeterminados de fopen . (C11)

Valor de retorno

1) Si tiene éxito, devuelve un puntero al nuevo flujo de archivo. El flujo está completamente almacenado en búfer a menos que filename se refiera a un dispositivo interactivo. En caso de error, devuelve un puntero nulo. POSIX requiere que errno sea establecido en este caso.
2) Si tiene éxito, retorna cero y un puntero al nuevo flujo de archivo es escrito en * streamptr . En caso de error, retorna un código de error distinto de cero y escribe el puntero nulo en * streamptr (a menos que streamptr sea un puntero nulo en sí mismo).

Notas

El formato de filename está definido por la implementación, y no necesariamente se refiere a un archivo (por ejemplo, puede ser la consola u otro dispositivo accesible a través de la API del sistema de archivos). En plataformas que los admiten, filename puede incluir ruta absoluta o relativa del sistema de archivos.

Ejemplo

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL);
    int is_ok = EXIT_FAILURE;
    FILE* fp = fopen(fname, "w+");
    if (!fp)
    {
        perror("File opening failed");
        return is_ok;
    }
    fputs("Hello, world!\n", fp);
    rewind(fp);
    int c; // note: int, not char, required to handle EOF
    while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop
        putchar(c);
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
    {
        puts("End of file is reached successfully");
        is_ok = EXIT_SUCCESS;
    }
    fclose(fp);
    remove(fname);
    return is_ok;
}

Salida posible:

Hello, world!
End of file is reached successfully

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.21.5.3 La función fopen (p: 223-224)
  • K.3.5.2.1 La función fopen_s (p: 428-429)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.21.5.3 La función fopen (p: 305-306)
  • K.3.5.2.1 La función fopen_s (p: 588-590)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.5.3 La función fopen (p: 271-272)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.5.3 La función fopen

Véase también

cierra un archivo
(función)
sincroniza un flujo de salida con el archivo real
(función)
abre un flujo existente con un nombre diferente
(función)