Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » sortierte ausgabe

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.07.2004, 13:40 Uhr
~nullchecker
Gast


hallo. habe da ein problem. ich habe ein programm mit dem ich adressen verwalten soll. das funktioniert auch alles. was ich aber nicht hin bekomme ist eine sortierte ausgabe bzw ein modifizieren einzelner datensätze. bis jetzt kann ich immer nur die ganze textdatei auslesen bzw löschen.
hier mal das programm:

C++:
//*Adressverwaltung, Matthias Feiler,  Frank Stoye*//


#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ANZ 10
int gesamtanzahl=0, nr, pause;
unsigned int i;
//int  vergleiche(const void *pva , const void *pvb ); ||MLC||

//* Prototyp *//
struct Teilnehmer
{
    char vorname [30];
    char nachname [30];
    char strasse [35];
    int plz;
    char stadt [50];
    int matrikelnummer;
};
void leeren();
void anzahlderteilnehmer();
void eingabeEinesTeilnehmers( struct Teilnehmer *, unsigned );
void ausgabe(struct Teilnehmer * );
void speicherung(struct Teilnehmer * );
void dateiausgabe(struct Teilnehmer *);
void hinzufuegen(struct Teilnehmer * );


//Hauptprogramm
int main()
{
while (1)
  {
    system("cls");
    struct Teilnehmer teilnehmerfeld[ANZ];//Feld aller teilnehmer
    for (i=0; i<gesamtanzahl;i++)//fortlaufende felder
    unsigned int nr;
    printf(" \nDaten neu Anlegen        = 1");
    printf(" \nDaten aus Datei lesen    = 2");
    printf(" \nDaten aus Datei loeschen = 3");
    printf(" \nDaten hinzufuegen        = 4");  
    printf(" \nBeenden                  = 9");
    printf(" \nIhre Wahl? :  ");
    scanf ("%d", &nr);
      switch(nr)
      {
      case 1:
            system("cls");
            anzahlderteilnehmer();
            for (i=0; i<gesamtanzahl;i++)
            eingabeEinesTeilnehmers(teilnehmerfeld,i);
            speicherung(teilnehmerfeld);
            system("PAUSE");
    
       break;

      case 2:
            system("cls");
            dateiausgabe(teilnehmerfeld);
           system("PAUSE");
    
      break;              
      case 3:
            system("cls");
            leeren();
            system("PAUSE");
    
      break;
      case 4:
            system("cls");
            anzahlderteilnehmer();
            for (i=0; i<gesamtanzahl;i++)
            eingabeEinesTeilnehmers(teilnehmerfeld,i);
            hinzufuegen(teilnehmerfeld);
            system("PAUSE");
    
      break;
      }
      
    if(nr==9)
    break;
      
  }    

return 0;
}
    
//* Definition Teilnehmerfeld*//
    //ausgabe(teilnehmerfeld);

    
//******************************************************************************      
        

//anzahl der teilnehmer---------------------------------------------------------
void anzahlderteilnehmer()
{
  
    printf("\nGeben sie die Anzahl der Datensaetze an!<11\n");
    scanf("%ud" ,&gesamtanzahl);
              
         if (gesamtanzahl > ANZ)
              { gesamtanzahl=ANZ;
                printf("Ihre Eingabe wurde auf %d Datensaetze beschraenkt \n",ANZ);
              }
         if (gesamtanzahl==0)
              { printf("bitte Zahlenwert eingeben!!!\n");
                while(getchar()!='\n'){;}
                scanf("%d", &gesamtanzahl);
              }
}
//Eingabe-----------------------------------------------------------------------
void eingabeEinesTeilnehmers( struct Teilnehmer *feld, unsigned pos)
{
    printf("\nEingabe der Daten des %u. Teilnehmers:",pos+1);
    printf("\nGeben sie den Vornamen ein:           ");
    scanf("%s",&(feld[pos].vorname));
  
    printf("\nGeben sie den Nachnamen ein:          ");
    scanf("%s",&(feld[pos].nachname));
    printf("\nGeben sie die Strasse und die Hausnummer ein:          ");
    scanf("%s", &(feld[pos].strasse));
    printf("\nGeben sie die Postleitzahl ein:        ");
        
    if (scanf("%d", &(feld[pos].plz))==0)
    { printf("bitte Zahlenwert eingeben!!!\n");
      while(getchar()!='\n');
      scanf("%d",&(feld[pos].plz));
    }
    
    printf("\nGeben sie die Wohnort ein:              ");
    scanf("%s",&(feld[pos].stadt));
    printf("\nGeben sie Matrikelnummer ein:            ");
    
      if (scanf("%d", &(feld[pos].matrikelnummer))==0)
    { printf("bitte Zahlenwert eingeben!!!\n");
      while(getchar()!='\n');
      scanf("%d",&(feld[pos].matrikelnummer));
    }
      
    
}

