Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » brauch Hilfe/Tipp

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.04.2009, 12:58 Uhr
~der-sibbi
Gast


Hey,

nehmen in der Schule gerade Strukturen durch. Sollen jetzt ein Adressbuch schreiben. Klappt meiner Meinung auch soweit ganz gut. Nur wenn ich mir Einträge anzeigen lassen möchte, kommen immer so komische Zeichen. Man erkennt dazwischen aber die gewollten Daten.

Was hab ich falsch gemacht? Hoffe ihr könnt mir helfen. - Im vorraus schonmal danke.

Hier der Code


C++:
// Adressbuch.cpp: Hauptprojektdatei.

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"

using namespace System;

struct adressbuch
    {
        char vorname[20];
        char nachname[20];
        char ort[20];
        char plz[5];
        char strasse[30];
        char bundesland[30];
        char land[30];
        char vorwahl[6];
        char telnr[10];
        char vorwahl_handy[6];
        char handynr[10];
        char bday[10];
        char hausnummer[3];
    };

    int index;

    void structload(adressbuch*);
    void newitems(adressbuch*);
    void showall(adressbuch[]);
    void structsave(adressbuch[]);

int main(array<System::String ^> ^args)
{
    adressbuch eintrag[100];
    index = 0;
    for(int i=0;i<100;i++)
    {
        strcpy(eintrag[i].vorname,"\0");
        strcpy(eintrag[i].nachname,"\0");
        strcpy(eintrag[i].bday,"\0");
        strcpy(eintrag[i].strasse,"\0");
        strcpy(eintrag[i].hausnummer,"\0");
        strcpy(eintrag[1].plz,"\0");
        strcpy(eintrag[i].ort,"\0");
        strcpy(eintrag[i].bundesland,"\0");
        strcpy(eintrag[i].land,"\0");
        strcpy(eintrag[i].vorwahl,"\0");
        strcpy(eintrag[i].telnr,"\0");
        strcpy(eintrag[i].vorwahl_handy,"\0");
        strcpy(eintrag[i].handynr,"\0");
    }

    int ausw;
    do
    {
        system("cls");
        printf("Adressbuch \n\n");
            printf("1. Neuen Eintrag eingeben: \n");
            printf("2. Adressbuch speichern: \n");
            printf("3. Adressbuch laden: \n");
            printf("4. Adressbuch anzeigen: \n");
            printf("8. Programm beenden: \n\n");
        printf("Ihre Auswahl: --> ");

        scanf("%i",&ausw);
        switch(ausw)
        {
        case 1:
            newitems(eintrag);
        case 2:
            structsave(eintrag);
        case 3:
            structload(eintrag);
            break;
        case 4:
            showall(eintrag);
            break;
        case 8:
            break;
defrault:
            printf("Falsche Auswahl!! Bitte korrigieren!! \n");
            printf("Weiter mit beliebieger Taste...");
        }
    }
    while(ausw!=8);
    return 0;
}

