Daten aus einer Binärdatei auslesen + nach best. Gesichtspunkten sortieren
-
Habe es mal überarbeitet, cpp Tags verwendet + Code eingerückt, hoffe so ists iO.
Kannste mir sagen, wie ich das in nen Array gepackt bekomme?
Sorry, bin was C angeht echt...naja...;)
-
Eigentlich sind die Änderungen am Code minimal. Statt einfach nur eine Struktur anzulegen, legst du ein Array an:
struct Satz myRECORD[N]; // Ich nehme an N steht für die Zahl der Sätze in der Datei
Und beim Aufruf von fread() musst du eigentlich nur den 3. Parameter anpassen.
-
Seh ich das richtig, dass ich also
struct Satz{ char Filiale[21]; float Umsatz; float Bestand; float Beschaeftigte; float Loehne; unsigned short Quadratmeter; float Anlagevermoegen; }__attribute__ ((packed));
einfach nur in
struct Satz myRECORD[N]{ char Filiale[21]; float Umsatz; float Bestand; float Beschaeftigte; float Loehne; unsigned short Quadratmeter; float Anlagevermoegen; }__attribute__ ((packed));
ändern muss?
Wenn ich das habe - wie sortiere ich das ganze dann?
-
voodoopuppe schrieb:
Wenn ich das habe - wie sortiere ich das ganze dann?
mit 'qsort'.
so ungefährqsort (myRECORD, N, sizeof(struct Satz), sortfunction);
die sortfunktion sieht etwa so aus, wenn du nach umsatz sortieren willst
// nach oben kommt das kleinste int sortfunction (void *a, void *b) { struct Satz *r1 = (struct Satz*)a; struct Satz *r2 = (struct Satz*)b; // kleiner if (r1->Umsatz < r2->Umsatz) return -1; // grösser if (r1->Umsatz > r2->Umsatz) return 1; // beide gleich return 0; }
qsort gräbt dir das ganze array um
sollte dieses komplette umschaufeln ein (geschwindigkeits)problem werden, dann könnte man alternativ ein 'N'-elemente grosses array mit pointern auf die Sätze sortieren...
-
struct Satz myRECORD[N]{ char Filiale[21]; float Umsatz; float Bestand; float Beschaeftigte; float Loehne; unsigned short Quadratmeter; float Anlagevermoegen; }__attribute__ ((packed));
bringt mir folgendes:
main.c:9: error: syntax error before '{' token
main.c:17: error: syntax error before '}' token
main.c:17: warning: empty declaration
main.c: In functionsortfunction': main.c:26: error: dereferencing pointer to incomplete type main.c:26: error: dereferencing pointer to incomplete type main.c:29: error: dereferencing pointer to incomplete type main.c:29: error: dereferencing pointer to incomplete type main.c: In function
Ausgabe1':
main.c:37: error: storage size of 'myRECORD' isn't known
main.c:45: error: `Arbeitseffektivitaet' undeclared (first use in this function)
main.c:45: error: (Each undeclared identifier is reported only once
main.c:45: error: for each function it appears in.)main.c:46: error: `Mitarbeiterlohn' undeclared (first use in this function)
main.c: In function
main': main.c:106: error:
myRECORD' undeclared (first use in this function)
main.c:106: error: invalid application of `sizeof' to incomplete type `Satz'Was ist denn daran nun wieder falsch?
#include <stdio.h> //#include <stdlib.h> #include <conio.h> #define N 10 float Arbeitseffektivitaet; float Mitarbeiterlohn; struct Satz myRECORD[N]{ char Filiale[21]; float Umsatz; float Bestand; float Beschaeftigte; float Loehne; unsigned short Quadratmeter; float Anlagevermoegen; }__attribute__ ((packed)); // nach oben kommt das kleinste int sortfunction (void *a, void *b) { struct Satz *r1 = (struct Satz*)a; struct Satz *r2 = (struct Satz*)b; // kleiner if (r1->Umsatz < r2->Umsatz) return -1; // grösser if (r1->Umsatz > r2->Umsatz) return 1; // beide gleich return 0; } int main() { qsort (myRECORD, N, sizeof(struct Satz), sortfunction); getch(); return 0; }
Kann mir da keiner helfen?
Ich rall's irgendwie nich *heul*
-
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