//Ausgabe-----------------------------------------------------------------------
void ausgabe(struct Teilnehmer * feld)
{

    unsigned int i;
    
    printf("\n******************************************************************\a\n");    
    printf("\nDie neuen Datensaetze auf einen Blick..\n");
    for(i=0;i<gesamtanzahl;i++)
      
        printf("\%s     %s\tstrasse:%s\tplz:%d\tstadt:%s\tmatrikelnummer:%d\n",
                feld[i].vorname,
                feld[i].nachname,
                feld[i].strasse,
                feld[i].plz,
                feld[i].stadt,
                feld[i].matrikelnummer);
              
}
  
//Speicherung-------------------------------------------------------------------
    void speicherung(struct Teilnehmer *feld)
    {
  
            unsigned int i;
            FILE *stream;
            stream = fopen("datei_txt","w");
            for (i=0;i<gesamtanzahl;i++)
            fprintf(stream,"\%s     %s\tstrasse:%s\tplz:%d\tstadt:%s\tmatrikelnummer:%d\n",
                feld[i].vorname,
                feld[i].nachname,
                feld[i].strasse,
                feld[i].plz,
                feld[i].stadt,
                feld[i].matrikelnummer);
              
            fclose(stream);
    }

//Hinzufuegen von daten in die bereits bestehende datei-------------------------
void hinzufuegen (struct Teilnehmer * feld)
    {
  
            unsigned int i;
            FILE *stream;
            stream = fopen("datei_txt","a");
            for (i=0;i<gesamtanzahl;i++)
            fprintf(stream,"\%s     %s\tstrasse:%s\tplz:%d\tstadt:%s\tmatrikelnummer:%d\n",
                feld[i].vorname,
                feld[i].nachname,
                feld[i].strasse,
                feld[i].plz,
                feld[i].stadt,
                feld[i].matrikelnummer);
              
            fclose(stream);
    }


//Einlesen und Ausgabe der abgespeicherten Daten--------------------------------
    void dateiausgabe(Teilnehmer * feld)
    {
        FILE *stream;
        char ch;
        printf("****************************************************************");
        printf("\nNun folgen die Ausgelesenen Daten von datei.txt: \n\n\n");
                    if ((stream = fopen("datei_txt","r"))==0 )//Sicherheitsanweisung
                      {
                      printf("\n\nFehler beim oeffnen!!!!");
                      exit(1);
                      }
        
        stream = fopen("datei_txt","r");    
        ch=fgetc(stream);
        do
                {
                 ch = fgetc(stream);            //jeder einzellne wert wird gelesen

//Ausgabe der eingelesenen Daten------------------------------------------------
                 putchar(ch);                
                }
        while(ch !=EOF);
        fclose(stream);
    }
//loeschen von datei.txt--------------------------------------------------------
void leeren()
{
      int loeschen;
      printf("\nwirklich????\n");
      printf("\n j zum Vortfahren, n zum Abrechen: ");
      scanf ("%S",&loeschen);
      switch (loeschen)
             {
             case 'j':
             FILE *stream;
             stream = fopen("datei_txt","w");
             break;
             }    

}



Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Machs nächstes mal selbst.


Dieser Post wurde am 06.07.2004 um 13:43 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2004, 13:47 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


sortieren kannst du z.b. mit qsort... über die suche findest du beispiele dazu...

wenn du die ausgabe sortieren willst wenn du aus der datei einliest musst du dir erst in ein feld einlesen um dieses dann zu sortieren und dann auszugeben...
einlesen entweder mit fgets und dann jede zeiel mit strtok oder sscanf durchparsen...
oder du machst es analog zu dem fprintf und verwendest fscanf...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2004, 15:59 Uhr
~nullchecker
Gast