void structload(adressbuch* test)
{
    FILE *fp1;
    char filename[30];

    int i;
    printf("\n\nBitte Dateiname angeben: --> ");
    scanf("%s",filename);
    fp1 = fopen(filename,"r");
    if(fp1!=NULL)
    {
        for(i=0;i<100;i++)
        {
            fscanf(fp1,"%s",&test[i].vorname);
            fscanf(fp1,"%s",&test[i].nachname);
            fscanf(fp1,"%s",&test[i].bday);
            fscanf(fp1,"%s",&test[i].strasse);
            fscanf(fp1,"%s",&test[i].hausnummer);
            fscanf(fp1,"%s",&test[i].plz);
            fscanf(fp1,"%s",&test[i].ort);
            fscanf(fp1,"%s",&test[i].bundesland);
            fscanf(fp1,"%s",&test[i].land);
            fscanf(fp1,"%s",&test[i].vorwahl);
            fscanf(fp1,"%s",&test[i].telnr);
            fscanf(fp1,"%s",&test[i].vorwahl_handy);
            fscanf(fp1,"%s",&test[i].handynr);
        }
        fscanf(fp1,"%i",&index);
        fclose(fp1);
        printf("Lesen erfolgreich Index = %i\n\n",index);
    }
    else
    {
        printf("Fehler beim Oeffnen von: %s\n\n",index);
    }
    printf("Weiter mit beliebiger Taste...");
    getch();
}
void structsave(adressbuch test[])
{
    FILE *fp1;
    char filename[30];
    int i;
    printf("\n\nBitte Dateinamen eingeben: --> ");
    scanf("%s",filename);
    fp1 = fopen(filename,"w");
    for(i=0;i<100;i++)
    {
        fprintf(fp1,"%s",test[i].vorname);
        fprintf(fp1,"%s",test[i].nachname);
        fprintf(fp1,"%s",test[i].bday);
        fprintf(fp1,"%s",test[i].strasse);
        fprintf(fp1,"%s",test[i].hausnummer);
        fprintf(fp1,"%s",test[i].plz);
        fprintf(fp1,"%s",test[i].ort);
        fprintf(fp1,"%s",test[i].bundesland);
        fprintf(fp1,"%s",test[i].land);
        fprintf(fp1,"%s",test[i].vorwahl);
        fprintf(fp1,"%s",test[i].telnr);
        fprintf(fp1,"%s",test[i].vorwahl_handy);
        fprintf(fp1,"%s",test[i].handynr);
    }
    fprintf(fp1,"%i",index);
    fclose(fp1);
    printf("Schreiben erfolgreich\n\n");
    printf("Weiter mit beliebiger Taste...");
    getch();
}

void newitems(adressbuch* test)
{
    int i, antw;
    char abbruch, zei;
    system("cls");
    for(i=index;i<100;i++)
    {
        index=i;
        printf("\nBitte Eintrag vornehmen fuer Position %i\n\n",i+1);
        printf("Bitte Vorname eingeben:");
        scanf("%s",&test[i].vorname);
        printf("Bitte Nachname eingeben:");
        scanf("%s",&test[i].nachname);
        printf("Bitte Geburtstag eingeben:");
        scanf("%s",&test[i].bday);
        printf("Bitte Strasse eingeben:");
        scanf("%s",&test[i].strasse);
        printf("Bitte Hausnummer eingeben:");
        scanf("%s",&test[i].hausnummer);
        printf("Bitte PLZ eingeben:");
        scanf("%s",&test[i].plz);
        printf("Bitte Ort eingeben:");
        scanf("%s",&test[i].ort);
        printf("Bitte Bundesland eingeben:");
        scanf("%s",&test[i].bundesland);
        printf("Bitte Land eingeben:");
        scanf("%s",&test[i].land);
        printf("Bitte Vorwahl eingeben:");
        scanf("%s",&test[i].vorwahl);
        printf("Bitte Telefonnummmer eingeben:");
        scanf("%s",&test[i].telnr);
        printf("Bitte Vorwahl der Handynummer eingeben:");
        scanf("%s",&test[i].vorwahl_handy);
        printf("Bitte Handynummer eingeben eingeben:");
        scanf("%s",&test[i].handynr);
        index++;
        do
        {
            printf("Wollen Sie noch einen Eintrag hinzufuegen?\n");
            printf("1=ja\n");
            printf("2=nein: ");
            scanf("%i",&antw);
            if(antw!=1&&antw!=2)
            {
                printf("Falsche Eingabe:\n");
            }
        }while(antw!=1&&antw!=2);
        if(antw==2)
        {
            break;
        }
    }
}

void showall(adressbuch test[])
{
    int i;
    system("cls");
    for(i=0;i<=index;i++)
    {
        printf("Eintrag-Nr.:    %i\n",i+1);
        printf("Name:            %s %s\n",test[i].vorname,test[i].nachname);
        printf("Geburtstag:        %s\n",test[i].bday);
        printf("Adresse:        %s %s",test[i].strasse,test[i].hausnummer);
        printf("                %s %s",test[i].plz,test[i].ort);
        printf("                %s %s",test[i].bundesland,test[i].land);
        printf("Telefon:        %s / %s\n",test[i].vorwahl,test[i].telnr);
        printf("Handy:            %s / %s\n",test[i].vorwahl_handy,test[i].handynr);
    }
    printf("\n\nWeiter mit Eingabetaste");
    getch();
}





