Archivo de texto C. Trabajar con archivos en lenguaje C

Ya hemos aprendido cómo escribir información en un archivo de texto. – Si no has aprendido cómo, consulta el artículo anterior. Está contado y descrito detalladamente.

Pero, ¿qué pasa si el archivo ya existe y necesitamos leer información del mismo para procesarlo? Afortunadamente, esto también es bastante sencillo. Permítanme recordarles que existen varias opciones para implementar esta tarea; he descrito solo una de ellas. El descrito es el que por alguna razón me parece personalmente más fácil de entender.

#incluir

int principal()
{
carácter s1 //La variable leerá la cadena.
ifstream en (“C:\\\FromC\\myfile.txt”); //Abra el archivo para leer la información.
en >>s1 ; //lee la linea
en.cerrar() // Cerrando el archivo

corte<Salida del valor s1 a la pantalla
devolver 0;
}

Aquí está el programa más simple para leer la primera línea de un archivo de texto ubicado a lo largo de la ruta
C:\\\DesdeC\\miarchivo.txt –
Como esta es una continuación del artículo anterior, decidí usar el archivo que creamos allí. Probablemente no debería haber ninguna dificultad con esto.
Pero volvamos al código. Primero abrimos el archivo para leer información del mismo, para ello usamos el comando si corriente entre paréntesis indicamos el nombre del archivo o la ruta al archivo, como hice yo. (“C:\\\DesdeC\\miarchivo.txt”);
Cuando abrimos un archivo para leer algo de él, declaramos una variable como carbón –
personaje s1
Ahora todo lo que tenemos que hacer es asignarle a la variable el valor de la cadena del archivo. Hacemos esto como un equipo en
Preste atención a los soportes angulares. en >>
En realidad, como se puede ver en los comentarios al código del programa, para que la variable asigne el valor leído, debemos escribirlo después en >>
en >>s1 ;

Esta no parece ser una tarea particularmente difícil, especialmente si ya domina y ha aprendido a usar perfectamente el material del artículo anterior; todo es absolutamente igual, solo 2 comandos son diferentes.

Crear un archivo y escribir información de C++ en él

ofstream afuera ( Nombre del archivo );
afuera<< (Cadena a escribir);
afuera.cerca();
=============================

Leer texto de un archivo e imprimir texto en la pantalla en C++

si corriente en (Nombre del archivo );
en>> (leyendo la linea);
en.cerca();(Cerrar el archivo)
============================
Escribamos un programa simple que lea la entrada de texto desde el teclado y lo escriba en un archivo:

#incluir
#incluir

int principal()
{
\\ 3 líneas futuras
clrscsr(); // Limpiando la pantalla

corte<<“Wwedi pervuu stroku” ; cin >>a ; fin;
corte<<“Wwedi wtoruu stroku” ; cin >>b ; fin;
corte<<“Wwedi tretuu stroku” ; cin >>c ; fin;
clrscr(); //

/*Empezar a trabajar con el archivo*/
ofstream out (“C:\\\FromC\\myfile.txt”); //Abrir un archivo para escribir
afuera<Escribe la primera línea.
afuera<Escribe la segunda línea
afuera<Escribe la tercera línea.
fuera.cerrar(); // Cerrando el archivo

//Restablecer variables a cero

para (int i =0 ;i<=255 ;i ++)
(a =*“”; b =*“”; c =*“”;)


si fluye en (“C:\\\DesdeC\\miarchivo.txt” );
en >>a >>b >>c ; //Leemos cada nueva línea en una nueva variable.
cercar(); // Cerrando el archivo

/* */

para (i =0 ;a !=*“” ;i ++)
{
si (i > tamaño de (a)) romper ;
corte<

}
corte<<“\n” ; \\

/* */


{
si (i > tamaño de (b)) romper ;
corte<
}
corte<<“\n” ; \\ Movió el cursor a una nueva línea.

/* */

para (i =0 ;с !=*“” ;i ++)
{
si (i > tamaño de (c)) romper ;
corte<<с ;
}

devolver 0;
}
===================

En los ejemplos anteriores hay uno de esos ENORME defecto. Si intentamos ingresar una línea que contiene espacios, el programa no funcionará como necesitamos. Probablemente, no solo yo, sino muchas otras personas nos encontramos con este error. Por eso, te dejo el código incorrecto para que veas lo que te puedes encontrar.

Como no hay libros en casa, comencé nuevamente a buscar en Internet y encontré muchas tonterías sofisticadas de todo tipo. Pero de alguna manera encontré una solución a mi problema.
Me ayudó haber leído eso. corte apoya sus métodos. Y en Internet todos los consejos van dirigidos a utilizar la función. obtener línea Por suerte para mí, descubrí cómo utilizar esta función muy rápidamente y luego la usé en el código.
En general, vale la pena mencionar y describir esta función, pero hasta ahora no la entiendo realmente, solo entiendo que se debe usar y entiendo cómo, así que daré un ejemplo más correcto de nuestro programa en desarrollo. :

#incluir
#incluir

