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.**


Anmelden zum Antworten