Bearbeitung von Pler:

Code-Tags waren schon da. Habe aber den Tipfehler mal korrigiert.


Dieser Post wurde am 06.04.2009 um 13:33 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.04.2009, 13:25 Uhr
~f.-th.
Gast


Der Quelltext sieht bis auf einige entbehrliche Zeilen nach C aus.

Oder soll das tatsächlich C++ werden dann solltest du dir aber
die C++ Grundlagen noch mal genauer ansehen.

Aber nur überflogen da du keine cpp-Quellcode-Tags gesetzt hast.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.04.2009, 13:33 Uhr
~der-sibbi
Gast


Es soll C sein.

Ich wollt Tags setzten. Nur hab ich anstatt ein "]" ein "}" gemacht und konnte es nicht mehr ändern.

Hier noch mal richtig:


C++:
// Adressbuch.cpp: Hauptprojektdatei.

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"

using namespace System;

struct adressbuch
{
char vorname[20];
char nachname[20];
char ort[20];
char plz[5];
char strasse[30];
char bundesland[30];
char land[30];
char vorwahl[6];
char telnr[10];
char vorwahl_handy[6];
char handynr[10];
char bday[10];
char hausnummer[3];
};

int index;

void structload(adressbuch*);
void newitems(adressbuch*);
void showall(adressbuch[]);
void structsave(adressbuch[]);

int main(array<System::String ^> ^args)
{
adressbuch eintrag[100];
index = 0;
for(int i=0;i<100;i++)
{
strcpy(eintrag[i].vorname,"\0");
strcpy(eintrag[i].nachname,"\0");
strcpy(eintrag[i].bday,"\0");
strcpy(eintrag[i].strasse,"\0");
strcpy(eintrag[i].hausnummer,"\0");
strcpy(eintrag[1].plz,"\0");
strcpy(eintrag[i].ort,"\0");
strcpy(eintrag[i].bundesland,"\0");
strcpy(eintrag[i].land,"\0");
strcpy(eintrag[i].vorwahl,"\0");
strcpy(eintrag[i].telnr,"\0");
strcpy(eintrag[i].vorwahl_handy,"\0");
strcpy(eintrag[i].handynr,"\0");
}

int ausw;
do
{
system("cls");
printf("Adressbuch \n\n");
printf("1. Neuen Eintrag eingeben: \n");
printf("2. Adressbuch speichern: \n");
printf("3. Adressbuch laden: \n");
printf("4. Adressbuch anzeigen: \n");
printf("8. Programm beenden: \n\n");
printf("Ihre Auswahl: --> ");

scanf("%i",&ausw);
switch(ausw)
{
case 1:
newitems(eintrag);
case 2:
structsave(eintrag);
case 3:
structload(eintrag);
break;
case 4:
showall(eintrag);
break;
case 8:
break;
defrault:
printf("Falsche Auswahl!! Bitte korrigieren!! \n");
printf("Weiter mit beliebieger Taste...");
}
}
while(ausw!=8);
return 0;
}

