ADVERTENCIA: Esta sección y la siguiente contienen código que está oficialmente sin aprobación por el Estándar C++. En particular, redefinimos cout y new mediante macros, que puede provocar resultados sorprendentes si no tiene cuidado. Nuestros ejemplos funcionan en todos los compiladores que usamos, comoquiera, y proporcionan información útil. Este es el único lugar en este libro donde nos desviaremos de la inviolabilidad de la práctica de codificar cumpliendo el estándar. ¡Úsalo bajo tu propio riesgo! Dese cuenta que para este trabajo, usar delcaraciones debe ser realizado, para que cout no esté prefijado por su nombre de espacio, p.e. std::cout no funcionará.
El siguiente código crea fácilmente un fichero de seguimiento y envía todas las salidas que irían normalmente a cout a ese fichero. Todo lo que debe hacer es #define TRACEON e incluir el fichero de cabecera (por supuesto, es bastante fácil sólo escribir las dos líneas claves correctamente en su fichero):
//: C03:Trace.h // Creating a trace file. #ifndef TRACE_H #define TRACE_H #include <fstream> #ifdef TRACEON std::ofstream TRACEFILE__("TRACE.OUT"); #define cout TRACEFILE__ #endif #endif // TRACE_H ///:~
Listado 3.12. C03/Trace.h
Aquí esta una prueba sencilla del fichero anterior:
//: C03:Tracetst.cpp {-bor} #include <iostream> #include <fstream> #include "../require.h" using namespace std; #define TRACEON #include "Trace.h" int main() { ifstream f("Tracetst.cpp"); assure(f, "Tracetst.cpp"); cout << f.rdbuf(); // Dumps file contents to file } ///:~
Listado 3.13. C03/Tracetst.cpp
Porque cout ha sido textualmente convertido en algo más por Trace.h, todas las sentencias cout en su programa ahora envían información al fichero de seguimiento. Esto es una forma conveniente de capturar su salida en un fichero, en caso de que su sistema operativo no haga una fácil redirección de la salida.