Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: apoeti en 5 Septiembre 2012, 18:18 pm



Título: [Duda] Impresion stdprn
Publicado por: apoeti en 5 Septiembre 2012, 18:18 pm
Hola.
¿Cómo puedo limitar el número de líneas por página al imprimir un archivo por stdprn? Tengo que imprimir un archivo por la impresora poniendo solo 55 líneas por página. Ya sé que se pueden pasar los archivos a la impresora con fprintf, previamente cogiendo todos los caracteres del archivo con fgets(yo por lo menos, lo hago así). Así que la cuestión es solo la antes planteada, pero si me pasáis un código completo que me pueda servir para aprender, pues mejor.

Saludos.


Título: Re: [Duda] Impresion stdprn
Publicado por: avesudra en 5 Septiembre 2012, 18:44 pm
Ufff es complicado pero por lo que he estado viendo puedes pasar la secuencia de escape \f para pasar de página, o sea imprimes 55 líneas , pasas de página con \f etc... , mira aquí --> http://stackoverflow.com/questions/4334370/escape-sequence-f-form-feed-what-exactly-is-it


Título: Re: [Duda] Impresion stdprn
Publicado por: apoeti en 5 Septiembre 2012, 18:47 pm
He estado pensando y creo que sería fácil si conociera cuántos caracteres caben en una línea de un fóleo DIN A4. Creo que ese valor sería la clave ¿Alguna idea?


Título: Re: [Duda] Impresion stdprn
Publicado por: avesudra en 5 Septiembre 2012, 18:55 pm
He estado pensando y creo que sería fácil si conociera cuántos caracteres caben en una línea de un fóleo DIN A4. Creo que ese valor sería la clave ¿Alguna idea?
Depende de los márgenes , del tamaño de la letra...


Título: Re: [Duda] Impresion stdprn
Publicado por: apoeti en 5 Septiembre 2012, 19:11 pm
Ok, vamos, que está dificilillo, aunque la idea era que fuera para texto plano.

Bueno, ya que he abierto un tema, hago otra pregunta ¿Qué fallo tiene este código?

Código
  1. /* Copia de archivo de texto cambiando minúsculas por mayúsculas. */
  2.  
  3. #include <stdio.h>
  4.  
  5. FILE copia_mayus(FILE *fp, FILE *fp_nuevo);
  6.  
  7. main()
  8. {
  9.      char filename[40], filename_nuevo[40];
  10.      char contenido[200];
  11.      FILE *fp, *fp_nuevo;
  12.  
  13.      printf("Introduce la ruta del archivo a copiar: ");
  14.      gets(filename);
  15.      printf("Introduce la ruta del archivo nuevo: ");
  16.      fp=fopen(filename,"r");
  17.      fp_nuevo=fopen(filename_nuevo,"w");
  18.  
  19.      fp_nuevo=copia_mayus(fp, fp_nuevo);
  20.      fgets(contenido, 200, fp);
  21.      fprintf(stdout,"%s",contenido);
  22. }
  23.  
  24. FILE copia_mayus(FILE *fp, FILE *fp_nuevo)
  25. {
  26.     char caracter;
  27.  
  28.     while(caracter!=EOF)
  29.     {
  30.         caracter=fgetc(fp);
  31.  
  32.         if((caracter=>61)&(caracter=<121))
  33.         {
  34.             fprintf(fp_nuevo, "%c", caracter-32);
  35.         }
  36.         else
  37.         {
  38.             fprintf(fp_nuevo, "%c", caracter);
  39.         }
  40.     }
  41.     return fp_nuevo;
  42.     fclose(fp_nuevo);
  43. }
  44.  

Me dice que hay un error al asignar los tipos (cuando asigno el valor de retorno de mi función personalizada a fp_nuevo, dice que no son compatibles).


Título: Re: [Duda] Impresion stdprn
Publicado por: avesudra en 5 Septiembre 2012, 21:25 pm
Estás retornando FILE en vez de FILE* , además , en la función copia mayus tienes un error de sintaxis como casas jajaja mira:
Este es tu código:
Código
  1. if((caracter=>61)&(caracter=<121))
Y este es tu código corregido:
Código
  1. if((caracter>=61)&&(caracter<=121))
