fscanf Problem


  • Mod

    Warum musst du die Werte dann überhaupt abspeichern, wenn dich doch nur immer der aufeinander folgende Werte interessieren?



  • Weil im Anschluss dann alle Werte in ein neues Textdokument übernommen werden, nur das halt eine weiter Spalte dazukommt, inder die prozentuale Veränderung steht.

    Ich geb zu, ich bin grade sehr verwirrt.



  • Dann reicht es doch aus, sich den vorletzten Wert zu merken.

    Pseudo-

    AlterWert = 0
    
    Solange noch Zeilen in der Datei sind
    |  Zeile einlesen, Wert ermitteln
    |  Abweichung zu AlterWert berechnen.
    |  Zeile und Abweichung ausgeben
    |  AlterWert = Wert
    

    Dann kannst du auch Dateien mit Millionen Zeilen bearbeiten, da du nur die aktuelle Zeile und den letzten Wert im Speicher hast.



  • Vielen Dank für deine Hilfe & die schnellen Antworten!
    Ich werd das dann gleich mal probieren.



  • FILE *f = fopen("bla.txt","r");
    if( f )
    {
      double wert3;
      char zeile[1000]; /* Zeilenpuffer */
      while( fgets(zeile,1000,f) )
        if( 1==sscanf(zeile,"%*s%*s%lf",&wert3) ) /* nur wenn 3. "Wort" vorhanden und als double interpretierbar ist */
          printf("%f\n",wert3);
      fclose(f);
    }
    


  • Die entscheidenden Fragen kamen doch von SeppJ.



  • Hi Community

    Im Moment seh ich grade absolut nicht mehr durch:

    Ich werd jezze nochmal ganz genau die Fähigkeiten des Programms erläutern und es wäre wirklich super wenn mir jemand einen guten Ansatz schreiben könnte. Mein Problem ist gerade das Ich mich mit den Variablen und Datentypen nicht anfreunden kann.

    Zu dem Textdokument:

    Goldach        Summe Bezug     PERIOD.-WERTE:E_GOTSB_                          
    
    REGISTRIERZEIT	OBJEKTWERT	STATUS
    01-02-01 00:00:00	18560.000	0
    01-02-01 00:15:00	18720.000	0
    01-02-01 00:30:00	18000.000	0
    01-02-01 00:45:00	17360.000	0
    01-02-01 01:00:00	16800.000	0
    01-02-01 01:15:00	17040.000	0
    01-02-01 01:30:00	16640.000	0
    01-02-01 01:45:00	17440.000	0
    ...                     ...             ...
    

    Es sind ungefähr 3000 weitere Einträge im Dokument.

    Ziel des Programms soll sein, dass die ersten 3 Zeilen in ein neues Textdokument einfach übernommen werten.
    Desweiteren sollen alle einträge auch übernommen werten, aber es kommt eine weitere Spalte hinzu, inder die prozentuale Veränderung von Objektwert zu Objektwert steht (es wird eine prozentuale Veränderung von 0% zu Beginn angenommen).
    Und zu guter letzt soll nach jedem Tag der minimale und maximale Prozentwert des Tages in einem Kleinen Satz ausgegeben werden bzw. ebenfalls ins neue Textdokument geschrieben werden.

    Es soll nicht so klingen als ob Ihr jezze die Arbeit machen sollt, aber ich weiß grade echt nicht weiter. Ein Ansatz etc. in Form von Quellcode wäre für mich sehr hilfreich.

    Danke für eure Hilfe!


  • Mod

    tooony schrieb:

    Es soll nicht so klingen als ob Ihr jezze die Arbeit machen sollt, aber ich weiß grade echt nicht weiter. Ein Ansatz etc. in Form von Quellcode wäre für mich sehr hilfreich.

    Das heißt du hast aufgegeben und wartest nun auf eine Komplettlösung, von der du dir jetzt noch vormachst, dass du sie ganz gründlich durcharbeiten wirst, um daraus zu lernen, die dann aber voraussichtlich nur mal kurz überflogen, nicht verstanden und beim Chef/Lehrer als eigene Leistung abgegeben wird?



  • Nein das heißt es definitv nicht.
    Ich programmier seit Jahren Php, mysql usw....mich interessiert die Programmierung sehr. Und wir haben jetzt seit ein paar Wochen erst C/C++.



  • tooony schrieb:

    Ich programmier seit Jahren

    Dann stelle dich nicht so an und baue ein neues Programm auf Basis eines hier gemachten Vorschlages auf, zuerst nur mit den Dateioperationen, denn da scheinst du Verständnisprobleme zu haben.



  • Ich bins nochmal. Ich hab mich nochmal neu rangesetzt. Das Programm funktioniert soweit, vielleicht bisschen umständlich gelöst aber es funktioniert.Es fehlt nur noch das Schreiben in eine neue txt Datei. Aber daran sollte es nicht scheitern.
    Ein anderes kleines Problem bei der ausgabe vom maximalen prozentwert max und der dazugehörigen zeile mit datum zeit und wert macht mir zu schaffen. Bei der Ausgabe von zeile[merken_max] werden zuvor jedes mal ein haufen Nullen geschrieben:

    z.B.

    Maximum:
    000000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000002-02-01 23:00:00         16000.00      0     13.3
    

    Weiß jemand woran das liegt?

    Hier der Code:

    // P_31307B.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    void loeschen(char *zeile)
    {
       size_t p=strlen(zeile);
        // \n mit \0 überschreiben 
       zeile[p-1]='\0';
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	// Variabeln Menü
    	char input;
    	char programmauswahl[100];
    
    	printf("########## Analyse von Leistungsdaten ##########\n\n");
    	// Programmstart
    	// Datei oeffnen
    	do {
    
    	    printf("[T]extdatei lesen und auswerten, [B]eenden - Bitte auswaehlen\n\n");
    
    		// Menüauswahl
    		gets(programmauswahl);
    		input=programmauswahl[0];
    
    		// if T-d start
    		if(input=='T' || input=='t')
    		{
    			FILE *fp;
    			char datei[] = "C:\\Users\\Tony\\Desktop\\info_hausarbeit\\K_31307B.PWX";
    			fp=fopen(datei ,"r");
    			if(fp==NULL)
    			{				
    				printf("\n\nERROR: Datei konnte nicht geoeffnet werden!");
    				exit(-1);
    			}
    			std::cout << "\nDatei: " << datei << " - oeffnen erfolgreich" << std::endl;
    			printf("-------------------------------------------------------------------------------\n");
    
    			double leistung, leistungALT, prozent, max, min;
    			char zeile[1000];
    			int i,ijetzt,ispaeter, merken_max, merken_min;
    
    			leistungALT=0;
    			i=0;
    			max=0;
    			min=0;
    			merken_max=0;
    			merken_min=0;
    			ijetzt = i;
    			ispaeter=i+95;
    
    		    //Kopfzeilen, Ort, etc
    			for(i=0;i<3;i++)
    			{
    				fgets(&zeile[i],1000,fp);
    				printf("%s",&zeile[i]);
    			}
    			printf("-------------------------------------------------------------------------------\n\n");
    			i=3;
    				while( fgets(&zeile[i],1000,fp) )
    				{
    					loeschen(zeile);
    
    							if( sscanf(&zeile[i],"%*s%*s%lf",&leistung)==1 )
    							{
    								// Prozentuale Veränderung berechnen
    								if(i==3)
    								{
    									prozent = 0;
    								}
    								else
    								{
    									prozent = (leistung-leistungALT)/leistungALT*100;
    								}
    
    								printf("%s %15.1lf Prozent\n",&zeile[i], prozent);
    								leistungALT = leistung;
    
    								if(max<prozent)
    								{
    									max=prozent;
    									merken_max=i;
    								}
    								if(min>prozent)
    								{
    									min=prozent;
    									merken_min=i;
    								}
    								if(i==ispaeter)
    								{
    									printf("\nMaximum:\n");
    									printf("%s %15.1lf\n\n",&zeile[merken_max], max);
    									ijetzt=i;
    									ispaeter=ijetzt+96;
    								}
    
    								i++;
    								if(i==210){ return 0;} // test							
    
    					        }// if sscanf end
    				}// while fgets end						
    		} // if T-t end
    
    	} while(input !='B' && input !='b'); //do-while end
    	return 0;
    }
    


  • Nochmal: ein char zeile[1000]; schafft dir Platz für eine Zeile mit 999 Zeichen.
    Du behandelst das aber wie ein Array mit 1000 Zeilen.

    Du möchtest sowas:

    char zeile[1000][100]; // ein Array von 1000 Zeilen zu 99 Zeichen.
    

    Ein char nimmt ein Zeichen auf.


Anmelden zum Antworten