void structload(adressbuch* test)
{
FILE *fp1;
char filename[30];

int i;
printf("\n\nBitte Dateiname angeben: --> ");
scanf("%s",filename);
fp1 = fopen(filename,"r");
if(fp1!=NULL)
{
for(i=0;i<100;i++)
{
fscanf(fp1,"%s",&test[i].vorname);
fscanf(fp1,"%s",&test[i].nachname);
fscanf(fp1,"%s",&test[i].bday);
fscanf(fp1,"%s",&test[i].strasse);
fscanf(fp1,"%s",&test[i].hausnummer);
fscanf(fp1,"%s",&test[i].plz);
fscanf(fp1,"%s",&test[i].ort);
fscanf(fp1,"%s",&test[i].bundesland);
fscanf(fp1,"%s",&test[i].land);
fscanf(fp1,"%s",&test[i].vorwahl);
fscanf(fp1,"%s",&test[i].telnr);
fscanf(fp1,"%s",&test[i].vorwahl_handy);
fscanf(fp1,"%s",&test[i].handynr);
}
fscanf(fp1,"%i",&index);
fclose(fp1);
printf("Lesen erfolgreich Index = %i\n\n",index);
}
else
{
printf("Fehler beim Oeffnen von: %s\n\n",index);
}
printf("Weiter mit beliebiger Taste...");
getch();
}
void structsave(adressbuch test[])
{
FILE *fp1;
char filename[30];
int i;
printf("\n\nBitte Dateinamen eingeben: --> ");
scanf("%s",filename);
fp1 = fopen(filename,"w");
for(i=0;i<100;i++)
{
fprintf(fp1,"%s",test[i].vorname);
fprintf(fp1,"%s",test[i].nachname);
fprintf(fp1,"%s",test[i].bday);
fprintf(fp1,"%s",test[i].strasse);
fprintf(fp1,"%s",test[i].hausnummer);
fprintf(fp1,"%s",test[i].plz);
fprintf(fp1,"%s",test[i].ort);
fprintf(fp1,"%s",test[i].bundesland);
fprintf(fp1,"%s",test[i].land);
fprintf(fp1,"%s",test[i].vorwahl);
fprintf(fp1,"%s",test[i].telnr);
fprintf(fp1,"%s",test[i].vorwahl_handy);
fprintf(fp1,"%s",test[i].handynr);
}
fprintf(fp1,"%i",index);
fclose(fp1);
printf("Schreiben erfolgreich\n\n");
printf("Weiter mit beliebiger Taste...");
getch();
}

void newitems(adressbuch* test)
{
int i, antw;
char abbruch, zei;
system("cls");
for(i=index;i<100;i++)
{
index=i;
printf("\nBitte Eintrag vornehmen fuer Position %i\n\n",i+1);
printf("Bitte Vorname eingeben:");
scanf("%s",&test[i].vorname);
printf("Bitte Nachname eingeben:");
scanf("%s",&test[i].nachname);
printf("Bitte Geburtstag eingeben:");
scanf("%s",&test[i].bday);
printf("Bitte Strasse eingeben:");
scanf("%s",&test[i].strasse);
printf("Bitte Hausnummer eingeben:");
scanf("%s",&test[i].hausnummer);
printf("Bitte PLZ eingeben:");
scanf("%s",&test[i].plz);
printf("Bitte Ort eingeben:");
scanf("%s",&test[i].ort);
printf("Bitte Bundesland eingeben:");
scanf("%s",&test[i].bundesland);
printf("Bitte Land eingeben:");
scanf("%s",&test[i].land);
printf("Bitte Vorwahl eingeben:");
scanf("%s",&test[i].vorwahl);
printf("Bitte Telefonnummmer eingeben:");
scanf("%s",&test[i].telnr);
printf("Bitte Vorwahl der Handynummer eingeben:");
scanf("%s",&test[i].vorwahl_handy);
printf("Bitte Handynummer eingeben eingeben:");
scanf("%s",&test[i].handynr);
index++;
do
{
printf("Wollen Sie noch einen Eintrag hinzufuegen?\n");
printf("1=ja\n");
printf("2=nein: ");
scanf("%i",&antw);
if(antw!=1&&antw!=2)
{
printf("Falsche Eingaben");
}
}while(antw!=1&&antw!=2);
if(antw==2)
{
break;
}
}
}

