fscanf Problem



  • 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