Escrito en c para leer el contenido de un archivo llamado archivo y mostrarlo
1.2.1 Funciones de archivo estándar
Las funciones de archivo estándar incluyen principalmente funciones de apertura, cierre, lectura y escritura de archivos. A diferencia de los lenguajes BASIC y
FORTRAN, existen archivos secuenciales y archivos aleatorios, que deben determinarse de diferentes maneras al abrirlos.
Turbo C2.0 no distingue entre estos dos tipos de archivos, pero proporciona dos conjuntos de funciones, a saber, funciones de lectura y escritura secuenciales y funciones de lectura y escritura aleatorias.
1. Apertura y cierre de archivos
Cualquier archivo debe abrirse y cerrarse antes y después de su uso. Esto se debe a que el sistema operativo
no permite archivos. para abrir al mismo tiempo El número es limitado En el sistema operativo DOS, el número de archivos abiertos al mismo tiempo se puede definir en DISPOSITIVO
. definido en SYS. ) SYS, donde n es el número de archivos que se pueden abrir simultáneamente, generalmente nlt;=20, por lo que el archivo debe abrirse antes de usarlo para acceder a la información que contiene.
Turbo C2.0 proporciona funciones para abrir
y cerrar archivos.
1. función fopen()
La función fopen se utiliza para abrir un archivo. Su formato de llamada es:
ARCHIVO *fopen(char *nombre de archivo, *type) ;
Antes de introducir esta función, primero comprenda los siguientes conocimientos.
(1) Streams y archivos
En Turbo C2.0, existe una diferencia entre streams y archivos, que difieren entre el programador y aquellos a los que se accede
Proporciona una capa de abstracción entre el dispositivo (llamado flujo) y el dispositivo real (llamado archivo).
Los streams son dispositivos lógicos con idéntico comportamiento. Por lo tanto, las funciones que escriben en archivos de disco
también se pueden utilizar para escribir en impresoras. Hay dos tipos de flujos en Turbo C2.0: flujos de texto
y flujos binarios. Para el disco, esto significa archivos de texto y archivos binarios.
Para que el lenguaje Turbo C2.0 sea fácil de entender, el software no distingue entre transmisiones y archivos.
(2) Puntero de archivo ARCHIVO
De hecho, ARCHIVO es un nuevo tipo de datos. Es una colección de tipos de datos primitivos de Turbo C2.0, llamados punteros de estructura.
El concepto de estructura se presentará en detalle en la Sección 4. Aquí solo necesitamos entender ARCHIVO
como una estructura de datos que contiene información de administración de archivos, es decir, al abrir un archivo, primero debe definir un puntero. al archivo
Puntero al archivo.
(3) El formato de llamada de función introducido más adelante escribirá directamente el tipo de datos de los parámetros formales y el tipo de datos del valor de retorno de la función
. Por ejemplo: la función anterior abre un archivo y devuelve un puntero de archivo, que tiene dos parámetros formales
, los cuales son variables de caracteres (matriz de cadenas o puntero de cadena). Este software no proporciona instrucciones detalladas sobre el estilo de llamada de funciones.
Ahora veamos el uso de la función de abrir archivo.
El primer parámetro formal de la función fopen() es el nombre del archivo, que puede contener la ruta y el nombre del archivo.
Por ejemplo
"B:TEST.DAT"
"C:\TC\TEST.DAT"
Si la ruta está escrito como " C:\TC\TEST.DAT" es incorrecto y debe tenerse en cuenta.
El segundo parámetro formal indica el tipo de archivo que se va a abrir. Las especificaciones del tipo de archivo se muestran en la siguiente tabla.
Tipo de operación de archivo de tabla
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Significado del carácter
---- ---------- ----
"r" abre un archivo de texto de solo lectura
"w" Crear un archivo de texto de solo escritura
"a" Apéndice,
"r " Abrir un archivo de texto, solo lectura/escritura
" w "Crear archivo de texto, solo lectura/escritura
"a "Abrir o crear apéndice de archivo
"b" Archivo binario (se puede usar en combinación con lo anterior)
Archivo de texto "t" (predeterminado)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Para abrir un archivo binario llamado CLIB en el subdirectorio CCDOS, escriba el siguiente comando:
fopen("c:\ccdos\clib", "rb"); >
Si la función fopen() abre exitosamente el archivo, devolverá un puntero al archivo; de lo contrario, devolverá un puntero nulo
(NULL). Por lo tanto, puede determinar si el archivo se abrió correctamente.
2. Función fclose()
La función fclose() se utiliza para cerrar el archivo abierto por la función fopen(). Su formato de llamada es el siguiente:
.int fclose (FILE * stream);
Esta función devuelve un número entero. Devuelve 0 cuando el archivo se cierra correctamente; en caso contrario, un valor distinto de cero.
Puedes determinar si el archivo se cerró correctamente en función del valor de retorno de la función.
Ejemplo 10:
#icludelt; stdio.hgt
main()
{
ARCHIVO *fp; /*Definir el puntero al archivo*/
int i;
fp=fopen("CLIB", "rb"); el directorio actual archivo de solo lectura CLIB*/
if(fp==NULL) /*Determinar si el archivo se abrió correctamente*/
puts("Error de apertura de archivo") ;/* Solicitar apertura fallida*/
i=fclose(fp); /* Cerrar el archivo abierto*/
if(i==0) /* Determinar si el archivo se cerró correctamente*/
printf("O, K"); /* Solicitud de cierre exitoso*/
else
puts("El archivo se cerró correctamente error"); /* Solicitud de cierre fallido*/
}
II.
II.
El archivo leyendo y escribiendo Las funciones de esta sección se refieren a lectura y escritura secuencial, es decir, al leer o escribir un dato, el puntero aumenta automáticamente en 1. Las funciones de escritura y lectura se presentan a continuación.
1. Funciones de escritura secuencial de archivos
Funciones fprintf(), fputs() y fputc()
Funciones fprintf(), fputs() y fputc( ) ) son funciones escritas secuencialmente para archivos, y su formato de llamada
es el siguiente:
int fprintf (FILE *stream, char *format, lt; variable-listgt;);
int fputs (char *string, FILE *steam);
int fputc (int ch, FILE *steam); las tres funciones anteriores son todas iguales. La función fprintf() devuelve el número de palabras (bytes) realmente escritas en el archivo
. Si hay un error de escritura, se devuelve un número negativo. Cuando la función fputs() devuelve 0, indica que el carácter en el puntero de cadena se escribe en el archivo con éxito. , indica que la operación de escritura
Error. La función fputc() devuelve el valor de un carácter escrito en el archivo, lo que indica que la operación de escritura fue exitosa; de lo contrario, devuelve
devuelve EOF(). Su valor es -1 al final del archivo (definido en stdio.h), lo que indica un error en la operación de escritura.
La función fprintf() tiene los mismos requisitos de formato que la función printf(), excepto que
la función fprintf() escribe en un archivo. Y printf() sale a la pantalla.
A continuación se muestra un ejemplo que genera un archivo test.dat después de ejecutarlo.
Ejemplo 11:
#includelt; stdio.hgt
main()
{
char; *s="Esas son buenas noticias"); /* Definir e inicializar un puntero a una cadena*/
int i=617 /* Definir una variable entera e inicializarla*/
<; p> int i=617; /* Definir e inicializar una variable entera Definir e inicializar una variable entera*/FILE *fp /*Definir puntero de archivo*/
fp = fopne("test.dat", "w"); /*Crea un archivo de texto de solo escritura*/
fputs("Tu puntuación de TOEFLis", fp); Ingrese la cadena */
fputc(':', fp); /*Escriba dos puntos:
fprintf(fp, "d\n", i); un número entero para el archivo*/
fprintf(fp, "s", s); /*Escribe una cadena en el archivo creado*/
fclose(fp) /*; Cerrar archivo*/
}
El contenido de TEST.DAT mostrado por el comando TYPE de DOS es el siguiente:
Visualización en pantalla
Tu puntuación TOEFL es 617
Esta es una buena noticia
2.> 2. Función de lectura secuencial de archivos
fscanf(), fgets() y fgetc función ()
Las funciones fscanf(), fgets() y fgetc() son funciones que leen archivos secuencialmente. El formato de llamada es el siguiente:
int fscanf(FILE * stream. , char *formato, nbspfile) stream, char *formato, lt;address-listgt;
char fgets(char *string, int n, FILE *steam); int fgetc(FILE *steam);
La función fscanf() es similar a la función scanf(), excepto que lee información de un archivo.
La función fscanf() devuelve EOF (es decir, -1), lo que indica un error de lectura; de lo contrario, la lectura se realiza correctamente. La función fgets()
número lee hasta n-1 caracteres del archivo (n se usa para especificar el número de caracteres) y los coloca en la cadena
los caracteres señalados a por cadena En la cadena, se agrega automáticamente un carácter nulo al final de la cadena. Si la lectura es exitosa, se devuelve un carácter nulo. Después de la lectura, se agrega automáticamente un carácter nulo al final de la cadena. Se devuelve un puntero de cadena si la lectura es exitosa.
Se devuelve un puntero nulo si falla. La función fgetc() devuelve un carácter en la posición actual del archivo y devuelve EOF en caso de error de lectura
.
El siguiente programa lee el archivo test.dat generado en el Ejemplo 11 y muestra los resultados en la pantalla.
Ejemplo 12
#includelt; stdio.hgt
main()
{
char * s, m[20];
int i;
ARCHIVO *fp;
fp=fopen("test.dat", "r"); /* Abrir el archivo de texto para lectura solamente*/
fgets(s, 24, fp); /* Leer 23 caracteres del archivo*/
printf("s", s); /* Generar la cadena leída*/
fscanf(fp, "d", amp; i); /* Leer el número entero*/
printf(" d"); , i); /* Genera el entero leído */
putchar(fgetc(fp) /* Lee un carácter al mismo tiempo y genera */
fgets( m). , 17, fp); /* Leer 16 caracteres*/
puts(m); /* Generar la cadena leída*/
fclose(fp); /
getch(); /* Esperar a que se presione la tecla*/
}
Se muestra una cadena en la pantalla.
La pantalla muestra:
Su puntuación TOEFL es p>
Si cambia fscanf(fp, "d", amp; i) en el ejemplo anterior Para fscanf (fp, "s", m), y luego cambie la declaración de salida después de
a printf ("s", m), obtendrá el mismo resultado. Esto significa que cuando Turbo C2.0
lee archivos de texto, los caracteres y números se tratan como valores ASCII.
Una cosa más a tener en cuenta
Cabe señalar que la función fscanf() finalizará automáticamente al leer caracteres en blanco, así que preste especial atención al usarla.
3. Leer y escribir archivos aleatoriamente
A veces los usuarios quieren leer la información en el medio del archivo directamente. Si utiliza la lectura y escritura secuencial de archivos, debe comenzar desde. el comienzo del archivo
Obviamente es inconveniente leer hasta la ubicación del archivo requerido.
Turbo C2.0 proporciona un conjunto de funciones de lectura/escritura aleatoria de archivos, que pueden colocar el puntero de ubicación del archivo en el lugar donde necesita ser leído/escrito y leído/escrito directamente.
Las funciones de lectura y escritura aleatoria de archivos son las siguientes:
int fseek (FILE *stream, long offset, int fromwhere
int fread (); void *buf, tamaño int, recuento int, ARCHIVO *flujo);
int fwrite (void *buf, tamaño int, recuento int, ARCHIVO *flujo
long ftell (); FILE *stream) ;
La función fseek() se utiliza para establecer el puntero de posición del archivo en el primer origen.
Desplazamiento
La función fseek() establece el puntero de posición del archivo en el primer desplazamiento
bytes desde fromwhere, donde fromwhere es una de las siguientes macros:
El punto de partida del cálculo del puntero de ubicación del archivo desde dónde
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Numérico significado de las constantes simbólicas
---------- ---------- -------
SEEK_SET 0 desde el archivo Inicio al principio del archivo
SEEK_CUR 1 Comienza en la posición actual del puntero del archivo
SEEK_END 2 Comienza al final del archivo
━━━ ━━━━━ ━━━━━━━━━━━━━━━━━━━
El desplazamiento es el número de bytes que el puntero de posición del archivo salta desde la posición inicial especificada ( la posición indicada por fromwhere) Número
. fseek() se utiliza normalmente para operar en
archivos binarios.
Cuando la función fseek() devuelve 0, significa que la operación fue exitosa y un retorno distinto de 0 significa que la operación falló.
El siguiente programa leerá el octavo byte del archivo binario test_b.dat.
Ejemplo 13:
#includelt; stdio.hgt
main()
{
ARCHIVO *fp;
if(((fp=fopen("test_b.dat", "rb"))==NULL)
{
printf( "No se puede abrir el archivo");
exit(1);
}
fseek(fp, 8. 1, SEEK_SET
fgetc(fp);
fclose(fp);
}
La función fread() lee el campo de recuento del archivo (cada uno). El tamaño de los campos es bytes) y los almacena en el búfer señalado por el puntero buf
La función fwrite() contará los campos en bytes en el búfer señalado por el puntero buf
Escriba el archivo señalado por la secuencia
A medida que aumenta el número de bytes leídos y escritos, el indicador de posición del archivo también aumentará. Cuántos bytes se leen, el indicador de posición del archivo.
Además, cuántos bytes se omiten. La función de finalización de lectura/escritura devuelve el número de campos leídos y escritos.
La función ftell() devuelve el valor actual del indicador de posición del archivo. bytes contados hacia arriba desde el principio del archivo. El valor de retorno es un número entero largo. Cuando el valor de retorno es -1, indica un error.
El siguiente programa convierte un número de punto flotante. escrito en binario en el archivo test_b.dat.
Ejemplo 14:
#include lt; stdio.hgt
main()
{
float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
/* Defina la matriz de punto flotante e inicialícela*/
int i ;
ARCHIVO *fp;
fp=fopen("test_b.dat", "wb"); /*Crear un archivo binario de solo escritura*/
fwrite(f, sizeof(float), 6, fp); /*Escribe 6 puntos flotantes en el archivo
fclose(fp) /*Cierra el archivo*/
}
El siguiente ejemplo lee 100 enteros del archivo test_b.dat y los coloca en una matriz de datos.
Ejemplo 15:
#include lt; stdio.hgt
main()
{
ARCHIVO *fp;
int dat[100];
fp=fopen("test_b.dat", "rb"); /* Abrir archivo binario de solo lectura*/ < / p>
if(fread(dat, sizeof(int), 100, fp)!= 100)
/* Determinar si se han leído 100 números*/
{
if(feof(fp))
printf("Fin del archivo" /* Fin del archivo con menos de 100 números */
else
printf("Error de lectura"); /* Error de lectura */
fclose(fp);* Cerrar el archivo */
}
Nota:
Al leer o escribir un archivo utilizando funciones de archivo estándar, el contenido del archivo primero se leerá o escribirá en el búfer,
es decir, el La función de escritura solo opera en el búfer de salida y la función de lectura solo opera en el búfer de entrada. Por ejemplo, para escribir en un archivo
, el contenido escrito primero se colocará en el búfer de salida hasta que el búfer de salida esté lleno o
el archivo se cierre usando fclose() función, y el contenido del búfer se escribirá en el archivo. Si no utiliza la función fclose()
, el contenido del búfer no se escribirá en el archivo o el contenido del archivo escrito estará incompleto. Hay un búfer
La función de actualización fflush(), su formato de llamada es el siguiente:
int fflush(FILE *stream
Esta función en realidad; voluntad El contenido del búfer de salida se escribe en el archivo y el contenido del búfer de entrada se vacía.
4. Funciones feof() y rewind()
El formato de llamada de estas dos funciones es el siguiente:
int feof(FILE *stream);
p>
int rewind(FILE *stream);
La función feof() detecta si el indicador de posición del archivo ha llegado al final del archivo; de ser así, lo indica. no será utilizado.
Si se ha llegado al final del archivo, devuelve un valor distinto de cero
; de lo contrario, devuelve 0. Esta función es particularmente útil para operaciones con archivos binarios, porque en archivos binarios, el indicador de fin de archivo EOF es un número binario legal y simplemente verifica el valor del carácter leído para determinar si el archivo
es el El final del archivo no funcionará. Si este es el caso, puede resultar en que el archivo no se finalice sino que se considere finalizado, por lo que
entonces la función feof() es necesaria.
La siguiente declaración es un método común para determinar si el archivo ha finalizado.
while(!feof(fp))
fgetc(fp);
while es un bucle, como se describe a continuación.
La función rewind() mueve el indicador de posición del archivo al principio del archivo, devolviendo 0 si tiene éxito; de lo contrario, un valor distinto de cero.