[Duda] Impresion stdprn

Iniciado por apoeti, 5 Septiembre 2012, 18:18 PM

0 Miembros y 1 Visitante están viendo este tema.

apoeti

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.

avesudra

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
Regístrate en

apoeti

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?

avesudra

Cita de: 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?
Depende de los márgenes , del tamaño de la letra...
Regístrate en

apoeti

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?

/* Copia de archivo de texto cambiando minúsculas por mayúsculas. */

#include <stdio.h>

FILE copia_mayus(FILE *fp, FILE *fp_nuevo);

main()
{
      char filename[40], filename_nuevo[40];
      char contenido[200];
      FILE *fp, *fp_nuevo;
     
      printf("Introduce la ruta del archivo a copiar: ");
      gets(filename);
      printf("Introduce la ruta del archivo nuevo: ");
      fp=fopen(filename,"r");
      fp_nuevo=fopen(filename_nuevo,"w");
     
      fp_nuevo=copia_mayus(fp, fp_nuevo);
      fgets(contenido, 200, fp);
      fprintf(stdout,"%s",contenido);
}

FILE copia_mayus(FILE *fp, FILE *fp_nuevo)
{
     char caracter;
     
     while(caracter!=EOF)
     {
         caracter=fgetc(fp);
         
         if((caracter=>61)&(caracter=<121))
         {
             fprintf(fp_nuevo, "%c", caracter-32);
         }
         else
         {
             fprintf(fp_nuevo, "%c", caracter);
         }
     }
     return fp_nuevo;
     fclose(fp_nuevo);
}


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).

avesudra

#5
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:
if((caracter=>61)&(caracter=<121))
Y este es tu código corregido:
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:
/* Copia de archivo de texto cambiando minúsculas por mayúsculas. */

#include <stdio.h>

FILE* copia_mayus(FILE *fp, FILE *fp_nuevo);

main()
{
      char filename[40], filename_nuevo[40];
      char contenido[200];
      FILE *fp, *fp_nuevo;

      printf("Introduce la ruta del archivo a copiar: ");
      gets(filename);
      printf("Introduce la ruta del archivo nuevo: ");
      gets(filename_nuevo);
      fp=fopen(filename,"r");
      fp_nuevo=fopen(filename_nuevo,"w");

      fp_nuevo=copia_mayus(fp, fp_nuevo);
      fgets(contenido, 200, fp);
      fprintf(stdout,"%s",contenido);
}

FILE* copia_mayus(FILE *fp, FILE *fp_nuevo)
{
     char caracter;

     while(caracter!=EOF)
     {
         caracter=fgetc(fp);

         if(caracter>=61&&caracter<=121)
         {
             fprintf(fp_nuevo, "%c", caracter-32);
         }
         else
         {
             fprintf(fp_nuevo, "%c", caracter);
         }
     }
     return fp_nuevo;
     fclose(fp_nuevo);
}
Regístrate en

rir3760

Cita de: apoeti en  5 Septiembre 2012, 19:11 PMBueno, ya que he abierto un tema, hago otra pregunta ¿Qué fallo tiene este código?

/* 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:
#include <ctype.h>

FILE *copia_mayus(FILE *fp, FILE *fp_nuevo)
{
   int ch; /* getchar et al retornan un "int" */
   
   while ((ch = fgetc(fp)) != EOF)
      fputc(toupper(ch), fp_nuevo);
   
   return fp_nuevo;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

avesudra

Cita de: rir3760 en  6 Septiembre 2012, 02:47 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!
Regístrate en

apoeti

#8
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.

avesudra

Cita de: 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.
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!
Regístrate en