Archivo del sistema operativo | Clase | Objeto |
0 | ifstream | cin |
1 | ofstream | cout |
2 | ofstream | cerr |
int main()
{
string s;
ifstream f( "salida.txt" );
if ( f.is_open() ) {
getline( f, s );
while( !f.eof() ) {
cout << s << endl;
getline( f, s );
}
}
else cerr << "Error de apertura del archivo." << endl;
}
Para leer y volcar por pantalla este archivo que acabamos de generar, se haría lo siguiente:
int main()
{
ofstream f( "salida.txt" );
if ( f.is_open() ) {
f << "hola " << endl;
f << 5 << endl;
}
else cerr << "Error de apertura del archivo." << endl;
}
int main()
{
string s;
ifstream f( "salida.txt" );
if ( f.is_open() ) {
getline( f, s );
cout << s << endl;
getline( f, s );
cout << atof( s.c_str() ) << endl;
}
else cerr << "Error de apertura del archivo." << endl;
}
Los archivos binarios se tratan con la clase fstream. En este caso, debemos especificar si se desea entrada y salida, o sólo entrada o sólo salida. Uno de los usos más típicos es utilizar el archivo como una pequeña base de datos, utilizando un registro (struct) como referencia. Recordemos que los registros deben tener todos el mismo tamaño.
Así, suponiendo
la struct Persona:
const unsigned int MaxNombre = 50;Cuando se deseen guardar registros de este tipo en un archivo, se puede hacer de la manera siguiente:
const unsigned int MaxTelefono = 15;
struct Persona {
char nombre[MaxNombre];
int edad;
char telefono[MaxTelefono];
};
void volcar(ostream & o, const Persona &p)
{
o << nombre << ':' << edad << endl
<< "Tlf:" << telefono << ':' << endl
;
}
Persona p1;Es posible realizar una lectura de cada registro de la siguiente forma:
Persona p2;
strcpy( p1.nombre, "Baltasar" );
strcpy( p1.telefono, "988387028" );
p1.edad = 33;
strcpy( p2.nombre, "Pedro" );
strcpy( p2.telefono, "988387018" );
p1.edad = 33;
ofstream f( "datos.bin", ios::binary );
if ( f.is_open() ) {
f.write( (char *) &p1, sizeof( Persona ) );
f.write( (char *) &p2, sizeof( Persona ) );
} else cout << "Error de apertura de archivo." << endl;
}
Persona p;
ifstream f( "datos.bin", ios::binary );
if ( f.is_open() ) {
f.read( (char *) &p, sizeof( Persona ) );
while( !f.eof() ) {
volcar( cout, p );
f.read( (char *) &p, sizeof( Persona ) );
}
} else cout << "Error de apertura de archivo." << endl;
}
ATENCIÓN |
|
(n-1) * sizeof(
Persona )
. Así, para el tercer registro:f.seekp( 2 * sizeof( Persona ), ios::beg ); // escritura
f.seekg( 2 * sizeof( Persona ), ios::beg ); // lectura
f.tellg();
f.tellp();
Así, para abrir un archivo como de lectura y escritura, se debe utilizar la clase fstream, y posicionarse mediante el acceso directo para leer y escribir cuando sea preciso.
Persona p;
fstream f( "datos.bin", ios::binary | ios::in, ios::out );
// ir al tercer registro y leerlo
f.seekg( 2 * sizeof( Persona ), ios::beg );
f.read( (char *) &p, sizeof( Persona ) );
// cambiar el registro y guardarlo
p.edad = 56;
f.seekp( 2 * sizeof( Persona ), ios::beg );
f.write( (char *) &p, sizeof( Persona ) );