int principal()
{
carácter a,b,c; \\ 3 líneas futuras
clrscsr(); // Limpiando la pantalla

/* Introducir valores para las variables*/

corte<<“Wwedi pervuu stroku” ; cin.getline(a,tamañode(a)); fin;
corte<<“Wwedi wtoruu stroku” ; cin.getline(a,tamañode(b)); fin;
corte<<“Wwedi tretuu stroku” ; cin.getline(a,tamañode(c)); fin;
clrscr(); //Después de ingresar los valores, la pantalla se borró.

/*Empezar a trabajar con el archivo*/
ofstream out (“C:\\\FromC\\myfile.txt”); // Abrir un archivo para escribir
afuera<
Escribe la primera línea.
afuera<Escribe la segunda línea
afuera<Escribe la tercera línea.
fuera.cerrar(); // Cerrando el archivo

//Restablecer variables a cero

para (int i =0 ;i<=255 ;i ++)
(a =*“”; b =*“”; c=*“”;)

/*Continuar trabajando con el archivo*/

si transmite en (“C:\\\DesdeC\\miarchivo.txt” );
in.getline(a,tamañode(a));// A
in.getline(b,tamañode(b));// Leer una línea en una variable b
in.getline(c,tamañode(c)); // Leer una línea en una variable C
cercar(); // Cerrando el archivo

/* Leemos la primera línea carácter a carácter y la mostramos en pantalla. */

para (i =0 ;a !=*“” ;i++)
{
si (i > tamaño de (a)) romper ;
corte<

}
corte<<“\n” ; \\ Movió el cursor a una nueva línea.

/* Leemos la segunda línea carácter a carácter y la mostramos en la pantalla. */

para (i =0 ;b !=*“” ;i ++)
{
si (i > tamaño de (b)) romper ;
corte<
}
corte<<“\n” ; \\ Movió el cursor a una nueva línea.

/* Leemos la tercera línea carácter a carácter y la mostramos en la pantalla. */

para (i =0 ;с !=*“” ;i++)
{
si (i>tamañode (c )) romper ;
corte<<с[i];
}

obtener(); \\Esperando a que se presione la tecla Enter
devolver 0;
}
===================

Este material describe un ejemplo de lectura de información carácter por carácter. Como no describí trabajar con variables como carbonizarse, los principiantes pueden experimentar algunos inconvenientes al comprender el código. Simplemente no sabía de qué tipo carbonizarse Tiene algunas peculiaridades y pensé que todo era más sencillo. Por tanto, algunos puntos incomprensibles del programa anterior se pueden leer en el siguiente artículo. trabajando con carbón V C++ para principiantes

De lo contrario, el ejemplo dado de cómo leer líneas de un archivo de texto en C++ debería ser accesible y bastante comprensible. Esta no es la opción de implementación óptima en este momento y me perdí algunos puntos importantes, pero como estamos empezando a aprender el lenguaje C++, esto es suficiente por ahora. Más adelante probablemente llegaré a lo que me perdí, pero ahora necesito percibir sólo lo más necesario.

Si usted y yo entendemos este material, significa que hemos dado un pequeño paso hacia nuestro profesionalismo.

Nota:
romper ;– Este es el comando que sale del bucle. Tenemos si el contador de ciclos. para se vuelve más grande que el tamaño declarado de la variable carbonizarse, luego salimos con fuerza del bucle
!= – Esta es la condición que ponemos. Esta condición se denota por la desigualdad.
si(a!=b)– Se lee como si a no es igual b

fin; – Esto es para mover el cursor a una nueva línea dentro de la consola (hasta donde tengo entendido)
Este comando es similar a "\norte"

Para el programador, un archivo abierto se representa como una secuencia de datos que se leen o escriben. Cuando se abre un archivo, se asocia con flujo de E/S . La información de salida se escribe en la secuencia, la información de entrada se lee de la secuencia.

Cuando se abre una secuencia para E/S, se asocia con una estructura de ARCHIVO estándar, que se define en stdio.h. La estructura ARCHIVO contiene la información necesaria sobre el archivo.

La apertura de un archivo se realiza mediante la función fopen(), que devuelve un puntero a una estructura de tipo ARCHIVO que se puede utilizar para operaciones posteriores en el archivo.

ARCHIVO *fopen(nombre, tipo);

nombre: nombre del archivo a abrir (incluida la ruta),
tipo: puntero a una cadena de caracteres que define cómo se accede al archivo:

· "r" - abre el archivo para leerlo (el archivo debe existir);

· "w" - abre un archivo vacío para escribir; si el archivo existe, su contenido se pierde;

· "a" - abre el archivo para escribirlo hasta el final (para agregarlo); el archivo se crea si no existe;

· "r+" - abre el archivo para lectura y escritura (el archivo debe existir);

· "w+" - abre un archivo vacío para lectura y escritura; si el archivo existe, su contenido se pierde;

· "a+" - abre el archivo para leerlo y agregarlo; si el archivo no existe, se crea.

El valor de retorno es un puntero a la secuencia abierta. Si se detecta un error, se devuelve NULL.

La función fclose() cierra la secuencia o secuencias asociadas con los archivos abiertos usando la función fopen(). La secuencia que se cerrará está determinada por el argumento de la función fclose().

Valor de retorno: valor 0 si la transmisión se cerró correctamente; EOF constante si ocurre un error.

#incluir
int principal()

nombre char="mi.txt";

si(fp = fopen(nombre, "r")!=NULL)

// ¿fue posible abrir el archivo?
... // acciones requeridas sobre los datos

else printf("Error al abrir el archivo");

Leer un carácter de un archivo:

char fgetc(corriente);

El argumento de la función es un puntero a una secuencia de tipo ARCHIVO. La función devuelve el código del carácter leído. Si se llega al final del archivo o se produce un error, se devuelve la constante EOF.
Escribir un símbolo en un archivo:

fputc(char, flujo);

Los argumentos de la función son un carácter y un puntero a una secuencia de tipo ARCHIVO. La función devuelve el código del carácter leído.

Las funciones fscanf() y fprintf() son similares a las funciones scanf() y printf(), pero funcionan con archivos de datos y tienen un puntero al archivo como primer argumento.

fscanf(flujo, "Formato de entrada", argumentos);
fprintf(flujo, "Formato de salida", argumentos);

Las funciones fgets() y fputs() están diseñadas para entrada/salida de cadenas y son análogas a las funciones get() y puts() para trabajar con archivos.

fgets(Puntero a línea, número de caracteres, secuencia);

Los caracteres se leen de la secuencia hasta que se lee un carácter de nueva línea "\n", que está incluido en la cadena, o hasta que la secuencia finaliza EOF o se ha leído el número máximo de caracteres. El resultado se coloca en un puntero de cadena y termina con el carácter nulo "\0". La función devuelve la dirección de la cadena.

fputs(Puntero a cadena, secuencia);

Copia una cadena a la secuencia desde la posición actual. El carácter nulo final no se copia.
Ejemplo Ingrese el número y guárdelo en el archivo s1.txt. Lea el número del archivo s1.txt, increméntelo en 3 y guárdelo en el archivo s2.txt.

Trabajar con archivos de texto en C++.

Hay dos tipos principales de archivos: de texto y binarios. Los archivos permiten al usuario leer grandes cantidades de datos directamente desde el disco sin tener que ingresarlos desde el teclado.

    Texto Se llaman archivos que constan de cualquier carácter. Están organizados en líneas y cada una termina con un carácter de fin de línea. El final del archivo en sí se indica con el símbolo de "fin de archivo". Al escribir información en un archivo de texto, que se puede ver con cualquier editor de texto, todos los datos se convierten a un tipo de carácter y se almacenan en forma de caracteres.

    EN binario En los archivos la información se lee y escribe en forma de bloques de un determinado tamaño, en los que se pueden almacenar datos de cualquier tipo y estructura.

Para trabajar con archivos, especiales. tipos de datos, llamado corrientes. Fluir si corriente se utiliza para trabajar con archivos en modo lectura, y ofstream en modo de grabación. Para trabajar con archivos tanto en modo de escritura como de lectura, se utiliza una secuencia fstream.

En programas C++, cuando se trabaja con archivos de texto, se deben incluir las bibliotecas iostream y fstream.

Con el fin de anote datos a un archivo de texto, necesita:

    describir una variable de tipo de flujo.

    enviar información a un archivo.

    asegúrese de cerrar el archivo.

Para lectura datos de un archivo de texto, necesita:

    describir una variable de tipo ifstream.

    abra un archivo usando la función abrir.

    cerrar el archivo.

Registro información a un archivo de texto

    Como se mencionó anteriormente, para comenzar a trabajar con un archivo de texto, debe definir una variable de tipo flujo. Por ejemplo, así:

    Se creará una variable F para escribir información en el archivo.

    En la siguiente etapa, el expediente debe abrirse para su escritura. En general, el operador de apertura de flujo tendrá el siguiente aspecto:

F.open("archivo", modo);

Aquí F es una variable descrita como ofstream,

archivo: nombre completo del archivo en el disco,

modo: modo de trabajar con el archivo que se está abriendo.

Tenga en cuenta que al especificar el nombre completo del archivo, debe utilizar una doble barra. Por ejemplo, el nombre completo del archivo noobs.txt, ubicado en la carpeta del juego en la unidad D:, deberá escribirse así:

D:\\juego\\noobs.txt.

El archivo se puede abrir en uno de los siguientes modos:

ios::in: abre el archivo en modo de lectura de datos, este modo es el modo predeterminado para ifstreams;

ios::out: abre un archivo en modo de escritura de datos (en este caso, se destruye la información sobre el archivo existente), este modo es el modo predeterminado para ofstreams;

ios::app: abre el archivo en el modo de escritura de datos hasta el final del archivo;

ios::ate: va al final de un archivo ya abierto;

ios::trunc - borra el archivo, esto también sucede en el modo ios::out;

ios::nocreate - no abre un archivo si no existe;

ios::noreplace: no abre un archivo existente.

Es posible que el parámetro de modo esté ausente, en cuyo caso el archivo se abre en el modo predeterminado para esta secuencia.

Después de abrir exitosamente el archivo (en cualquier modo), la variable F almacenará verdadero; de lo contrario, será falso. Esto le permitirá comprobar la exactitud de la operación de apertura del archivo.

Puedes abrir un archivo (tomemos el archivo D:\\game\\noobs.txt como ejemplo) en modo de grabación de una de las siguientes maneras:

// primero forma

de la corriente F;

F.open("D:\\juego\\noobs.txt", ios::out);

//segundo método, el modo ios::out es el modo predeterminado

// Para fluirofstream

de la corriente F;

//el tercer método combina la descripción de la variable y el tipo de flujo

//y abriendo el archivo en una sola declaración

ofstream F("D:\\juego\\noobs.txt", ios::out);

Después de abrir un archivo en modo de escritura, se creará un archivo vacío en el que podrá escribir información.

Si desea abrir un archivo existente en modo de escritura anterior, debe usar ios::app como modo.

Después de abrir un archivo en modo de grabación, puede escribir en él de la misma manera que en la pantalla, solo que en lugar del dispositivo de salida estándarcortedebe especificar el nombre del archivo abierto.

