Namespaces
Variants

fopen, fopen_s

De es.cppreference.net
< c | io
 
 
Entrada/salida de archivos
Tipos y objetos
        
Funciones
Acceso a archivos
(C95)
Entrada/salida sin formato
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrada con formato
Entrada/salida directa
Salida con formato
Posicionamiento en archivos
Manejo de errores
Operaciones sobre archivos
 
Definido en el encabezado <stdio.h>
FILE* fopen( const char* filename, const char* mode );
(1) (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 manejador de restricciones instalada actualmente:
  • 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 para estar disponible 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>.

Parámetros

filename - nombre del archivo para asociar el 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)

Indicadores de acceso a archivos

Cadena
de modo de acceso al archivo
Significado Explicación Acción si el archivo
ya existe
Acción si el archivo
no existe
"r" lectura Abre un archivo para lectura leer desde el inicio fallo al abrir
"w" escritura Crea un archivo para escritura destruir contenido crear nuevo
"a" añadir Añadir a un archivo escribir al final crear nuevo
"r+" lectura extendida Abre un archivo para lectura/escritura leer desde el inicio error
"w+" escritura extendida Crea un archivo para lectura/escritura destruir contenido crear nuevo
"a+" añadir extendido Abre un archivo para lectura/escritura escribir al final crear nuevo
El indicador de modo de acceso al archivo "b" se puede especificar opcionalmente para abrir un archivo en modo binario. Este indicador no tiene efecto en sistemas POSIX, pero en Windows deshabilita el manejo especial de '\n' y '\x1A'.
En los modos de acceso de añadido, los datos se escriben al final del archivo independientemente de la posición actual del indicador de posición del archivo.
El comportamiento no está definido si el modo no es una de las cadenas listadas anteriormente. Algunas implementaciones definen modos adicionales soportados (p.ej. Windows).
En modo de actualización ('+'), se pueden realizar tanto entrada como salida, pero la salida no puede ser seguida de entrada sin una llamada intermedia a fflush, fseek, fsetpos o rewind, y la entrada no puede ser seguida de salida sin una llamada intermedia a fseek, fsetpos o rewind, a menos que la operación de entrada haya encontrado el final del archivo. En modo de actualización, las implementaciones pueden usar modo binario incluso cuando se especifica modo texto.
El indicador de modo de acceso al archivo "x" se puede añadir opcionalmente a los especificadores "w" o "w+". Este indicador obliga a que la función falle 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" evitan que otros usuarios accedan a él. El indicador de modo de acceso al archivo "u" se puede anteponer opcionalmente a cualquier especificador que comience con "w" o "a", para habilitar los permisos fopen predeterminados. (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 POSIX requiere] que errno se establezca en este caso.
2) Si tiene éxito, devuelve cero y un puntero al nuevo flujo de archivo se escribe en *streamptr. En caso de error, devuelve un código de error distinto de cero y escribe el puntero nulo en *streamptr (a menos que streamptr sea un puntero nulo).

Notas

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

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;
}

Posible salida:

Hello, world!
End of file is reached successfully

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.21.5.3 La función fopen (p: TBD)
  • K.3.5.2.1 La función fopen_s (p: TBD)
  • 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)