Drucken mit Dateien C++
-
Hallo, ich habe hier einen Quellcode zum Drucken von Dateien. Undzwar spreche ich den Drucker mit LPT1 an, jedoch habe ich irgendetwas falsch gemacht, kann mir jemand sagen wie ich richtig einstelle, dass der Drucker angesprochen wird?
/*----- include files --------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#pragma warning (disable : 4996) //Deaktivieren der Fehlermeldung von fopen
#pragma warning (disable : 4700)/*----- define ---------------------------------*/
#define SEITENLAENGE 65
/* PCL-Steuerzeichen für Schmalschrift */
#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 : l e f t _ m a r g i n *
*------------------------------------------------*
* Aufgabe : Leerzeichen für Zeilenanfang *
* Parameter : Anzahl der Leerstellen *
* Return-Wert: keiner *
************************************************/
void left_margin(int rand) {
while(rand-- > 0)
fprintf(text,"%c",32); / 32 = ASCII-Code
für Leerzeichen */
}/*************************************************
* Funktion : k o p f z e i l e *
*------------------------------------------------*
* Aufgabe : Kopfzeilenausgabe einer Liste *
* Parameter : Name der zu druckenden Datei *
* : Abstand vom linken Rand *
* Return-Wert: keiner *
*************************************************/
void kopfzeile(char dateiname,int linker_rand) {
static int seite=1;
fprintf(text,"\n"); / 1 Leerzeile vor
Druckbeginn */
left_margin(linker_rand);
fprintf(text,
"<<< Seite %3i >>> von %s\n\n",
seite++,dateiname);
}/*************************************************
* Funktion : s t e u e r z e i c h e n *
*------------------------------------------------*
* Aufgabe : Steuerzeichen an Drucker senden *
* Parameter : Escape-Sequenz *
* Return-Wert: keiner *
*************************************************/
void steuerzeichen(char *seq) {
char wert;
while(*seq) { /* Lies die gesamte
Steuersequenz /
sscanf(seq,"%2x",&wert);/ Hole jeweils 2
Zeichen */
fprintf(text,"%c",wert);
seq+=2;
}
}/*----- Hauptprogramm --------------------------*/
int 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("\n\t\t<<< Formatierter Druck >>>");
printf("\n\n<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 gefunden!\a\n",dateiname);
printf("\nWelche Datei drucken?\n>");
gets(dateiname);
if(strlen(dateiname) == 0)
exit(0);
}/*----- Druckparameter einlesen */
printf("\n<RETURN> uebernimmt die Vorgaben.\n");
printf("\nLinker Rand (%i): >",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 schliessen */
fclose(stream);printf("\nDruck beendet!\a\n");
system("Pause");}
Danke im Vorraus!
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wie kommst du darauf, dass du etwas falsch gemacht hast?
Und wo hast du den Code her?
-
Ist aus einem C-Programmieren Buch. Ich denke das, weil er meinen Drucker nicht erkennt, also nicht gedruckt wird..
-
Ist dein Drucker denn auch an LPT1 (der parallelen Schnittstelle) angeschlossen?
Oder ist er im Druckerpool?Aus welchem C-Buch denn?
-
Nein er ist an der USB Schnittstelle angeschlossen, ich glaube das ist das Problem bzw. Mein Fehler. Weißt du wie man einen Usb Drucker anspricht?
Von Helmuth Erlenkötter, ich hoffe ich habs richtig geschrieben.
-
Windows?
Geh mal bei deinem Drucker in die Druckereigenschaften und da auf den Tab Anschlüsse.
Da aktivierst du den Druckerpool (ganz unten) und dann markierst du noch in der Liste LPT1.
Es müssen dann zwei Anschlüsse aktiv sein.
Übernehmen bzw OK. nicht vergessen.
-
Okey habe ich gemacht. Kommt die Fehlermeldung: Debug Error! Programm:.... Module:..... File: Run-Time Check Failure #2 - Stack around the variable wert was corrupted.
-
Das wird in der Zeile
sscanf(seq,"%2x",&wert);/* Hole jeweils 2 Zeichen */
passieren.
(Hättest du Code-Tags benutzt, könnte ich dir eine Zeilennummer geben)
Das%2x
erwartet einen Zeiger auf einint
.wert
ist aber vom Typchar
.
Du kannstwert
alsint
definieren.
-
Ok, gut das Problem wär gelöst, danke! Jedoch kommen wir zum nächsten.. undzwar läuft das Programm komplett durch und es kommt beim Drucker, hab den Epson Stylus SX510w, eine Anzeige "Druck erfolgt" jedoch passiert sonst nichts. mhm..
-
Ich hatte vorher schon rumprobiert und den Befehl: NET USE LPT1 \\PCNAME\DRUCKERFREIGABENAME in der cmd eingegeben. Daran lag es das es ging, jedoch ging es nur 1 mal das etwas angezeigt wurde. Inzwischen geht es nicht mehr. Für den Befehl musste ich den Drucker freigeben, jedoch wenn ich Freigabe deaktiviere und Druckerpool aktiviere wie du gesagt hast, funktioniert es nicht und sagt das LPT1 nicht geöffnet werden konnte..
-
Versteht der Epson übehaupt PCL?
-
Gute Frage.. wie finde ich das heraus ?
-
RTFM
Webseite von Epson über den Drucker.
Evtl. deutet der Tribername darauf hin.
-
Mhm.. finde nichts.. Was wäre wenn er es nicht könnte? Gäbe es eine andere Möglichkeit zum Drucken mit C++?
-
Dein Programm ist C. Kein C++. Großer Unterschied, auch wenn es sich nicht so anhört.
Du kannst die WinAPI benutzen.
-
Tut mir leid, war grad irgendwie bei C++ aber ja ich weiß das es C ist. Okey gut, werde ich mich morgen mal schlau machen. Bis dahin. Und danke für die zahlreiche Hilfe.