Programación VC, ¿cómo leer datos de archivos?
En C, hay una clase de flujo. Todas las E/S se basan en esta clase de "flujo", incluida la E/S del archivo que necesitamos saber. La clase de flujo tiene dos operadores importantes:
1. Inserter (lt; lt;)
Envía datos a la secuencia. Por ejemplo, el sistema tiene un flujo de salida estándar predeterminado (cout), que generalmente se refiere al monitor. Por lo tanto, cout<"Write Stdout"<"\n'" significa la cadena "Write Stdout" y caracteres de nueva línea ('\n. ') al flujo de salida estándar.
2. Extractor (gt; gt;)
Ingrese datos de la secuencia. Por ejemplo, el sistema tiene un flujo de entrada estándar (cin), que generalmente se refiere al teclado. Por lo tanto, cingt significa leer un tipo específico (es decir, el tipo de variable x) del flujo de entrada estándar; . datos.
En C, las operaciones de archivos se implementan a través de la subclase de flujo fstream (flujo de archivos). Por lo tanto, si desea operar archivos de esta manera, debe agregar el archivo de encabezado fstream.h. Repasemos el proceso de operación de archivos de este tipo uno por uno.
1. Abrir archivos
En la clase fstream, hay una función miembro open(), que se utiliza para abrir archivos. Su prototipo es:
. void open(const char* nombre de archivo, modo int, acceso int)
Parámetros:
nombre de archivo: el nombre del archivo que se va a abrir
modo: el archivo a abrir Método
Acceso: Atributos de apertura de archivos
El método de apertura de archivos se define en la clase ios (que es la clase base de todas las clases de E/S de streaming ). Los valores comúnmente utilizados son los siguientes:
ios::app: abre el archivo agregando
ios::ate: después de abrir el archivo, se muestra. colocado al final del archivo. ios:app contiene este atributo
ios::binary: abre el archivo en modo binario. El modo predeterminado es el modo texto. La diferencia entre los dos métodos es la mencionada anteriormente
ios::in: el archivo se abre en modo de entrada
ios::out: el archivo se abre en modo de salida
ios::out: el archivo se abre en modo de salida p>
ios: :nocreate: No crea el archivo, por lo que la apertura falla si el archivo no existe
ios::noreplace: No sobrescribe el archivo, por lo que la apertura del archivo falla si el el archivo existe
ios::trunc: si el archivo existe, establezca la longitud del archivo en 0
Puede usar "o" para conectar los atributos anteriores, como ios::out |ios::binary
Se toman los atributos del archivo abierto. Los valores son:
0: Archivo normal, abierto para acceso
1: Archivo de solo lectura
2: Archivo oculto
4: Archivos del sistema
Puede utilizar "o" o " " para conectar los atributos anteriores, como 3 o 1|2 para abrir el archivo con atributos implícitos y de solo lectura.
Por ejemplo: abra el archivo c:\config.sys en modo de entrada binaria
fstream file1
file1.open("c:\\config .sys ", ios::binary|ios::in, 0);
Si la función de apertura tiene solo un parámetro, el nombre del archivo, se abre para leer/escribir archivos normales, es decir:
file1.open("c:\\config.sys");lt;=gt;file1.open("c:\\config.sys",ios::in|ios::out ,0);
Además, fstream tiene el mismo constructor que open(). Para el ejemplo anterior, el archivo se puede abrir cuando está definido:
fstream file1(" c:\\config. sys");
Específicamente, fstream tiene dos subclases: ifstream (flujo de archivos de entrada) y ofstream (flujo de archivos de salida). Ifstream abre archivos en modo de entrada de forma predeterminada, mientras que ofstream abre archivos en modo de salida de forma predeterminada. Abra el archivo.
ifstream file2("c:\\pdos.def"); //Abre el archivo en modo de entrada
ofstream file3("c:\\x.123"); //Abra el archivo en modo de salida
Por lo tanto, en las aplicaciones reales, elija diferentes clases para definir según las diferentes necesidades: si desea abrirlo en modo de entrada, use ifstream para definirlo; para abrirlo en modo de salida Para abrir, use ofstream para definir si desea abrir en modo de entrada/salida, use fstream para definir;
2. Cerrar el archivo
El archivo abierto debe cerrarse después de su uso. fstream proporciona la función miembro close() para completar esta operación, como por ejemplo: file1.close(); Cierre el archivo conectado al archivo1.
3. Leer y escribir archivos
Leer y escribir archivos se divide en archivos de texto y archivos binarios. Leer archivos de texto es relativamente simple, solo use insertadores y extractores. para la lectura binaria, es un poco más complicado. Estos dos métodos se presentarán en detalle a continuación
1. Lectura y escritura de archivos de texto
Lectura y escritura de archivos de texto Es simple: use el insertador (lt;lt;) para enviar al archivo; use el extractor (gt;gt;) para ingresar desde el archivo. Supongamos que el archivo1 se abre como entrada y el archivo2 se abre como salida. Un ejemplo es el siguiente:
file2lt;lt;"I Love You";//Escribe la cadena "I Love You" en el archivo
int
file1gt;gt;i; //Ingrese un valor entero del archivo.
Este método también tiene una capacidad de formato simple, por ejemplo, puede especificar la salida como hexadecimal, etc. Los formatos específicos son los siguientes
Entrada/salida de la función del manipulador
dec formatea la entrada y salida de datos numéricos decimales
endl genera un carácter de nueva línea y actualiza esta salida de flujo
ends genera un carácter nulo
hexadecimal Formateado como entrada y salida de datos numéricos hexadecimales
oct Formateado como entrada y salida de datos numéricos octales
setpxecision(int p) Establece la precisión de los números de coma flotante Salida de dígitos
Por ejemplo, para generar 123 como hexadecimal: file1lt;lt;lt;123; para generar 3.1415926 con precisión de 5 dígitos: FILE1lt;lt;lt;3.1415926.
2. Lectura y escritura de archivos binarios
①put()
La función put() escribe un carácter en la secuencia y su prototipo es ofstream amp ; put( char ch), es relativamente sencillo de usar, como file1.put('c');
②get()
La función get() es más flexible y tiene tres formas sobrecargadas de uso común:
Una es la forma correspondiente a put() : ifstream amp; get(char amp; ch); La función es leer un carácter de la secuencia y el resultado se guarda en el canal de referencia. Si se llega al final del archivo, se devuelve un carácter nulo. Por ejemplo, file2.get(x); significa leer un carácter del archivo y guardar el carácter leído en x.
El prototipo de otro formulario sobrecargado es: int get(); este formulario devuelve un carácter de la secuencia. Si se llega al final del archivo, se devuelve EOF, como x=file2.get(. ); La función es la misma que en el ejemplo anterior.
Hay otra forma de prototipo: ifstream & get(char *buf, int num, char delim='\n'); esta forma lee caracteres en la matriz señalada por buf hasta que se leen Num caracteres; en o se encuentra el carácter especificado por delim. Si no se utiliza el parámetro delim, se utilizará el carácter de nueva línea predeterminado '\n'. Por ejemplo:
file2.get(str1, 127, 'A'); //Lee los caracteres del archivo en la cadena str1, cuando se encuentra el carácter 'A' o se termina la lectura de 127 caracteres.
③Leer y escribir bloques de datos
Para leer y escribir bloques de datos binarios, utilice las funciones miembro read() y write(). Sus prototipos son los siguientes:
<. p> read(unsigned char *buf, int num);write(const unsigned char *buf, int num
read() lee num caracteres del archivo a buf); En el caché al que apunta buf, si se llega al final del archivo antes de que se hayan leído num caracteres, puede usar la función miembro int gcount() para obtener el número real de caracteres leídos y write() escribe num caracteres; desde el caché señalado por los caracteres buf. Vale la pena señalar que el tipo almacenado en caché es char * sin firmar y, a veces, es posible que se requiera una conversión de tipo.
Ejemplo:
unsigned char str1[]="Te amo"
int n[5]
ifstream; ("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str1, strlen(str1)); Escribe todo en yyy.yyy
in.read((unsigned char*)n, sizeof(n)); //Lee el entero especificado de xxx.xxx, presta atención a la conversión de tipos
in.close(); out.close();
4. Detectar EOF
La función miembro eof() se utiliza para detectar si el final del archivo es alcanzado Devuelve un valor distinto de cero al final; de lo contrario, devuelve 0. El prototipo es int eof();
Ejemplo: if(in.eof())ShowMessage("¡Se ha llegado al final del archivo!"); posicionamiento
A diferencia de las operaciones de archivos de C, el sistema de E/S de C gestiona dos punteros asociados con un archivo. Uno es el puntero de lectura, que indica la ubicación de la operación de entrada en el archivo; el otro es el puntero de escritura, que indica la ubicación de la siguiente operación de escritura. Cada vez que se realiza una entrada o salida, el puntero correspondiente cambia automáticamente. Por lo tanto, el posicionamiento del archivo de C se divide en posición de lectura y posición de escritura. Las funciones miembro correspondientes son seekg () y seekp () es para establecer la posición de lectura, y seekp es para establecer la posición de escritura. Sus formas más comunes son las siguientes:
istream & seekg(streamoff offset, seek_dir origin
ostream & seekp(streamoff offset, seek_dir origin
< p); > streamoff está definido en iostream.h, que define el valor máximo que puede obtener offset. seek_dir representa la posición base de movimiento y es una enumeración con los siguientes valores:ios::beg : Comienzo del archivo.
ios::cur: Ubicación actual del archivo
ios::end: Fin del archivo
Estas dos funciones se usan generalmente para archivos binarios, porque Texto Los archivos pueden tener valores diferentes a los esperados debido a la interpretación de los caracteres del sistema.
Ejemplo:
file1.seekg(1234, ios::cur); //Mueve el puntero de lectura del archivo hacia atrás 1234 bytes desde la posición actual
file2.seekp(1234, ios::beg); //Mover el puntero de escritura del archivo hacia atrás 1234 bytes desde el principio del archivo