manejo - guardar y leer datos en un archivo.txt en c
¿Qué es exactamente la palabra clave FILE en C? (4)
He empezado a aprender algo de C como pasatiempo y he usado ciegamente FILE como una declaración para los punteros de archivos durante bastante tiempo, y me he estado preguntando. ¿Es esta una palabra clave o un tipo de datos especial para que C maneje archivos? ¿Contiene un flujo al archivo dentro y otros datos? ¿Por qué se define como un puntero?
Un ejemplo para mostrar lo que quiero hacer para que sea un poco más claro:
FILE* fp; //<-- this
fp = fopen("datum.txt", "r");
while(!feof(fp)) {
// etc.
}
¿Es esta una palabra clave o un tipo de datos especial para que C maneje archivos?
A lo que te refieres es a una estructura predeterminada que usa la biblioteca io estándar para contener los datos apropiados para el uso de fopen y su familia de funciones.
¿Por qué se define como un puntero?
Con un puntero a una estructura, puede pasarlo como parámetro a una función. Esto es, por ejemplo, lo que fgets o fgetc aceptarán, en forma de function(FILE* fp)
La función fopen devolverá un puntero a una estructura de ARCHIVO recién creada, asignando este nuevo puntero a uno no utilizado hará que apunten a la misma cosa.
¿Contiene un flujo al archivo dentro y otros datos?
La definición de la estructura parece un poco más ilusoria que su descripción. Esto se toma directamente de mi stdio.h, de MinGW32 5.1.4
typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
Lo que incluye el comentario encantador antes de que:
Algunos creen que nadie en su sano juicio debería hacer uso de los elementos internos de esta estructura.
Los contenidos de esta estructura parecen cambiar mucho en otras implementaciones, las fuentes de glibc generalmente tienen algún tipo de comentario, pero su estructura para esto está enterrada bajo un montón de código.
Tendría sentido prestar atención a la advertencia mencionada y no preocuparse por lo que hace. :)
Es un tipo de datos especial. Contiene un identificador de archivo, así como varios indicadores utilizados internamente por las diversas llamadas de stdio. Nunca necesitarás saber realmente lo que contiene, solo que es un tipo de datos que puedes pasar.
http://www.cplusplus.com/reference/clibrary/cstdio/FILE/
Sin embargo, si estás interesado, esto es lo que parece:
No es una palabra clave, es un tipo de datos definido en el estándar ANSI C para operar con archivos. Normalmente apunta a una estructura interna que describe el archivo y su estado actual a las funciones de la biblioteca.
FILE
es un identificador usado como un nombre typedef, generalmente para una struct
. La librería stdio usualmente tiene algo como
typedef struct {
...
} FILE;
algun lado. Todas las funciones de stdio relacionadas con punteros de ARCHIVO conocen los contenidos de ...
y pueden acceder a los miembros de la estructura. Los programadores de C deben usar funciones como fopen
, feof
, ferror
, ungetc
, etc. para crear y operar en estructuras de ARCHIVOS. Dichos tipos se llaman opacos (es decir, no puede mirar dentro de ellos pero debe usar funciones de acceso).
¿Por qué se define como un puntero?
No lo es Es una estructura a la que su código declara un puntero. Tenga en cuenta el asterisco en su
FILE* fp;
que es otro ejemplo de por qué el asterisco debe ir con el identificador de variable, no el nombre de tipo:
FILE *fp;