El and debe de ser lógico... , los operadores de comparación estaban al revés.Y he añadido para que coja el filename_nuevo que no lo tenías puesto , hé aquí tu código:
Código
  1. /* Copia de archivo de texto cambiando minúsculas por mayúsculas. */
  2.  
  3. #include <stdio.h>
  4.  
  5. FILE* copia_mayus(FILE *fp, FILE *fp_nuevo);
  6.  
  7. main()
  8. {
  9.      char filename[40], filename_nuevo[40];
  10.      char contenido[200];
  11.      FILE *fp, *fp_nuevo;
  12.  
  13.      printf("Introduce la ruta del archivo a copiar: ");
  14.      gets(filename);
  15.      printf("Introduce la ruta del archivo nuevo: ");
  16.      gets(filename_nuevo);
  17.      fp=fopen(filename,"r");
  18.      fp_nuevo=fopen(filename_nuevo,"w");
  19.  
  20.      fp_nuevo=copia_mayus(fp, fp_nuevo);
  21.      fgets(contenido, 200, fp);
  22.      fprintf(stdout,"%s",contenido);
  23. }
  24.  
  25. FILE* copia_mayus(FILE *fp, FILE *fp_nuevo)
  26. {
  27.     char caracter;
  28.  
  29.     while(caracter!=EOF)
  30.     {
  31.         caracter=fgetc(fp);
  32.  
  33.         if(caracter>=61&&caracter<=121)
  34.         {
  35.             fprintf(fp_nuevo, "%c", caracter-32);
  36.         }
  37.         else
  38.         {
  39.             fprintf(fp_nuevo, "%c", caracter);
  40.         }
  41.     }
  42.     return fp_nuevo;
  43.     fclose(fp_nuevo);
  44. }
  45.  


Título: Re: [Duda] Impresion stdprn
Publicado por: rir3760 en 6 Septiembre 2012, 02:47 am
Bueno, ya que he abierto un tema, hago otra pregunta ¿Qué fallo tiene este código?

Código
  1. /* Copia de archivo de texto cambiando minúsculas por mayúsculas.
*/
Si como indica el enunciado el objetivo es tomar un texto y convertirlo a mayúsculas la primera pregunta que viene a la mente es: ¿Porque comparas con el rango 61 .. 121?

Tomando como base el programa de avesudra la función se puede reducir a:
Código
  1. #include <ctype.h>
  2.  
  3. FILE *copia_mayus(FILE *fp, FILE *fp_nuevo)
  4. {
  5.   int ch; /* getchar et al retornan un "int" */
  6.  
  7.   while ((ch = fgetc(fp)) != EOF)
  8.      fputc(toupper(ch), fp_nuevo);
  9.  
  10.   return fp_nuevo;
  11. }

Un saludo


Título: Re: [Duda] Impresion stdprn
Publicado por: avesudra en 6 Septiembre 2012, 02:58 am
Si como indica el enunciado el objetivo es tomar un texto y convertirlo a mayúsculas la primera pregunta que viene a la mente es: ¿Porque comparas con el rango 61 .. 121?

Tomando como base el programa de avesudra
El programa es suyo jajajaja lo digo porque no me gusta eso de que haya corregido algo y ya el codigo es mio , es verdad yo tampoco entiendo para que lo compara , en todo caso sería comparar si estuviese desde 97 a 122 que son las minusculas y si esta entre ellas le resta 32 para ponerlas en mayusculas, hombre no lo mates , que con eso que ha hecho en vez de utilizar la funcion toupper hace la suya propia y asi aprende jejeje
¡Un saludo y buena observacion!


Título: Re: [Duda] Impresion stdprn
Publicado por: apoeti en 6 Septiembre 2012, 12:30 pm
Gracias por las respuestas, me sirvieron un montón.
Eso sí, ¿para qué sirve la función toupper()?
Otra cosilla, yo había puesto un operador de bit(&), ¿no?

Saludos.


Título: Re: [Duda] Impresion stdprn
Publicado por: avesudra en 6 Septiembre 2012, 13:58 pm
Gracias por las respuestas, me sirvieron un montón.
Eso sí, ¿para qué sirve la función toupper()?
Otra cosilla, yo había puesto un operador de bit(&), ¿no?

Saludos.
La funcion toupper sirve para pasar el caracter que le pases a mayusculas, claro los operadores de bit no se utilizan para comparar , ten cuidado con eso :D

¡Un saludo!


Título: Re: [Duda] Impresion stdprn
Publicado por: apoeti en 6 Septiembre 2012, 14:26 pm
Gracias.