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 Befehlevoid 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-CSVint 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 Dateienchar *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 Scheilfechar 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 gelesensystem("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 werdenif (!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 werdenif (!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öschtif (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öschtif (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öschtif (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öschtif (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 Dateifprintf (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