kannst du mir ein beispiel geben wie ich die daten wieder in ein feld zurück bekomme aus der text datei?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2004, 16:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ja

genau umgekehrt zu dem wie du es in die datei geschrieben hast...
übrigens würd ich dir beim in die datei schreiben nicht empfehlen immer strasse stadt plz use dazu zu schreiben... wenn du das unbedingt dazu haben willst schreib das in die erste zeile als spaltenüberschrift, das erleichtert das leben ungemein

ungetestet so ins Forum gehackt

C++:
FILE *stream;
stream = fopen("datei_txt","r");
while(!feof(stream){
fscanf(stream,"\%s     %s\tstrasse:%s\tplz:%d\tstadt:%s\tmatrikelnummer:%d\n",
                feld[ i ].vorname,
                feld[ i ].nachname,
                feld[ i ].strasse,
                &feld[ i ].plz,
                feld[ i ].stadt,
                &feld[ i ].matrikelnummer);
}
fclose(stream);



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2004, 17:47 Uhr
~nullchecker
Gast


irgendwie will das nicht funktionieren. den gedanken hatte ich auch schon aber das funktioniert nicht so richtig
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.07.2004, 18:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wahrscheinlich sind da irgendwelche leerzeichen drin die er nicht mag...
schreib mal in die datei nur die werte (also ohne strasse ort usw..) und probier mal dann einzulesen... dann funzt das bestimmt auch
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.07.2004, 21:23 Uhr
~nullchecker
Gast


also ich weiss nicht mehr was ich noch machen soll. das programm muss noch heute fertig werden und ich versuche jetzt seit drei stunden das gleiche ihne erfolg. also: ich weiss wie ich die gesamte datei auslese. kein problem. aber ich bekomme sie nicht so ausgelesen wie ich das gerne hätte. mit fscanf funktioniert das schonmal nicht, zumindest nicht bei mir. da ich die werte nicht wieder hin bekomme kann ich auch nicht die sortierung schreiben. gebt mir bitte noch einen denkanstoss.
danke im voraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.07.2004, 22:01 Uhr
(un)wissender
Niveauwart


Also wenn di die ganze Datei auslesen kannst ist doch alles getan.
Dann noch parsen und fertig.
Einfacher wäre es allerdings so wie Windalf mit scanf vorgeschlagen hat.


Zitat:

[...]aber ich bekomme sie nicht so ausgelesen wie ich das gerne hätte. [...]



Wir haben keine Glaskugel, wie hättest du es den gerne?
Vermutlich ist das Problem bei deinem Programm, dass du dich nicht klar ausdrückst.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 06.07.2004 um 22:01 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.07.2004, 22:15 Uhr
~nullchecker
Gast


was ist durchparsen???
ich habe die daten wie folgt gespeichert.

C++:
//Speicherung-------------------------------------------------------------------
    void speicherung(struct Teilnehmer *feld)
    {
  
            unsigned int i;
            FILE *stream;
            stream = fopen("datei_txt","w");
            for (i=0;i<gesamtanzahl;i++)
            fprintf(stream,"\%s     %s\tstrasse:%s\tplz:%d\tstadt:%s\tmatrikelnummer:%d\n",
                feld[ i ].vorname,
                feld[ i ].nachname,
                feld[ i ].strasse,
                feld[ i ].plz,
                feld[ i ].stadt,
                feld[ i ].matrikelnummer);




dann muss ich die daten wieder auslesen um sie zu sortieren. ich habe die komplette datei mit getchar ausgelesen, dann habe ich aber die struktur verloren.

danch habe ich es mit der lösung von windalf versucht, es aber nicht geschafft. wenn ich nur die funktion von windalf eingebe erscheint logischerweise auch nichts auf dem bildschirm da ich ja nur einlese. das problem ist das das dann mit einer printf anweisung zwar auf dem bildschirm erscheint, aber wenn ich das programm neu starte alles wieder weg ist.


Bearbeitung von Pablo:

Benutze die CPP Tags


Dieser Post wurde am 06.07.2004 um 22:16 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.07.2004, 22:17 Uhr
~nullchecker
Gast


gibt es einen befehl um zu sehen was durch fscanf in den zwischenspeicher geholt worden ist zu betrachten?
 
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: