Como imprimir en C/C++ Imprimir
Escrito por adrianvaca   
Martes, 22 de Marzo de 2011 23:01

Los lenguajes como C y C++ no definen una forma estandar de imprimir.

La razon es simple: el trabajo de impresion es una tarea específica de la plataforma, lo que implica:

No hay una forma estandar de imprimir en C/C++

Se debe usar alguna caracteristica especifica de la plataforma (como codigo no portable) y/o del compilador para imprimir algo.

Por ejemplo en Turbo C++ se puede usar stdprn para hacer referencia a la impresora e imprimir algo, tal como sigue:

 
fprintf(stdprn"Hola mundo...\n");  



 
int num 50;
fprintf(stdprn"Valor del numero: %d\n"num); 




Otra forma es funcionalmente similar a trabajar con archivos, pero en lugar de abrir un archivo del disco duro, haremos referencia a la impresora con uno de los siguiente valores:

LPT1:
PRN
LPT2:

Por ejemplo en Dev-C++ podemos usar:

 
#include <iostream>
#include <fstream>
using namespace  std ;

int main()
{
   
// Identifica el puerto de la impresora
   
char const * const  pszPrinterName "LPT1:" ;

   
// Abre el flujo de la impresora
   
ofstream  prnpszPrinterName );

   
// Asegura que la impresora se abrio exitosamente
   
if ( ! prn ) {
      
cerr << "ERROR: No se puede abrir " << pszPrinterName << '\n' ;
      return  
;
   }

   
// Imprime un mensaje
   
prn << "Hola mundo!" ;

   
prn << '\r'     // Retorno de carro (ENTER)
       
<< '\f' ;   // Expulsa la ultima hoja de la impresora

   // Cierra la impresora
   
prn.close();
   
   return 
0;






Impresión usando al API de Windows

Si estamos trabajando con Windows, la mejor forma es usar la API, con esto logramos que sea el propio Windows, quien se encargue de ciertas tareas.

Por ejemplo, con el siguiente código, hecho por muestro amigo ajo podemos imprimir un archivo de texto. Se mostrará el clásico cuadro de diálogo de impresión de Windows y podemos entonces seleccionar cualquier impresora, ya sea conectada al puerto paralelo, USB o de red:


//Ejemplo que muestra como imprimir un archivo de texto plano.
#include <windows.h>
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

typedef std::basic_ifstream<TCHAR> tifstream;
typedef std::basic_string<TCHAR> tstring;

void Outtextxy(HDC hdc,int x,int y,tstring Msg)
{
TextOut(hdc,x,y,Msg.c_str(),static_cast<int>(Msg.length()));
}

void ShowError(tstring strMsg)
{
MessageBox (NULL,strMsg.c_str(),TEXT("Imprimir"),MB_ICONERROR);
exit(1);
}
void ShowInformation(tstring strText)
{
MessageBox (NULL,strText.c_str(),TEXT("Imprimir"),MB_ICONINFORMATION);
}
void PrintFile(tifstream& f)
{
PRINTDLG pd;
DOCINFO di;
tstring strLine;
int y=300;

memset (&pd, 0, sizeof(PRINTDLG));
memset (&di, 0, sizeof(DOCINFO));

di.cbSize = sizeof(DOCINFO);
di.lpszDocName = TEXT("Imprimiendo");

pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_PAGENUMS | PD_RETURNDC;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;


if(f.fail())
ShowError(TEXT("Error el archivo no se pudo abrir para lectura"));

if (PrintDlg (&pd)){
if (pd.hDC){
if (StartDoc (pd.hDC, &di) != SP_ERROR){
cout << "Imprimiendo...\nEspere un momento" << endl;
StartPage (pd.hDC);
while(!f.eof()){
getline(f,strLine);
Outtextxy(pd.hDC,500,y,strLine.c_str());
y+=100;
}
EndPage (pd.hDC);
EndDoc (pd.hDC);

}
else
ShowError(TEXT("Error: No se pudo comenzar a imprimir."));

}
else
ShowError(TEXT("Error: No se pudo crear el contexto de dispositivo"));

}
else
ShowInformation(TEXT("Se cancelo la impresion"));

ShowInformation(TEXT("Termino la impresion correctamente."));
}

int main(int argc,char *argv[])
{

tifstream in(TEXT("texto.txt"));
PrintFile(in);
in.close();
return 0;
}



Para que funcione el ejemplo debemos tener un archivo llamado texto.txt en el mismo directorio del programa ejecutable.

Si trabajamos con Dev-C++, debemos ir a Project -> Project Options -> Parameters, y en el cuadro Linker agregamos las siguientes líneas en caso de no tenerlas:

 
-lgdi32
-lcomdlg32 



Como se menciona al inicio, no hay una forma estandar y que funcione en cualquier entorno. Depende del Sistema Operativo y/o del compilador, a veces hay que probar algunas veces para que funcione.

 
Otros artículos