fopen, fopen_s
De es.cppreference.net
| 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:
streamptres un puntero nulofilenamees un puntero nulomodees un puntero nulo
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
Ejecutar este código
#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) | |
(C11) |
abre un flujo existente con un nombre diferente (función) |
Documentación de C++ para fopen
| |