Dateien aufrufen und auf einem Netzwerkdrucker ausdrucken
-
Hallo Leute,
ich habe ein Problem, ich hoffe Ihr könnt mir dabei helfen.
Mein Problem ist, das ich eine Datei drucken will, das gelingt mir auch aber allerdings nur auf dem LPT1 Port.
Folgendes mein Drucker ist aber mit einem USB - Stecker versehen, wie kann ich einen Drucker, meine Datei über USB zusende.
Könntet Ihr mir ein paar Tips dazu geben!!!
Danke im vorraus!!!
Source:
[B]//Define
#define SEITENLAENGE 65
//PCL-Steuerzeichen für Schamlschrift
#define SCHMAL "1B2873313648"
//Steuerzeichen für Seitenvorschub
#define NEUE_SEITE "0c"
//PCL-Steuerzeichen für normale Schrift
#define NORMAL "1B2873313248"
//maximale Zeilenlänge
#define MAX_EINGABE 200FILE *text; //Druckausgabe
//Funktion für die Leerzeichen am Zeilenanfang
void left_margin (int rand)
{
while (rand-- >0)
fprintf(text,"c%",32); //32 = ASCII CODE für Leerzeichen
}//Funktion Für die Kopfzeilenausgabe einer Liste
void kopfzeile(char* dateiname, int linker_rand)
{
static int seite=1;
fprintf(text,"n"); //Eine Leerzeile vor Duckbeginleft_margin(linker_rand);
fprintf(text,"<<< Seite %3i >> von %s nn,seite++",dateiname);}
//funktion für die Steuerzeichen an den Drucker senden
void steuerzeichen(char *seq)
{
char wert;
while (*seq) //ließ die gesamten Steuersequenz
{
sscanf(seq,"2%x",&wert); //Hole jeweils 2 Zeichenfprintf(text,"%c",wert);
seq+2;
}
}//Hauptprogramm
main ()
{
FILE *stream;
char dateiname[67]; //zu druckende Datei
int zeile= 0; //Aktuelle Druckzeile
int linker_rand=10; //Linke Randgröße
char schmal='J'; //Schmalschrift (J/N)
char eingabe[MAX_EINGABE]; //Dialogzeile
printf("ntt <<<Formatierter Druck>>>");
printf("nn<RETURN> beendet das Programm.n");//Dateinamen einlesen und öffnen
printf("nWelche Datei drucken?n");
gets(dateiname);
if (strlen(dateiname)== 0)
exit(0);
while((stream = fopen(dateiname,"r"))==NULL)
{
printf ("'%s' nicht gefundenan",dateiname);
printf ("nWelche Datei drucken?n>");
gets (dateiname);
if (strlen(dateiname)==0)
exit(0);}
//Druckparameter einlesen
printf("n<RETURN> übernimmt die Vorgaben.n");
printf("nLinker Rand (%1): >",linker_rand);
gets(eingabe);
if (strlen(eingabe) != 0)
{
linker_rand = atoi(eingabe);
}
printf("nSchmalschrift J/N (%c) : >",schmal);
gets (eingabe);
if (strlen(eingabe) != 0)
{
if(eingabe[0] == 'N' || eingabe[0] == 'n')
schmal = 'N';
}//Druckausgabe öffnen
text = fopen("LPT1:","a");
if (text == NULL)
{
printf("Fehler beim Oeffnen von LPT1");
exit(1);
}//Schriftart einstellen
if (schmal == 'J')
{
steuerzeichen(SCHMAL);
}
else
{
steuerzeichen(NORMAL);
}//Liste drucken
kopfzeile(dateiname,linker_rand);
while(fgets(eingabe,MAX_EINGABE,stream)!=NULL)
{
left_margin(linker_rand);
fprintf(text,"%s",eingabe);
if(++zeile > SEITENLAENGE - 10){
steuerzeichen(NEUE_SEITE);
kopfzeile(dateiname,linker_rand);
zeile=0;
}
}steuerzeichen(NEUE_SEITE);
//DATEI SCHLIEßEN
fclose(stream);printf("nDruck beendet!an");
}
-
Na, ich glaube, Du sollest erst einmal Deinen Code lesbar mach machen z.B.:
main () { FILE *stream = NULL; /* Der Rest ... ... bis hier */ while((stream == NULL) { printf ("nWelche Datei drucken?n>"); gets (dateiname); /*Aus den man-pages: Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead. Z.B. Eine Zeilenlaenge von ueber 66 Zeichen gibt den schoensten Bufferoverflow ... */ if (strlen(dateiname)==0) exit(0); stream = fopen(dateiname,"r") if (stream == NULL) printf ("'%s' nicht gefundenan",dateiname); /* Nicht unbedingt - Du kannst auch einfach keine Rechte darauf haben Du sollest also errno und/oder strerror (errno) angeben. */ } /* Der Rest ... ... von hier */ }Warum schreibst Du die Druckerausgabe als globale Variable (FILE *text;)?
Wenn Du die nur nur mit "LPT1" oeffenst (text = fopen("LPT1:","a");) wirst Du auch nur auf LPT1 schreiben koennen.So, den Rest sollest Du selber machen!
NB:Das gehoert eingentlich in C-Forum.
-
Noch was:
void left_margin (int rand) { while (rand-- >0) fprintf(text,"c%",32); //32 = ASCII CODE für Leerzeichen }Also man einen <SPACE> auch ganz einfach als
' 'darstellen. Ferner: Bei jeder Zeile schreibst Du linker-Rand-viele-Male einen Space in den File. Jedes mal muss dem OS gesagt werden: "Jetzt kommt etwas". Das geht ziemlich an die Performance. Dann baue doch den Linken rand einmal als String und schicke ihn in einem Gang mit der Textzeile an den Drucker:
fprintf(text, "%s%s", szLinkerRand /*vorher gebaut */ szTextzeile); /*Zeile aus Datei */Ich glaube, Du sollest den ganzen Kram von Grund auf neu machen!
-
Nachdem du die Frage eh in allen mögliche Foren postest, hätte dir eigentlich irgendwann auffallen können, dass "[B]" kein Code-Tag ist...