Por ejemplo, para escribir la variable a en el flujo F, la declaración de salida tendrá el siguiente aspecto:

Para la salida secuencial al flujo G de las variables b, c, d, el operador de salida será así:

GRAMO<

El cierre de una secuencia se realiza mediante el operador:

EJEMPLO:

Crea un archivo de texto D:\\game\\noobs.txt y escribe n números reales en él.

#incluir "stdafx.h"

#incluir

#incluir

#incluir

usando el espacio de nombres estándar;

int principal()

setlocale(LC_ALL, "RUS");

int i, n;

doble a;

//describe una secuencia para escribir datos en un archivo

ofstream F;

//abre el archivo en modo escritura,

//modoios:: afuerainstalado por defecto

f.open("D:\\juego\\noobs.txt", ios::out);

//ingresa el número de números reales

corte<<" norte="; cin>> norte;

//bucle para ingresar números reales

//y escribirlos en un archivo

para (i=0; yo

corte<<"a=";

//Ingrese un numero

cin>>a;

F<

//cerrando la transmisión

f.cerrar();

sistema("pausa");

devolver 0;

_______________________________________________________________

Para leer información de un archivo de texto, necesita describir una variable como si corriente. Después de esto, debe abrir el archivo para leerlo usando el operador abierto. Si la variable se llama F, entonces las dos primeras declaraciones serán así:

F.open("D:\\juego\\noobs.txt", ios::in);

Después de abrir un archivo en modo lectura, puede leer información del mismo de la misma manera que desde el teclado, solo que en lugar decinespecifique el nombre de la secuencia desde la cual se leerán los datos.

Por ejemplo, para leer del flujo F a la variable a, la declaración de entrada se vería así:

Dos números en un editor de texto se consideran separados si hay al menos uno de los caracteres entre ellos: espacio, tabulación, final de línea. Es bueno que el programador sepa de antemano cuántos y qué valores almacenar en el archivo de texto. Sin embargo, a menudo el tipo de valores almacenados en el archivo simplemente se conoce, pero su número puede variar. Para resolver este problema, debe leer los valores del archivo uno por uno y, antes de cada lectura, verificar si se ha llegado al final del archivo. Hay una función para esto. F. eof().

Aquí F es el nombre del hilo, la función devuelve un valor booleano: verdadero o falso, dependiendo de si se llega al final del archivo. Por lo tanto, un bucle para leer el contenido de todo el archivo se puede escribir así:

//organizar para leer valores de un archivo, ejecución

//el bucle se romperá cuando lleguemos al final del archivo,

//en este caso F.eof() devolverá verdadero

mientras (!F.eof())

EJEMPLO:

El archivo de texto D:\\game\\noobs.txt almacena números reales, los muestra en la pantalla y calcula su número.

#incluir "stdafx.h"

#incluir

#incluir

#incluir

#incluir

usando el espacio de nombres estándar;

int principal()

setlocale(LC_ALL, "RUS");

entero n=0;

flotar un;

fstream F;

//abre el archivo en modo lectura

F.open("D:\\juego\\noobs.txt");

//si el archivo se abrió correctamente, entonces

//bucle para leer valores de un archivo; la ejecución del bucle se interrumpirá,

//cuando lleguemos al final del archivo, en este caso F.eof() devolverá verdadero.

mientras (!F.eof())

//leyendo el siguiente valor del flujo F en la variable a

F>>a;

//muestra el valor de la variable a en la pantalla

corte<

//aumentar el número de números leídos

//cerrando la transmisión

F.cerrar();

//ingresamos en la pantalla el número de números leídos

corte<<"n="<

//si la apertura del archivo fue incorrecta, entonces la salida

//mensajes sobre la ausencia de dicho archivo

más cout<<" Файл не существует"<

sistema("pausa");

devolver 0;

C++. Procesamiento de archivos binarios

Al escribir información en un archivo binario, los caracteres y números se escriben como una secuencia de bytes.

Con el fin de anote datos a un archivo binario, necesita:

    describir una variable de archivo de tipo FAIL * usando el operador FILE *filename; Aquí nombre de archivo es el nombre de la variable donde se almacenará el puntero al archivo.

    escribir información en un archivo usando la función fwrite

Con el fin de considerar b datos de un archivo binario, debe:

    describir una variable de tipo ARCHIVO *

    abrir un archivo usando la función fopen

    cerrar un archivo usando la función fclose

Funciones básicas necesarias para trabajar con archivos binarios.

Para descubrimientos El archivo está destinado a la función fopen.

ARCHIVO *fopen(const *nombre de archivo, const char *modo)

Aquí nombre de archivo es una cadena que almacena el nombre completo del archivo que se abre, modo es una cadena que determina el modo de trabajar con el archivo; son posibles los siguientes valores:

“rb” - abre el archivo binario en modo lectura;

“wb”: crea un archivo binario para grabar; si existe, se borra su contenido;

“ab”: crea o abre un archivo binario para agregarlo al final del archivo;

“rb+” - abre un archivo binario existente en modo lectura-escritura;

“wb+” - abre el archivo binario en modo lectura-escritura, el archivo existente se borra;

"ab+": se abre o crea un archivo binario para corregir la información existente y agregar nueva información al final del archivo.

La función devuelve NULL en la variable del archivo f si el archivo se abre sin éxito. Después de abrir un archivo, su 0º byte está disponible, el puntero del archivo es 0, cuyo valor, a medida que se lee o escribe, se desplaza según el número de bytes leídos (escritos). El valor actual del puntero del archivo es el número de byte a partir del cual se producirá la operación de lectura o escritura.

Para clausura el archivo está destinado a la función fclose

int fclose(ARCHIVO *nombre de archivo);

Devuelve 0 si el archivo se cerró correctamente, NULL en caso contrario.

La función de eliminación es para eliminación archivos.

int remove(const char *nombre de archivo);

Esta función elimina un archivo llamado filenema del disco. El archivo a eliminar debe estar cerrado. La función devuelve un valor distinto de cero si el archivo no se pudo eliminar.

Para renombrar archivos, la función de cambio de nombre está destinada a:

int rename(const char *nombre de archivo antiguo, const char *nombre de archivo nuevo);

El primer parámetro es el nombre del archivo antiguo, el segundo es el nuevo. Devuelve 0 si el programa termina exitosamente.

Lectura desde un archivo binario se realiza usando la función fread:

fread(void *ptr, tamaño, n, ARCHIVO *nombre de archivo);

La función fread lee n elementos de tamaño del nombre del archivo en una matriz ptr. La función devuelve el número de elementos leídos. Después de leer un archivo, su puntero se desplaza en n*bytes de tamaño.

Registro a un archivo binario se realiza usando la función fwrite:

fwrite(const void *ptr, tamaño, n, ARCHIVO *nombre de archivo);

La función fwrite escribe en el nombre del archivo desde una matriz ptr de n elementos de tamaño. La función devuelve el número de elementos escritos. Después de escribir información en el archivo, el puntero se desplaza n*bytes de tamaño.

Para control de fin de archivo hay una función feof:

int feof(ARCHIVO *nombre de archivo);

Devuelve un valor distinto de cero si se llega al final del archivo.

EJEMPLO:

Cree un archivo binario D:\\game\\noobs.dat y escriba n números enteros y n reales en él.

#incluir "stdafx.h"

#incluir

usando el espacio de nombres estándar;

int principal()

setlocale(LC_ALL, "RUS");

int norte, yo;

doble a;

//crea un archivo binario en modo escritura

f=fopen("D:\\juego\\noobs.dat", "wb");

// aporte númerosnorte

corte<<"n="; cin>>norte;

fwrite(&n, tamaño de(int), 1, f);

//bucle para ingresar n números reales

para (i=0; yo

//ingresa el siguiente número real

corte<<"a=";

cin>>a;

//escribiendo un número real en un archivo binario

fwrite(&a, tamaño de(doble), 1, f);

// cerca archivo

cerrar(f);

sistema("pausa");

devolver 0;

EJEMPLO:

Muestra el contenido del archivo binario D:\\game\\noobs.dat creado en la tarea anterior

#incluir "stdafx.h"

#incluir

usando el espacio de nombres estándar;

int principal()

setlocale(LC_ALL, "RUS");

int norte, yo;

doble a;

ARCHIVO *f; //describe la variable del archivo

//abre el archivo binario existente en modo lectura

//lee un entero del archivo en la variable n

//salida n a la pantalla

corte<<"n="<

//asignando memoria para una matriz de n números

a=nuevo doble[n];

//leer n números reales del archivo en la matriz a

//muestra la matriz a la pantalla

para (i=0; yo

corte<

corte<

// cerca archivo

cerrar(f);

sistema("pausa");

devolver 0;

Archivo binario- estructura de datos secuencial, después de abrir un archivo, el primer byte almacenado en él está disponible. Puede escribir o leer datos de un archivo de forma secuencial. Digamos que necesitas contar el decimoquinto número y luego el primero. Usando el acceso secuencial esto se puede hacer de la siguiente manera:

int norte, yo;

doble a;

ARCHIVO *f;

f=fopen("D:\\juego\\noobs.dat", "rb");

para (i=0; yo<15; i++)

cerrar(f);

f=fopen("D:\\juego\\noobs.dat", "rb");

fread(&a, tamaño de(doble), 1, f);

cerrar(f);

Como puede ver, leer números de un archivo y luego abrirlo nuevamente no es la forma más conveniente. Será mucho más conveniente utilizar la función fseek para mover el puntero del archivo a un byte determinado.

int fseek(ARCHIVO *nombre de archivo, desplazamiento int largo, origen int);

La función establece el puntero de posición del archivo actual F de acuerdo con los valores de origen y desplazamiento. El parámetro de desplazamiento es igual al número de bytes en los que el puntero del archivo se desplazará con respecto al origen especificado por el parámetro de origen. El valor del parámetro de origen debe ser uno de los siguientes valores de desplazamiento definidos en el encabezado stdio.h:

SEEK_SET - desde el principio del archivo;

SEEK_CUR - desde la posición actual;

SEEK_END: ​​desde el final del archivo.

La función devuelve un valor cero si la operación fue exitosa, distinto de cero si ocurrió una falla durante la ejecución del desplazamiento.

La función fseek en realidad implementa el acceso directo a cualquier valor de un archivo. Sólo necesita saber la ubicación (número de byte) del valor en el archivo. Veamos el uso del acceso directo en archivos binarios usando el siguiente problema como ejemplo.

EJEMPLO

En el archivo binario D:\\game\\noobs.dat creado anteriormente, intercambie los números reales más grandes y más pequeños.

El algoritmo para resolver el problema consta de las siguientes etapas:

    leer reales de un archivo en la matriz a.

    busque en la matriz a los valores máximo (max) y mínimo (min) y sus números (imax, imin).

    moviendo el puntero del archivo al valor máximo y escribiendo min.

    moviendo el puntero del archivo al valor mínimo y escribiendo max.

A continuación se muestra el texto del programa para resolver el problema con comentarios.

#incluir "stdafx.h"

#incluir

usando el espacio de nombres estándar;

int principal()

setlocale(LC_ALL, "RUS");

int n, i, imax, imin;

doble *a, máximo, mínimo;

ARCHIVO *f;

//abre un archivo en modo lectura-escritura

f=fopen("D:\\juego\\noobs.dat", "rb+");

//leer el número del archivo a la variable n

//números reales en el archivo

fread(&n, tamaño de(int), 1, f);

corte<<"n="<

//asigna memoria para almacenar números reales,

//que se almacenará en la matriz a

a=nuevo doble[n];

//leer del archivo en matriz y números reales

fread(a, tamaño de(doble), n, f);

//busca elementos máximos y mínimos

//en el array a y sus índices

para (imax=imin=0, max=min=a, i=1; i

si (a[i]>max)

máximo=a[i];

si (un[i]

mín=a[i];

// Moviente puntero A máximo elemento

fseek(f, tamaño de (int)+imax*tamaño de (doble), SEEK_SET);

//escribe el elemento de archivo mínimo en lugar del máximo

fwrite(&min, tamaño de(doble), 1, f);

// Moviente puntero A mínimo elemento

fseek(f, tamaño de (int)+imin*tamaño de (doble), SEEK_SET);

//registro máximo en lugar del elemento de archivo mínimo

fwrite(&max, tamaño de(doble), 1, f);

//cerrando el archivo

cerrar(f);

//memoria libre

borrar [ ]a;

sistema("pausa");

El mecanismo de E/S desarrollado por no se ajusta al estilo generalmente aceptado de programación orientada a objetos en la actualidad; además, utiliza en gran medida operaciones de puntero que se consideran potencialmente inseguras en los entornos modernos de ejecución de código seguro. Una alternativa al desarrollar aplicaciones es el mecanismo de clases de E/S estándar proporcionadas por el estándar del lenguaje C++.

Abrir archivos

Las clases más utilizadas son ifstream para lectura, ofstream para escritura y fstream para modificación de archivos.

Todas las clases de E/S subprocesos se derivan indirectamente del ancestro común ios, heredando completamente su funcionalidad. Por lo tanto, el modo de apertura del archivo lo especifica el miembro de datos del tipo de enumeración open_mode, que se define de la siguiente manera:

Enum open_mode (aplicación, binario, entrada, salida, trunc, comió);

A continuación se muestran los posibles valores de las banderas y su finalidad.

Por ejemplo, para abrir un archivo llamado test.txt para leer datos en formato binario, escribiría:

archivo ifstream; file.open("test.txt", ios::in | ios::binary);

El operador lógico OR (|) le permite crear un modo con cualquier combinación de indicadores. Entonces, para que al abrir un archivo por entrada, no sobrescriba accidentalmente un archivo existente con el mismo nombre, debe utilizar el siguiente formulario:

Archivo ofstream; file.open("prueba.txt", ios::out | ios::app);

Se supone que el archivo de encabezado correspondiente está incluido en el proyecto:

#incluir

Para comprobar si el archivo se abrió correctamente, puede utilizar la construcción

If (!file) ( //Manejo del error de apertura del archivo)

Operadores de inclusión y extracción.

Anulado en clases de manejo de archivos operador de inclusión (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

Archivo<< "Это строка текста";

También puedes escribir una cadena de texto en partes:

Archivo<< "Это " << "строка " << "текста";

La instrucción endl finaliza la línea de entrada con un retorno de carro:

Archivo<< "Это строка текста" << endl;

Usando el operador de inclusión, es fácil escribir los valores de variables o elementos de una matriz en un archivo:

Archivo ofstream ("Temp.txt"); char buff = "La matriz de texto contiene variables"; intvx = 100; flotador pi = 3,14159; archivo<< buff << endl << vx << endl << pi << endl;

Como resultado de ejecutar el código, se forman tres líneas del archivo de texto Temp.txt:

La matriz de texto contiene variables 100 3.14159

Tenga en cuenta que los valores numéricos se escriben en el archivo como cadenas de texto en lugar de valores binarios.

Operador de recuperación(>>) produce el efecto contrario. Parecería que para extraer caracteres del archivo Temp.txt escrito anteriormente, escribirías un código como el siguiente:

Archivo Ifstream ("Temp.txt"); aficionado al carbón; intvx; pi flotante; archivo >> buff >> vx >> pi;

Sin embargo, el operador de extracción se detendrá en el primer delimitador que encuentre (espacio, tabulación o nueva línea). Por lo tanto, al analizar la oración "La matriz de texto contiene variables", solo la palabra "Texto" se escribirá en la matriz de mejora, el espacio se ignora y la palabra "matriz" se convertirá en el valor de toda la variable vx y el código la ejecución “saldrá mal” con una inevitable violación de la estructura de datos. A continuación, cuando analicemos la clase ifstream, mostraremos cómo organizar adecuadamente la lectura del archivo del ejemplo anterior.

clase ifstream: leer archivos

Como sugiere el nombre, la clase ifstream está diseñada para ingresar una secuencia de archivos. Los principales métodos de la clase se enumeran a continuación. La mayoría de ellos se heredan de la clase istream y se sobrecargan para ampliar la funcionalidad principal. Por ejemplo, la función get, dependiendo del parámetro de llamada, puede leer no solo un carácter, sino también un bloque de caracteres.

Ahora está claro cómo se debe modificar el ejemplo anterior para que el uso del operador de extracción de datos dé el resultado esperado:

Archivo Ifstream ("Temp.txt"); aficionado al carbón; intvx; pi flotante; file.getline(buff, tamaño de(buff)); archivo >> vx >> pi:

El método getline leerá la primera línea del archivo hasta el final y el operador >> asignará valores a las variables.

El siguiente ejemplo muestra cómo agregar datos a un archivo de texto y luego leer el archivo completo. Se utiliza un bucle while(1) en lugar de while(!file2.eof()) por los motivos que se analizan en .

#incluir #incluir usando el espacio de nombres estándar; int main() ( archivo ofstream; file.open("test.txt",ios::out|ios::app); if (!file) ( cout<< "File error - can"t open to write data!"; cin.sync(); cin.get(); return 1; } for (int i=0; i<10; i++) file << i << endl; file.close(); ifstream file2; file2.open("test.txt", ios::in); if (!file2) { cout << "File error - can"t open to read data!"; cin.sync(); cin.get(); return 2; } int a,k=0; while (1) { file2 >> un; si (file2.eof()) se rompe; corte<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

El siguiente ejemplo muestra un bucle que lee líneas del archivo test.txt y las muestra en la consola.

#incluir #incluir usando el espacio de nombres estándar; int main() ( ifstream file; // crea un archivo objeto de flujo file.open("test.txt"); // abre el archivo para leer if (!file) return 1; // regresa al abrir el error char str; // buffer de línea estática // Lee y muestra líneas en un bucle hasta eof while (!file.getline(str, sizeof(str)).eof()) cout<< str << endl; // вывод прочитанной строки на экран cin.sync(); cin.get(); return 0; }

Este código en el sistema operativo Windows también depende de la presencia de un carácter de nueva línea en la última línea del archivo; sería más confiable hacer esto:

Mientras que (1) ( if (file.eof()) break; file.getline(str, sizeof(str)); cout<< str << endl; }

No se requieren llamadas explícitas a los métodos de apertura y cierre. De hecho, llamar al constructor con un argumento le permite abrir el archivo inmediatamente, en el momento de crear el objeto de archivo subproceso:

Archivo Ifstream("test.txt");

En lugar del método de cierre, puede utilizar el operador de eliminación, que llamará automáticamente al destructor del objeto de archivo y cerrará el archivo. El código del bucle while garantiza comprobaciones adecuadas al final del archivo.

clase ofstream: escribir archivos

La clase ofstream está diseñada para generar datos desde una secuencia de archivos. A continuación se enumeran los principales métodos de esta clase.

El operador de inclusión descrito anteriormente es conveniente para organizar la escritura en un archivo de texto:

Archivo ofstream ("temp.txt"); si (!archivo) regresa; para (int i=1; i<=3; i++) file << "Строка " << i << endl; file.close();

Archivos binarios

En principio, los datos binarios se tratan como datos de texto. La diferencia es que si los datos binarios se escriben en una estructura lógica específica, entonces se deben leer desde un archivo en una variable del mismo tipo de estructura.

El primer parámetro de los métodos de escritura y lectura (la dirección del bloque de escritura/lectura) debe ser del tipo de puntero de carácter char *, por lo que es necesario realizar una conversión explícita del tipo de dirección de la estructura void *. El segundo parámetro especifica que los bloques binarios del archivo tienen un tamaño de bytes constante independientemente de la longitud real del registro. La siguiente aplicación proporciona un ejemplo de creación y visualización de datos en un cuaderno simple. Luego, las entradas del archivo se leen secuencialmente y se muestran en la consola.

#incluir #incluir #incluir usando el espacio de nombres estándar; struct Notes ( // estructura de datos del cuaderno char Nombre; // nombre completo char Teléfono; // teléfono int Edad; // edad ); int main() ( setlocale(LC_ALL, "ruso"); Notas Nota1= ("El terrible Ioann Vasilyevich", "no instalado", 60 ); Notas Nota2= ("Godunov Boris Fedorovich", "095-111-2233" , 30 ); Notas Note3= ("Romanov Petr Mikhailovich", "812-333-2211", 20 ); ofstream ofile("Notebook.dat", ios::binary.write((char*)&Note1, sizeof (Notas)); // 1er bloque de file.write((char*)&Note2, sizeof(Notes)); // 2do bloque de file.write((char*)&Note3, sizeof(Notes)); .close(); // cierra el archivo grabado ifstream ifile("Notebook.dat", ios::binary); // variable estructurada char str // buffer de cadena estática // Lee y muestra líneas en un bucle hasta eof while; (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tPhone: %s\tEdad: %d" , Note.Name, Note.Phone, Nota.Edad);<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

Como resultado de la ejecución de este código, se forma un archivo binario Notebook.dat a partir de tres bloques de 80 bytes cada uno (suponiendo que los caracteres sean de un solo byte). Naturalmente, puede utilizar otros métodos de subprocesamiento y realizar cualquier operación en los campos de una estructura de datos específica.

clase fstream: acceso aleatorio a archivos

Supongamos que tenemos 100 entradas en nuestro cuaderno y queremos contar la número 50. Por supuesto, puede organizar un bucle y leer todos los registros desde el primero hasta el indicado. Obviamente, una solución más específica es configurar el puntero de posición del archivo pos directamente en la entrada 50 y leer desde allí:

Ifstream ifile("Notebook.dat", ios::binary); int pos = 49 * tamaño de (Notas); ifile.seekg(pos); // busca la nota número 50; //Notas – la estructura de “registro” descrita anteriormente ifile.read((char*)&Note, sizeof(Notes));

Estas operaciones de búsqueda son eficaces si el archivo consta de registros de tamaño conocido y constante. Para reemplazar el contenido de un registro arbitrario, debe abrir el flujo de salida en modo de modificación:

Ofstream ofile ("Notebook.dat", ios::binary | ios::ate); int pos = 49 * tamaño de (Notas); búsqueda ofile(pos); // busca la entrada número 50 Notas Note50 = ("Yeltsin Boris Nikolaevich", "095-222-3322", 64); ofile.write((char*)&Nota, tamaño de(Notas)); // reemplazo

Si no especifica el indicador ios::ate (o ios::app), cuando abra el archivo binario Notebook.dat, ¡su contenido anterior se borrará!

Finalmente, es posible abrir un archivo simultáneamente para lectura/escritura, utilizando los métodos heredados por la clase de streaming fstream de sus predecesores. Dado que la clase fstream se deriva de istream y ostream (padres de ifstream y ofstream respectivamente), todos los métodos mencionados anteriormente están disponibles en la aplicación.

El siguiente ejemplo muestra la reorganización de la primera y tercera entrada en el archivo Notebook.dat.

#incluir #incluir #incluir usando el espacio de nombres estándar; Notas de estructura (char Nombre; char Teléfono; int Edad;); int main() ( setlocale(LC_ALL, "Russian"); Notes Note1, Note3; // Abre el archivo para leer/escribir simultáneamente fstream file("Notebook.dat", ios::binary | ios::in | ios: : out); file.seekg(2 * sizeof(Notes)); // busca y lee el archivo Note3.read((char*)&Note3, sizeof(Notes)); // busca y lee el archivo Note1.read((char). *)&Nota1, tamaño de(Notas)); file.seekg(0);<== Note3 file.write((char*)&Note3, sizeof(Notes)); file.seekg(2 * sizeof(Notes)); // Note3 <== Note1 file.write((char*)&Note1, sizeof(Notes)); char str; // Считывать и отображать записи в цикле, пока не eof file.seekg(0); // вернуться к началу файла while (!file.read((char*)&Note1, sizeof(Notes)).eof()) { sprintf(str, "%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age); cout << str << endl; } file.close(); cin.sync(); cin.get(); return 0; }

En el constructor del objeto de archivo, debe especificar los indicadores ios::in y ios::out, lo que permite operaciones simultáneas de lectura y escritura. Como resultado de la ejecución de este código, se intercambiarán la primera y la tercera entrada del archivo binario Notebook.dat.

Hay ejemplos adicionales sobre el tema.

Archivos de texto

Veamos cómo trabajar con un archivo de texto en C usando un ejemplo. Cree un archivo de texto en la unidad C llamado TextFile.txt. Escriba las siguientes líneas en este archivo:

Cadena_1 123 Cadena_11, 456
Cadena_2
Cadena_3

Guarda el archivo.

Y este es el código de un programa en C que abre nuestro archivo y lee líneas del mismo:

/* *Autor: @autor Subbotin B.P..h> #include #define LEN 50 int main(void) ( puts("Operaciones de archivos de texto"); char cArray; ARCHIVO *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( puts("Problemas"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile) return EXIT_SUCCESS;

Para abrir un archivo de texto en C, use la función fopen:

ARCHIVO *pTextFile = fopen("C:\\TextFile.txt", "r");

El primer argumento de la función fopen apunta a un archivo y el segundo dice que el archivo está abierto para leerlo.

Leemos las líneas usando la función fgets:

fgets(cArray, LEN, pTextFile);

El primer argumento de la función fgets apunta a una matriz de caracteres en la que se almacenarán las cadenas recibidas, el segundo argumento es el número máximo de caracteres a leer y el tercero es nuestro archivo.

Después de terminar de trabajar con el archivo, debes cerrarlo:

fclose(pTextFile);

Obtenemos:

También aparecen letras rusas en las líneas.

Por cierto, hice este programa en Eclipse. Puedes ver cómo trabajar con C/C++ en Eclipse.

Entonces, abrimos y leímos datos de un archivo de texto.

Ahora aprenderemos cómo crear mediante programación un archivo de texto y escribir datos en él.

/* Autor: @author Subbotin B.P..h> #include int main(void) ( ARCHIVO *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Esto es una cadena"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) ( puts("Problemas"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine);

Cree un archivo de texto para escribir datos en:

ARCHIVO *pTextFile = fopen("C:\\TextFileW.txt", "w");

si el archivo ya existe, se abrirá y se eliminarán todos los datos que contiene.

El programa escribe la cadena C cString y el número nVal en un archivo de texto. cNewLine es simplemente una nueva línea.

Escribimos datos en un archivo de texto usando la función fprintf:

fprintf(pTextFile, "%s%c", cString, cNewLine);

El primer argumento aquí es nuestro archivo, el segundo es la cadena de formato, el tercero o más es el número de argumentos necesarios para este formato.




Arriba