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 200

    FILE *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 Duckbegin

    left_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 Zeichen

    fprintf(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... 🙄


Anmelden zum Antworten