Daten aus einer Binärdatei auslesen + nach best. Gesichtspunkten sortieren



  • was soll das machen "}__attribute__ ((packed)); " ??

    Versuche es mal damit:

    struct Satz { 
      char Filiale[21]; 
      float Umsatz; 
      float Bestand; 
      float Beschaeftigte; 
      float Loehne; 
      unsigned short Quadratmeter; 
      float Anlagevermoegen; 
    } myRECORD[N];
    


  • das wollt er machen--> http://www.pronix.de/pronix-775.html
    ist aber nicht ansi c 😉



  • So, habe das jetzt als Array gemacht. Wie geb ich das jetzt aus? :|



  • In einer Schleife:

    for(i=0;i<N;++i)
    {
      printf("%s\n",myRecord[i].Filiale);
      ...
    }
    


  • Wusste ich's doch...! Danke trotzdem!
    Und wie sortiere ich das ganze jetzt?



  • Wieso stellst du eine bereits beantwortete Frage überhaupt nochmal? Zum Sortieren kannst du qsort() verwenden.

    (wenn du viel Langeweile hast, kannst du dich auch nach verschiedenen Sortieralgorithmen umsehen und diese implementieren)





  • Ich hatte das ganze ja schonmal hinbekommen - das Problem dabei war, dass ich die Datensätze irgendwie nicht korrekt mit übernommen habe.
    Und das Problem möchte ich eben gern meiden.

    Deswegen nochmal die Frage

    //EDIT:
    Oh ich glaub es funktioniert 😉
    Muss ich es nur noch umbasteln, dass das größte dann oben steht 🙂



  • voodoopuppe schrieb:

    Muss ich es nur noch umbasteln, dass das größte dann oben steht 🙂

    Und das dürfte auch nicht so schwer werden 😉 Du mußt in deiner Vergleichsfunktion nur die Rückgabewerte -1 und 1 vertauschen, dann hast du die umgekehrte Sortierung.



  • hab einfach > und < vertauscht, hat den selben Effekt 😉
    Andere Frage:
    Wie gebe ich die sortierten Daten aus dem Array jetzt noch über den Drucker aus?

    Kann ich das einfach so machen:
    [CPP]FILE* printer = fopen("LPT1","w");
    if(!printer)
    {
    printf("Drucker konnte nicht gefunden werden, bzw. ist nicht eingeschaltet.\n");
    return EXIT_FAILURE;
    }

    fputs(??Kommt hier einfach der Name der Funktion rein wo ich die Daten sortiert ausgebe??,printer);
    fputc('\f',printer);

    fclose(printer);

    return EXIT_SUCCESS;[/CPP]



  • voodoopuppe schrieb:

    hab einfach > und < vertauscht, hat den selben Effekt 😉

    klar, weil die umsätze alle 0 sind 😉



  • Du könntest deiner Ausgabefunktion einen zusätzlichen Parameter "FILE* fout" mitgeben und dort drin über fprintf() ausgeben (funktioniert genauso wie printf(), erhält aber als ersten Parameter die Zieldatei). Dann kannst du im Hauptprogramm entscheiden, wohin die Ausgabe gehen soll - print_data(...,stdout); gibt auf dem Monitor aus, print_data(...,printer); auf dem Drucker.



  • Versteh ich das also richtig, dass du meinst ich soll eine If-Abfrage einbauen, und die soll überprüfen ob fout printer oder stdout ist und wenn printer, dann soll einfach fprintf anstatt von printf genommen werden?

    Also quasi so:

    int Ausgabe(int OrdnenNach,FILE* fout)
    {
     if (fout == printer)
     {
      for(i=0;i<N;++i) 
      { 
        Arbeitseffektivitaet = (myRECORD[i].Umsatz/myRECORD[i].Beschaeftigte);
        Mitarbeiterlohn = (myRECORD[i].Loehne/myRECORD[i].Beschaeftigte);
        fprintf("Filiale:               %s\n",myRECORD[i].Filiale
        fprintf("Umsatz:                %f\n",myRECORD[i].Umsatz);
        fprintf("Bestand:               %f\n",myRECORD[i].Bestand);
        fprintf("Beschaeftigte:         %f\n",myRECORD[i].Beschaeftigte);
        fprintf("Loehne:                %f\n",myRECORD[i].Loehne);
        fprintf("Mitarbeiterlohn:       %f\n",Mitarbeiterlohn);
        fprintf("Arbeiteseffektivitaet: %f\n\n",Arbeitseffektivitaet);
        getch();
      }
      else
    { Ausgabeammonitor....}
      fclose(fh);
    }
    

    (stark gekürzte Variante)



  • Nein, du gibst fprintf() einfach mit auf den Weg, wohin es ausgeben soll:

    int Ausgabe(int OrdnenNach,FILE* fout)
    {
      for(i=0;i<N;++i) 
      { 
        Arbeitseffektivitaet = (myRECORD[i].Umsatz/myRECORD[i].Beschaeftigte);
        Mitarbeiterlohn = (myRECORD[i].Loehne/myRECORD[i].Beschaeftigte);
        fprintf(fout,"Filiale:               %s\n",myRECORD[i].Filiale);
        ...
      }
    }
    
    //Ausgabe auf Monitor:
    Ausgabe(3,stdout);
    
    //Ausgabe auf Drucker:
    FILE* printer = fopen("LPT1","w");
    Ausgabe(1,printer);
    
    //Speichern in Datei:
    FILE* datei = fopen("data.txt","w");
    Ausgabe(0,datei);
    


  • Das dumme ist eben das mit dem Drucker funktioniert so nicht..:(

    Ich selber hab keinen Drucker am LPT1 Anschluss, drucke via LAN und in der FH is es ja genauso 😢



  • Dann liegt das nicht an fprintf(), sondern an der Zielangabe für die Datei ("LPT1") - afaik sind solche Sonder-Dateinamen nicht standardisiert.


Anmelden zum Antworten