void showall(adressbuch test[])
{
int i;
system("cls");
for(i=0;i<=index;i++)
{
printf("Eintrag-Nr.: %i\n",i+1);
printf("Name: %s %s\n",test[i].vorname,test[i].nachname);
printf("Geburtstag: %s\n",test[i].bday);
printf("Adresse: %s %s",test[i].strasse,test[i].hausnummer);
printf(" %s %s",test[i].plz,test[i].ort);
printf(" %s %s",test[i].bundesland,test[i].land);
printf("Telefon: %s / %s\n",test[i].vorwahl,test[i].telnr);
printf("Handy: %s / %s\n",test[i].vorwahl_handy,test[i].handynr);
}
printf("\n\nWeiter mit Eingabetaste");
getch();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.04.2009, 13:45 Uhr
~f.-th.
Gast


Warum die Includes in Anführungszeichen?

Warum die Argumente so in der main-zeile?

using ... die Zeile brauchst du nicht in C sondern in C++

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.04.2009, 14:12 Uhr
~der-sibbi
Gast


Hmm. Habs einfach nur so gemacht, wie man es uns in der Schule erklärt hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.04.2009, 15:29 Uhr
0xdeadbeef
Gott
(Operator)


Das ist sogar noch schlimmer. Es ist C-Code, der auf einem C++/CLI-Compiler besteht. Darin findet sich

C++:
int main(array<System::String ^> ^args)


Mach daraus

C++:
int main(void)


und entferne das

C++:
using namespace System;


...dann haste wenigstens sinnvollen C-Code. Wer bringt euch solchen Unfug überhaupt bei?

Wie dem auch sei, meine Vermutung ist, dass das Einlesen der Daten böse daneben geht, weil das Schreiben der Daten böse daneben gegangen ist. Das hier:

C++:
fprintf(fp1,"%s",test[i].vorname);
fprintf(fp1,"%s",test[i].nachname);


schreibt Martin Müller als MartinMüller in die Datei (und alles, was danach kommt, ebenfalls ohne Trenner dahinter), und beim Einlesen wird dann alles auf einen Rutsch ausgelesen. Dementsprechend liegt der ganze Kram an völlig unerwarteten Stellen im Speicher, und große Teile der Stellen im Speicher, wo er liegen sollte, bleiben uninitialisiert. Du musst Leerzeichen zwischen die einzelnen Felder setzen:

C++:
fprintf(fp1, "%s ", test[i].vorname);
fprintf(fp1, "%s ", test[i].nachname);
/*              ^
                |
*/



--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.04.2009 um 15:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.04.2009, 17:12 Uhr
~der-sibbi
Gast


Hab alles so geaendert wie du es gesagt hat. Bringt aber trotzdem nichts.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.04.2009, 18:51 Uhr
0xdeadbeef
Gott
(Operator)


Dann ist da noch anderes Zeug kaputt. Schmeiß halt den Debugger an und kuck nach.

Ich kann den Code hier nicht kompilieren, ohne die ganzen CLI-, DOS- und C++-Artefakte rauszupfriemeln, und ich hab dazu ganz ehrlich gerade keinen Nerv. Dass du keine Whitespaces zwischen den Feldern in der Datei hast, ist jedenfalls ein Problem. Ansonsten sehe ich auf Anhieb noch, dass du in der Ausgaberoutine einen Eintrag zu weit läufst, und in der Einlese- und Ausgaberoutine jeweils 100 Einträge verarbeiten willst, auch wenn weit weniger in der Datei/im Array sind. Es wäre für das Einlesen wahrscheinlich sinnvoller, die Eintragsanzahl an den Anfang der Datei zu schreiben, damit du ihn gleich als Grenze verwenden kannst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.04.2009, 13:55 Uhr
~der-sibbi
Gast


Habe deine Tipps befolgt. Sieht jetzt auf jeden Fall besser aus. Nur noch immer nicht so wie man es sich wuenscht. Sieht jetzt so aus: http://f.imagehost.org/0688/adress.jpg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.04.2009, 14:44 Uhr
0xdeadbeef
Gott
(Operator)


Äh...du musst die Leerzeichen schon zwischen alle Felder setzen, nicht nur bei Vor- und Nachnamen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: