Umlaute im Dos



  • Habe eine binäre Datenbank und ein Programm dazu programmiert.

    hab auch suche eingebaut.
    In der Datenbank kommen auch Umlaute vor.
    Wenn ich nach dem Namen 'Möller' suche, findet er nichts.

    Was kann man da tun?

    bitte antwortet

    zoetti1



  • Meinst du eine Konsolenanwendung? Normalerweise sollte es da mit dem ANSI-Zeichensatz keine Probleme geben. Das einzige, was Umlaute nicht unterstützt ist die IDE, bzw. der Compiler. Bei einem Stringliteral "Möller" wird daher der Umlaut falsch umgesetzt. Sollte das nicht das Problem sein, dass du in deinem Testcode Umlaute in Stringliteralen verwendet hast, solltest du mal eine Minimalversion des Codes posten, sonst ist der Fehler schwer nachvollziehbar.



  • Hmpf... Die DOS-Zeichentabelle unterscheidet sich halt etwas von der normalen. Hier eine kleine Übersetzung von DOS bzw. der Konsole nach ANSI...

    ä = „
    ö = ”
    ü = [nicht darstellbar]
    
    Ä = Ž
    Ö = ™
    Ü = š
    
    ß = á
    

    Man nehme also - in einem "normalen" ANSI Editor - den Zeichencode, stelle eine 0 davor und erhält das "Konsolen-Zeichn" dafür.



  • Wieso hmpf?

    Wenn er eine Datenbankanwendung hat, dann ist es ja unwahrscheinlich, dass er die Suchnamen als Stringliterale hardgecodet hat. Sofern er mit cin einliest und mit cout ausgibt, kommen diese Codierungsfehler ja nicht vor und alles sollte funktionieren.



  • //UP  für das Durchsuchen der Kunden
    void search(char vglvariable[30], char umenue[10], char ausgabe);
    
    void main()
    {
    char title[30]="Datenbankmanager Version 1.2";
    
    		SetConsoleTitle(title);
    
    int a=0;
    	char menue[10], umenue[10];
    	char stop;
    	char ausgabe;
    
    struct Datenbank
    {
    	char plz[10],
    		ort[30],
    		nr[5],
    		anrede[15],
    		nachn[30],
    		vorn[25],
    		gebdat[20],
    		strasse[30],
    		strassennr[10],
    		tel[20],
    		buero[20],
    		mobil[20],
    		typ[2],
    		mark[5];
    
    } daten;
    
    char vglvariable[30];
    char geschl;
    
    FILE *datei;		//Für Kundendatenbank
    FILE *datei_neu;		//Für die Druckversion der Suche
    
    datei_neu=fopen("Gesuchte_Daten.doc", "w");
    datei=fopen("Kundendaten.txt", "rb");
    
    printf("\n\n\t* Aenderungen an den Kundendaten vornehmen	(Wahl: aendern)");
    printf("\n\t* Kundensuche durchfuehren \t\t\t(Wahl: suche)");
    
    ///////Einlesen
    printf("\n\nEingabe:");
    scanf("%s", &menue);
    
    if(strcmpi(menue, "suche")==0)
    {
    	printf("\n\nKunden suchen nach:");
    	printf("\n\n\t\t+ Geschlecht -maennlich, -weiblich(Wahl: anrede)");
    	printf("\n\t\t+ Vor- oder Nachname (Wahl: name)");
    	printf("\n\t\t+ Ort (Wahl: ort)");
    	printf("\n\t\t+ Postleitzahl (Wahl: plz)");
    
    	//Einlesen
    
    	printf("\n\nEingabe: ");
    	scanf("%s", &umenue);
    	if(strcmpi(umenue, "name")==0)
    	{
    		i=0;
    
    		printf("Geben Sie den Namen der Kunden ein die angezeigt werden sollen"
    			"\nZum Beenden der Eingabe statt Namen 2 Bindestriche eingeben");
    
    		fprintf(datei_neu, "\n\t\tNAME ");
    
    vglname:
    		do
    		{
    			i++;
    			printf("\n\n\t%i. Name: ", i);			//Namen einlesen
    			scanf("%s", &vglvariable);
    
    			if(strcmp(vglvariable, "--")!=0)
    				fprintf(datei_neu, "%s, ", vglvariable);
    
    			search(vglvariable, umenue, ausgabe);
    
    		}while(strcmp(vglvariable, "--")!=0);			//Zum Beendigen
    
    			if(strcmp(vglvariable, "--")==0)			//Sicherheitsabfrage
    			{
    				do
    				{
    
    				printf("\n\nWollen Sie die Suche wirklich anhalten? (j/n)");
    				stop=getch();
    				if(stop=='j')
    					printf("\n\n\nKundenliste wurde durchsucht. Datei erfolgreich angelegt\n\n");
    
    				if(stop=='n')
    					goto vglname;							//Falls nicht beendet werden möchte=goto(Geht wieder weiter)
    
    				if((stop!='j')&&(stop!='n'))
    					printf("\n\nFEHLER! Erneute Eingabe:");
    
    				}while((stop!='j')&&(stop!='n'));
    
    				do
    				{
    
    				printf("Wollen Sie noch weitere Kunden nach anderen Daten suchen? (j/n):");
    				stop=getch();
    
    				if(stop=='n')
    					printf("\n\nDatei erfolgreich als Worddokument gespeichert. \n\n");
    
    				if(stop=='j')
    					goto suchestart;
    
    				}while((stop!='j')&&(stop!='n'));
    
    			}
    
    	}
    
    void search(char vglvariable[30], char umenue[10], char ausgabe)
    {
    
    	char err;
    
    FILE *datei;
    FILE *datei_neu;
    
    datei_neu=fopen("Gesuchte_Daten.doc", "a");
    datei=fopen("Kundendaten.dbf", "rb");
    
    if(datei==NULL)
    {
    	printf("\n\nFEHLER!\n\a\a\aKundendatenbank konnte nicht ge");
    	oe();
    	printf("ffnet werden!\n\n\n\n\n");
    	getchar();
    	if(datei_neu!=NULL)
    		exit(1);
    }
    if(datei_neu==NULL)
    {
    	printf("\n\nFEHLER!\n\a\a\aSuche wurde abgebrochen,\n da es nicht m");
    	oe();
    	printf("glich ist Druckversion anzulegen!\n\nM");
    	oe();
    	printf("glicherweise ist dieses Dokument gerade ge");
    	oe();
    	printf("ffnet,\noder sie haben kein Schreibrecht in jenem Verzeichnis!\n\n");
    	printf("Bitte wenden Sie sich an den Administrator!\n\n");
    	printf("Soll das Programm NICHT geschlossen werden\nund die Suche nur im DOS-Fenster angezeigt werden? (j/n):");
    	scanf("%c", &err);
    	if(err=='n')
    	{
    	getchar();
    	exit(1);
    	}
    	getchar();
    }
    struct Datenbank
    {
    	char plz[10],
    		ort[30],
    		nr[5],
    		anrede[15],
    		nachn[30],
    		vorn[25],
    		gebdat[20],
    		strasse[30],
    		strassennr[10],
    		tel[20],
    		buero[20],
    		mobil[20],
    		typ[2],
    		mark[5];
    
    } daten;
    
    	int right=1;
    	int n=1, a=0;
    
    	fseek(datei, 0, 0);
    
    while(fread(&daten, sizeof(daten), 1, datei))
    {
    
    right=1;
    
    	fflush(stdin);
    	fflush(stdin);
    	//printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", daten.plz, daten.ort, daten.nr, daten.anrede, daten.nachn, daten.vorn, daten.gebdat, daten.strasse, daten.strassennr, daten.tel, daten.mobil, daten.typ, daten.mark);
    
    	if(strcmpi(umenue, "plz")==0)
    		right=strcmpi(vglvariable, daten.plz);
    
    	if(strcmpi(umenue, "ort")==0)
    		right=strcmpi(vglvariable, daten.ort);
    
    	if(strcmpi(umenue, "nr")==0)
    		right=strcmpi(vglvariable, daten.nr);
    
    	if(strcmpi(umenue, "anrede")==0)
    		right=strcmpi(vglvariable, daten.anrede);
    
    	if(strcmpi(umenue, "name")==0)
    	{
    		right=strcmpi(vglvariable, daten.vorn);
    			if(right!=0)
    				right=strcmpi(vglvariable, daten.nachn);
    	}
    
    	if(strcmpi(umenue, "day")==0)
    		if((daten.gebdat[0]==vglvariable[0])&&(daten.gebdat[1]==vglvariable[1]))
    			right=0;
    
    	if(strcmpi(umenue, "month")==0)
    		if((daten.gebdat[3]==vglvariable[0])&&(daten.gebdat[4]==vglvariable[1]))
    			right=0;
    
    	if(strcmpi(umenue, "year")==0)
    		if((daten.gebdat[6]==vglvariable[0])&&(daten.gebdat[7]==vglvariable[1]))
    			right=0;
    
    	if(strcmpi(umenue, "strasse")==0)
    		right=strcmpi(vglvariable, daten.strasse);
    
    	if(strcmpi(umenue, "telprivat")==0)
    	{
    		n=0;
    		while(daten.tel[n]!='/')
    		{
    
    			if(vglvariable[n]==daten.tel[n])
    				right=0;
    			else
    			{
    				right=1;
    				break;
    			}
    			n++;
    
    		}
    	}
    
    	if(strcmpi(umenue, "telmobil")==0)
    	{
    		n=0;
    		while(daten.tel[n]!='/')
    		{
    
    			if(vglvariable[n]==daten.mobil[n])
    				right=0;
    			else
    			{
    				right=1;
    				break;
    			}
    			n++;
    
    		}
    	}
    
    	if(strcmpi(umenue, "telbuero")==0)
    	{
    		n=0;
    		while(daten.tel[n]!='/')
    		{
    
    			if(vglvariable[n]==daten.buero[n])
    				right=0;
    			else
    			{
    				right=1;
    				break;
    			}
    			n++;
    
    		}
    	}
    
    	if(strcmpi(umenue, "klasse")==0)
    		right=strcmpi(vglvariable, daten.typ);
    
    	if(strcmpi(umenue, "mark")==0)
    		right=strcmpi(vglvariable, daten.mark);
    
    	if(right==0)
    	{
    		fprintf(datei_neu, "\n________________________________________________________________________________\n");
    		fprintf(datei_neu, "\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", daten.nr, daten.anrede, daten.nachn, daten.vorn, daten.gebdat, daten.plz, daten.ort, daten.strasse, daten.strassennr, daten.tel, daten.mobil, daten.typ, daten.mark);
    
    		if(ausgabe=='j')
    			printf("\nKunde gefunden:\n\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", daten.nr, daten.anrede, daten.nachn, daten.vorn, daten.gebdat, daten.plz, daten.ort, daten.strasse, daten.strassennr, daten.tel, daten.mobil, daten.typ, daten.mark);
    
    	}
    }
    }
    

    Weiß nicht ob ihr damit was anfangen könnt.
    Habs möglicherweise etwas kompliziert verwirklicht aber na ja.

    Wo soll ich eine 0 davorstellen? Bei der Eingabe?

    Vielen Dank für eure freundlichen Antworten!

    mfg
    zoetti1



  • Uff, das ist in der Tat recht "umständlich" programmiert. Ich konnte den Code dummerweise nicht kompilieren, da i nicht definiert wurde und geschweifte Klammern fehlen. Ich habe auch nicht die nötige Motivation, deinen gesamten Quelltext durchzuarbeiten. Was genau ist denn dein Problem? Du bekommst keine Datensätze angezeigt, wenn du nach "Möller" suchst obwohl ein "Möller" in der Datenbank vorhanden ist? Kannst du den Quelltext vielleicht nochmal reparieren?

    -Wenn du eine rohe Textdatei mit der Endung doc speicherst, kannst du es zwar in Word öffnen, es ist trotzdem noch kein Worddokument 😉
    -Sprunganweisungen(goto) sollte man in der Form, wie du es gemacht hast, nicht mehr benutzen.
    -Dein Quelltext ist C. Solltest du wirklich vorhaben, in C++ zu programmieren, so gibt es für dich viele nützliche Dinge, die du nutzen könntest, um deinen Quelltext zu vereinfachen (Stringklasse, etc). Solltest du versehentlich im C++-Forum gelandet sein, kannst du den Beitrag verschieben lassen 😉
    -Ein definiertes struct ist wie ein Datentyp nutzbar. Das musst du also nicht jedes mal tun.

    struct Datensatz {
        int test;
    };
    
    Datensatz daten1;
    [...]
    Datensatz daten2;
    

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39326.html



  • ich geh in eine htl und lerne dort angeblich c++

    doch bis jetzt haben wir nur cin, cout, gelernt das es in c++ gibt.

    Ich hab zwar ein C++ Buch, aber ich finde mich darin nicht so sehr zurecht.

    was meinst du mit reparieren?

    danke für die antworten

    zoetti1



  • Naja, wahrscheinlich werden sie die C++-spezifischen Angelegenheiten dann mit der objektorientierten Programmierung einführen. Das mit dem "reparieren" hat sich erledigt, ich hab die Stelle schon gefunden, wo die beiden fehlenden Klammern hingehörten. Was genau ist denn nun der Fehler? Diese Möller-Angelegenheit? Zu den Umlauten in den Stringliteralen hab ich den Link ja schon gepostet. Das mit einzelnen Funktionen zu machen, ist etwas ungewöhnlich. Am einfachsten nachzuvollziehen wäre der Fehler ja, wenn du eine komplett lauffähige Version deines Quelltextest postest/hochlädst.


Anmelden zum Antworten