Zahlenwert aus Tabelle
-
Hallo. meine aufgabe ist es die zahlenwerte (objektwert) aus einer tabelle (unten) auszulesen und den prozentualen unterschied zum vorgängerwert aufzustellen (als zusätzliche spalte in der tabelle) Ich habe mir ein programm geschrieben welches bis jetzt so aussieht:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define ZEILENLAENGE 200 int main (int argc, const char * argv[]) { // Dateiname muss noch geändert werden!!! // Sascha Grunert, Matrikelnummer: 29082, Seminargruppe: 09/023/01, Gruppe: B FILE *eDatei,*aDatei; char zeile[ZEILENLAENGE]; // Entspricht einem Puffer eDatei = fopen("K_29082B.PWX", "r"); aDatei = fopen("Ausgabe.PWX", "w"); //Dateiname muss noch angepasst werden! if (eDatei != NULL) { fgets(zeile, ZEILENLAENGE, eDatei); //Zwischenspeicherung der ersten Zeile im Puffer "zeile" fputs(zeile, aDatei); // Übertragung des Puffers "zeile" in die Ausgabedatei fprintf(aDatei, "\nSascha Grunert, Matrikelnummer: 29082, Seminargruppe: 09/023/01, Gruppe: B\n"); // While Schleife schreibt über den Puffer "zeile" die Daten von der Eingabedatei in die Ausgabedatei while (fgets(zeile, ZEILENLAENGE, eDatei)) { //strcat(zeile,"Test\t"); fputs(zeile, aDatei); /*...*/ } /*...*/ fclose(aDatei); fclose(eDatei); printf("\n\nSuccess!"); } else { printf("\n\nDatei kann nicht gelesen werden! (evtl. nicht vorhanden)\n\n"); } //system("PAUSE"); // unter Windose return 0; }
Jetzt habe ich der übersichtshalber ein zweites programm geschrieben welches einen string der tabelle zerlegt und mir meinen gewünschten wert an ein array übergibt:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char string[] = "01-10-99 00:00:00\t3760.000\t0"; int i=1,a=0; char *ptr; float wert[500]; ptr = strtok(string, "\n\t "); while(ptr != NULL) { i++; ptr = strtok(NULL, "\n\t "); if (i==3) { wert[a] = atof(ptr); printf("wert[%d] = %.2f",a,wert[a]); a++; } } return EXIT_SUCCESS; }
das problem ist jetzt ich krieg das 2. programm nicht indas 1. implementiert -.- bitte um hilfe
Hier die einzulesende datei:
Bronschofen Summe Bezug PERIOD.-WERTE: E_BRTSB_ REGISTRIERZEIT OBJEKTWERT STATUS 01-10-99 00:00:00 3760.000 0 01-10-99 00:15:00 3440.000 0 01-10-99 00:30:00 3520.000 0 01-10-99 00:45:00 3440.000 0 01-10-99 01:00:00 3280.000 0 01-10-99 01:15:00 3280.000 0 01-10-99 01:30:00 3280.000 0 01-10-99 01:45:00 3120.000 0 01-10-99 02:00:00 2960.000 0 01-10-99 02:15:00 3280.000 0 01-10-99 02:30:00 3440.000 0 01-10-99 02:45:00 3280.000 0 01-10-99 03:00:00 3200.000 0 01-10-99 03:15:00 3440.000 0 01-10-99 03:30:00 3280.000 0 01-10-99 03:45:00 3120.000 0 01-10-99 04:00:00 3120.000 0 01-10-99 04:15:00 3040.000 0 01-10-99 04:30:00 3040.000 0 01-10-99 04:45:00 3120.000 0 01-10-99 05:00:00 3280.000 0 01-10-99 05:15:00 4240.000 0
-
Hallo,
DeepInside schrieb:
das problem ist jetzt ich krieg das 2. programm nicht indas 1. implementiert -.- bitte um hilfe
es gibt mehrere Möglichkeiten das zu lösen.
Hier ein Ansatz, wie das aussehen kann:#define LINEBUF 512 void skip_lines ( FILE* fp, unsigned n ) { int c; while ( n && ( c = fgetc(fp) ) != EOF ) if ( c == '\n' ) n--; } char* rewrite_line ( char* file_line ) { char rewritten_line [LINEBUF]; printf ( "%s", file_line ); // Dummyzeile // Hier deine Zeile parsen, etc. und neu ausgeben oder in rewritten_line // speichern und zurückgeben. return rewritten_line; } int main ( int argc, char *argv[] ) { char buf[LINEBUF] = {0}; char* fname = "test.txt"; FILE* fp = fopen ( fname, "r" ); if ( fp == NULL ) { printf ( "Can't open %s\n", fname ); return 0; } skip_lines ( fp, 3 ); while ( fgets ( buf, sizeof ( buf ), fp ) ) { rewrite_line ( buf ); } fclose (fp); return 0; }
Das Hauptprogramm liest bis zum Dateiende zeilenweise ein und übergibt die Zeilen an die Funktion rewrite_line.
In der Funktion rewrite_line kannst du die Zeilen parsen, die Werte berechnen und ausgeben, oder je nach Bedarf in einen zweiten Puffer kopieren.
Prinzipiell würde also die Funktion rewrite_line das tun, was dein erstes Programm macht.
Gruß,
B.B.
-
Du kannst auch die Werte auch direkt mit fscanf aus den Zeilen saugen, das erspart dir das strtok Gefriemel:
int main() { int tag, monat, jahr, stunde, minute, sekunde, status, n; double objektwert; char* fname = "test.txt"; FILE* fp = fopen ( fname, "r" ); if ( fp == NULL ) { printf ( "Can't open %s\n", fname ); return 0; } while ( !feof(fp) ) { n = fscanf( fp, "%d-%d-%d %d:%d:%d\t%lf\t%d", &tag, &monat, &jahr, &stunde, &minute, &sekunde, &objektwert, &status ); if ( n == 8 ) printf( "%d-%d-%d %d:%d:%d\t%lf\t%d\n", tag, monat, jahr, stunde, minute, sekunde, objektwert, status ); else skip_lines ( fp, 1 ); } fclose (fp ); return 0; }
-
Vielen Dank schonmal das hat mir echt geholfen
ich habe jetz mal dein code mit mienem gemischt und bis jetzt sieht es erstmal so aus: (ich habe das token gefriemel
mal ausgeklammert.)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define PUFFER 512 void zeilensprung(FILE *eDatei, unsigned n); char *schreibeNeueZeile(char *zeile); int main (int argc, const char * argv[]) { // Dateiname muss noch geändert werden!!! // Sascha Grunert, Matrikelnummer: 29082, Seminargruppe: 09/023/01, Gruppe: B int tag, monat, jahr, stunde, minute, sekunde, status, n; double objektwert; FILE *eDatei,*aDatei; char *eDateiname = "K_29082B.PWX", *aDateiname = "Ausgabe.PWX"; // Dateiname muss noch geändert werden!!! char puffer[PUFFER] = {0}; eDatei = fopen(eDateiname, "r"); aDatei = fopen(aDateiname, "w"); if (eDatei != NULL) { //Prüfung ob datei vorhanden ist fscanf(eDatei, "%85c", puffer); // Einlesen der ersten Zeile (max 85 Zeichen) in den puffer fprintf(aDatei, puffer); fprintf(aDatei, "Sascha Grunert, Matrikelnummer: 29082, Seminargruppe: 09/023/01, Gruppe: B\n\n"); fprintf(aDatei, "REGISTRIERZEIT\tOBJEKTWERT\tSTATUS\tPROZENT"); zeilensprung(eDatei,2); //2 Zeilen überspringen while (!feof(eDatei)) { n = fscanf(eDatei, "%d-%d-%d %d:%d:%d\t%lf\t%d", &tag, &monat, &jahr, &stunde, &minute, &sekunde, &objektwert, &status ); if ( n == 8 ) printf( "%d-%d-%d %d:%d:%d\t%lf\t%d\n", tag, monat, jahr, stunde, minute, sekunde, objektwert, status ); else zeilensprung(eDatei, 1); } while (fgets(puffer, sizeof(puffer), eDatei)) { schreibeNeueZeile(puffer); } } else { printf("Datei kann nicht geöffnet werden. (evtl. nicht vorhanden)"); return 0; } fclose(eDatei); fclose(aDatei); //system("PAUSE"); // unter Windose return 0; } void zeilensprung(FILE *eDatei, unsigned n) { int c; while (n && (c = fgetc(eDatei)) != EOF) { if (c=='\n') { n--; } } } char *schreibeNeueZeile(char *zeile) { char neueZeile[PUFFER]; // printf("%s",zeile); // Dummyzeile /* int i=1,a=0; char *ptr; float wert[3000]; // max. Datensatzanzahl ptr = strtok(zeile, "\n\t "); while(ptr != NULL) { i++; ptr = strtok(NULL, "\n\t "); if (i==3) { // Aller 3 token befindet sich der Messwert wert[a] = atof(ptr); printf("%.2f\n",wert[a]); a++; } } */ return neueZeile; }
Da benötige ich die funktion "schreibeneuezeile" jetzt gar nicht mehr oder?
da kann ich die berechnungen jeweils in der while schleife durchführen...vllt sollte ich die daten (stunde, minute, etc) in array speichern da ich bei der berechnung des prozentualen unterschieds jeweils den vorgänger im objektwert brauch.
-
so habe jetzt noch die ausgabe mit
%.2d
auf 2 stellen angepasst...an die berechnung mach ich mich morgen.
danke nochmal. hier die aufgabe falls es jemanden interessiert:
**Zur Ausgabedatei:
Der Name der Ausgabedatei beim Abspeichern ist ebenfalls entsprechend den Hinweisen in der Liesmich.doc zu bilden.
Die Ausgabedatei beginnt mit der 1.Zeile, die der Eingabedatei zu entnehmen ist. Nach einer Leerzeile ist als 3.Zeile die Kommentarzeile aus Ihrem Programm mit Name, Vorname usw. zu übernehmen.Mit Ihrem Programm sollen Sie für jede Messzeit die prozentuale Veränderung zum vorhergehenden Messwert ermitteln und in die Ausgabedatei schreiben. Für die 1.Messzeit am 1.Tag des Monats nehmen Sie 0% Veränderung an. Sie übernehmen also die 3 Felder aus der Eingabedatei und ergänzen ein 4.Feld mit dem Prozentwert (Trennzeichen \t) . Der Prozentwert sollte nur 1 Stelle nach dem Komma aufweisen. Nach jedem Tag fügen Sie einen Satz mit zusammengefassten Werten ein. Dieser Satz soll den minimalen (von 0 verschiedenen) und den maximalen Prozentwert des Tages enthalten. Zu beiden Prozentwerten ist die jeweilige Messzeit mit zu erfassen. Für jeden Tag ist also eine zusätzliche Zeile mit folgenden Aufbau zu erzeugen:
Datum Zeitmax Prozentmax Zeitmin Prozentmin
Als Trennzeichen zwischen den 5 Feldern ist der Tabulator \t zu verwenden.**