CSV Datei ausdrucken



  • Hallo alle mit einander

    Ich bin gerade dabei eine Datenbank zu erstellen (mit VB 2008), die Daten in eine CSV Datei einliest, sucht und wieder ausgiebt und schließlich in case3 die komplette CSV Datei drucken soll.

    Mein Leherer sagte mir das es das einfachste wäre mit der Windos eigenen Druckfunktion dies zu realisieren. Lieder sind meine win32 kenntnisse etwas begrenzt da ich bis jetzt nur mit C gearbeitet habe.

    Bis jetzt habe ich es schon geschafft den Druckdialog auszugeben leider weiß ich nicht wie ich es nun schaffe ihm beizubringen die CSV Datei nun auszugeben.

    Muss ich mit fopen wieder arbeiten oder muss ich den Dateifand im von mir fett markierten Bereich angeben?? Bin für jede Hilfe Dankbar.

    #include "stdafx.h" // Bibliotek für Include-Anweisungen
    #include "stdio.h" // Bibliotek für Ein bzw. Ausgabefunktionen
    #include "stdlib.h" // Bibliotek für Hilfsfunktionen
    #include "string.h" // Bibliotek für Stringfunktionen
    #include "windows.h" // Bibliotek für Windows Befehle

    void EntferneZeilenumbruchinVariable(char *s) { // Löscht den Zeilenumbruch am Ende der Zeichenkette

    int i = strlen(s)-1;
    if( s[i] == '\n') s[i] = '\0'; //liest solange ein bis das Ende der Zeichenkette erreicht ist bzw \n eingegeben wurde
    }

    void EntferneZeichenimEingabePuffer() { // Löscht die Zeilenumbrüche im Eingabepuffer

    char c;

    while ((c = getchar()) != EOF && c != '\n'); //Solange die eingelesenen Zeichen nicht EOF und \n sind wird der Puffer
    //weiter gelesen
    }

    int _tmain(int argc, _TCHAR* argv[]){ //Hauptprogramm

    FILE *datenbank; //Dateideskriptor fuer Ausgabe-CSV
    FILE *datenbank_temp; //Dateideskriptor fuer Temporäre Ausgabe-CSV

    int benutzereingabe=0; // deklariert Benutzereingabeund setzt sie gleichzeitig auf Null

    char *datenbankdatei="Material u. Lohnliste.csv"; //Dateinamen der CSV Dateien
    char *temp_datenbankdatei="Material u. Lohnliste.csv.temp"; //Dateinamen der CSV Dateien

    char *password="123456"; //Passwort

    //Hier werden die einzelnen Felder der Späteren CSV Datei deklariert
    //In den Eckigen Klammern wird festgelegt wieviele Zeichen maximal eingegeben werden können
    char db_kuertzel[8]="",db_leitungsart[20]="",db_hnrleitung[6]="",db_hnrschellen[6]="",db_lohn[5]="";

    **PRINTDLG pd = {0};
    HWND hwnd = NULL;
    // Initialize PRINTDLG
    ZeroMemory(&pd, sizeof(pd));
    pd.lStructSize = sizeof(pd);
    pd.hwndOwner = hwnd;
    pd.hDevMode = NULL;
    pd.hDevNames = NULL;
    pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
    pd.nCopies = 1;
    pd.nFromPage = 0xFFFF;
    pd.nToPage = 0xFFFF;
    pd.nMinPage = 1;
    pd.nMaxPage = 0xFFFF;

    **
    while (1) { //Endlos Scheilfe

    char zeilenpuffer[250]=""; //Temporaererer Zeilenpuffer wird auf 250 Zeichen festgelegt

    //Definition eines temp. Arrays fuer das Kuertzel und Hochkommas
    char temp_kuertzel[sizeof(db_kuertzel)+2]="";

    int treffer=0; //Zaehlvariable fuer Treffer innerhalb der Datenbank

    system("cls"); //bisherige Eingaben werden gelöscht

    //Das später sichtbare Menü zur auswahl der einzlenen
    printf("\nKalkulationsprogramm Sicherheitsleitungen\n_________________________________________\n\n\n");

    printf("Bitte geben sie die entsprechende Zahl ein!\n\n");

    printf("1. Leitung suchen\n\n");
    printf("2. Leitung hinzufuegen\n\n");
    printf("3. Datenbank drucken\n\n");
    printf("4. Programm beenden\n\n");

    printf("Eingabe: ");
    scanf("%i",&benutzereingabe); //Eigegebene Zahl wird gelesen

    system("cls"); //bisherige Eingaben werden gelöscht

    EntferneZeichenimEingabePuffer(); // Löscht die Zeilenumbrüche im Eingabepuffer

    switch( benutzereingabe ) // Switch Case Anweisung um ein Menü zu realisieren
    {

    case 1: // Erster Menüpunkt (Leitung suchen)

    datenbank = fopen( datenbankdatei, "r"); //Die Datenbank wird nur lesend (read) geoeffnent da
    //in case 1 nur Datenabegerufen werden

    if (!datenbank){ //Falls Datenbank nicht geoeffnet werden kann =>

    printf("Datenbank kann nicht geoeffnet werden!\n"); // Bildschirmausgabe
    exit(1); // Beliebige Taste drücken =>Programm wird beendet
    }

    printf("Kuertzel eingeben:\t");
    fgets(db_kuertzel,sizeof(db_kuertzel),stdin);

    //Entferne Zeilenumbruch von Benutzereingabe
    EntferneZeilenumbruchinVariable(db_kuertzel);

    //Setze die Anzahl Treffer auf 0
    treffer=0;

    //Da in der CSV Datei mit Hochkommas geschrieben wird ist er nötig mit strncat (Funktion um
    //Stringsaneinander zu ketten) vorne und hinten ein Hochkomma hinzuzufügen. strlen ermittelt
    //dann die Läge des Strings. z.B.: aus E30 wird 'E30'

    strncat(temp_kuertzel,"'",1);
    strncat(temp_kuertzel,db_kuertzel,strlen(db_kuertzel));
    strncat(temp_kuertzel,"'",1);

    //While Schleife zu Zeilenweisen einlesen der CSV Datei
    while(fgets(zeilenpuffer,sizeof(zeilenpuffer),datenbank) != NULL)
    {
    //Inhalte die mit Semikolon getrennt sind, werden in einzelne Blöcke unterteilt
    char *token=strtok(zeilenpuffer,";");

    //Wenn ein Baustein vorhanden ist
    if (token) {
    //Falls der Block und die Benutzereingabe übereinstimmen
    if (strcmp(token,temp_kuertzel) == 0) {

    treffer=1;

    //Ausgabe der Datenbankfelder
    printf("\nLeitung gefunden!\n_________________\n\n");

    //mit %s wird der in der CSV-datei abgelegte Token ausgegben
    //; weist darauf hin das beim nächsten Token weiter gemacht wird
    //(nächste Spalte der CSV-Datei
    printf("Leitungsart:\t\t\t%s\n\n",strtok(NULL,";"));
    printf("Hagemeyer Nr. Leitung:\t\t%s\n\n",strtok(NULL,";"));
    printf("Hagemeyer Nr. Schellen:\t\t%s\n\n",strtok(NULL,";"));
    printf("Lohn in Minuten:\t\t%s\n",strtok(NULL,";"));

    printf("\nTaste druecken um zum Hauptmenue zurueckzukehren ...");
    //getchar dient dazu einen Buchstaben einzulesen um danach break auszuführen
    getchar();

    break;
    }
    }
    }
    //Datenbank wieder schließen
    fclose(datenbank);

    //Falls kein Treffer erziehlt wurde
    if (treffer == 0) {

    //Bildschirm ausgabe von:
    printf("\nKeine passende Leitung gefunden!\n");
    printf("\nTaste druecken um zum Hauptmenue zurueckzukehren ...");
    //getchar dient dazu einen Buchstaben einzulesen um danach break auszuführen
    getchar();
    }

    break;

    case 2: // Zweiter Menüpunkt (Leitung hinzufügen)

    datenbank = fopen( datenbankdatei, "a"); //Die Datenbank wird nur lesend und schreibend
    //geoeffnent da in case 2 Daten in die CSV Datei
    //hinzugefühgt werden

    if (!datenbank){ //Falls Datenbank nicht geoeffnet werden kann =>

    printf("Datenbank kann nicht geoeffnet werden!\n"); // Bildschirmausgabe
    exit(1); // Beliebige Taste drücken =>Programm wird beendet
    }

    printf("Leitung hinzufuegen:\n\n");

    //Eingabe wird Eingelesen

    printf("Kuertzel:\t\t");
    fgets(db_kuertzel,sizeof(db_kuertzel),stdin);

    //Falls das eingebene Kürzel länger ist als der dafür vorher reservierte Speicherplatz
    //(wird von sizeof geprüft) so wird das zuvieleingebene aus dem Eingabepuffer gelöscht

    if (strlen(db_kuertzel) >= sizeof(db_kuertzel)-1) {

    EntferneZeichenimEingabePuffer();
    }

    //Ansonsten wird nur die Zeilenumbruchsvariable gelöscht \n

    else {
    EntferneZeilenumbruchinVariable(db_kuertzel);
    }

    printf("\nLeitungsart:\t\t");

    //Eingabe wird Eingelesen

    fgets(db_leitungsart,sizeof(db_leitungsart),stdin);

    //Falls das eingebene Kürzel länger ist als der dafür vorher reservierte Speicherplatz
    //(wird von sizeof geprüft) so wird das zuvieleingebene aus dem Eingabepuffer gelöscht
    if (strlen(db_leitungsart) >= sizeof(db_leitungsart)-1) {

    EntferneZeichenimEingabePuffer();
    }

    //Ansonsten wird nur die Zeilenumbruchsvariable gelöscht \n

    else {
    EntferneZeilenumbruchinVariable(db_leitungsart);
    }

    printf("\nHagemeyer Nr. Leitung:\t");

    //Eingabe wird Eingelesen

    fgets(db_hnrleitung,sizeof(db_hnrleitung),stdin);

    //Falls das eingebene Kürzel länger ist als der dafür vorher reservierte Speicherplatz
    //(wird von sizeof geprüft) so wird das zuvieleingebene aus dem Eingabepuffer gelöscht

    if (strlen(db_hnrleitung) >= sizeof(db_hnrleitung)-1) {

    EntferneZeichenimEingabePuffer();
    }

    //Ansonsten wird nur die Zeilenumbruchsvariable gelöscht \n

    else {
    EntferneZeilenumbruchinVariable(db_hnrleitung);
    }

    printf("\nHagemeyer Nr. Schellen:\t");

    //Eingabe wird Eingelesen

    fgets(db_hnrschellen,sizeof(db_hnrschellen),stdin);

    //Falls das eingebene Kürzel länger ist als der dafür vorher reservierte Speicherplatz
    //(wird von sizeof geprüft) so wird das zuvieleingebene aus dem Eingabepuffer gelöscht

    if (strlen(db_hnrschellen) >= sizeof(db_hnrschellen)-1) {

    EntferneZeichenimEingabePuffer();
    }

    //Ansonsten wird nur die Zeilenumbruchsvariable gelöscht \n

    else {
    EntferneZeilenumbruchinVariable(db_hnrschellen);
    }

    printf("\nLohn in Minuten:\t");

    //Eingabe wird Eingelesen

    fgets(db_lohn,sizeof(db_lohn),stdin);

    //Falls der eingebene Lohn länger ist als der dafür vorher reservierte Speicherplatz
    //(wird von sizeof geprüft) so wird das zuvieleingebene aus dem Eingabepuffer gelöscht

    if (strlen(db_lohn) >= sizeof(db_lohn)-1) {

    EntferneZeichenimEingabePuffer();
    }

    //Ansonsten wird nur die Zeilenumbruchsvariable gelöscht \n

    else {
    EntferneZeilenumbruchinVariable(db_lohn);
    }

    {
    //Vorher eingebene Werte werden in die CSV Datei
    //geschrieben Hochkommas desshalb da die CSV
    //Datei die einzelnen Blöcke erkennt, die Semiko-
    //lons dienen dazu inder nächsten Spalte fortzu-
    //fahren(eigendlich nur eine reine Formatierungs-
    //sache der CSV Datei

    fprintf (datenbank,"'%s';'%s';'%s';'%s';'%s'\n",db_kuertzel,db_leitungsart,db_hnrleitung,db_hnrschellen,db_lohn);
    }

    //Dateideskriptor der Datenbank schliessen
    fclose(datenbank);

    //Bildschirmausgabe
    printf("\nDatensatz gespeichert!\n");
    printf("\nTaste druecken um zum Hauptmenue zurueckzukehren ...");
    //getchar dient dazu einen Buchstaben einzulesen um danach break auszuführen
    getchar();

    break;

    case 3:
    if (PrintDlg(&pd)==TRUE)
    {
    // GDI calls to render output.
    DeleteDC(pd.hDC); // Delete DC when done.
    }

    printf("\nTaste druecken um zum Hauptmenue zurueckzukehren ...");
    getchar();

    break;
    //Programm beenden
    case 4:
    exit(0);

    default :
    fprintf(stderr,"\n\n\t///////////////////////////////////\n\t/FEHLEINGABE PROGRAMM WIRD BEENDET/\n\t///////////////////////////////////\n\n");
    exit(0);
    }

    }

    exit(0);
    }

    Vielen vielen Dank im vorraus 🙂


Anmelden zum Antworten