fopen, fopen_s
From cppreference.net
|
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,
|
(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:
-
-
streamptres un puntero nulo -
filenamees un puntero nulo -
modees un puntero nulo
-
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
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; }
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) |
|
|
(C11)
|
abre un flujo existente con un nombre diferente
(función) |
|
Documentación de C++
para
fopen
|
|