fscanf Problem
-
Der passende Formatstring sollte
fscanf("%*s %*s %lf 0", &variable_fuer_dritten_wert);
sein (ungetestet).
Das wird dir aber alleine nicht viel nützen, da der Rest des Programms größtenteils Unsinn ist. Aber wie dir schon geschrieben wurde, solltest du wohl vielleicht erst einmal alles sauber in deine Zielsprache umschreiben (und deine Zielsprache vorher/dabei überhaupt mal richtig lernen!), dann ist man motivierter, dir zu helfen. An diesem Programm noch viel zu verbessern ist ziemlich vergebener Aufwand, da das Grundgerüst schon nicht stimmt.
-
Problem besteht leider weiterhin.
-
Edit: Shit, ich habe die Verschiebung nicht gemerkt
-
tooony schrieb:
Problem besteht leider weiterhin.
Du hast bisher noch nicht gesagt, was dein Problem überhaupt ist. Die Frage die ich beantwortet habe war, die du die dritte Spalte in einen arithmetischen Datentyp einlesen kannst.
Die ganze Programmlogik drumherum ist, wie schon gesagt, auch sehr verdächtig. Da wird munter auf nicht-existierenden Speicher zugegriffen und was fscanf überhaupt zurück gibt oder wie man es sinnvoll in einer Schleife benutzt hast du wohl auch noch nie angeguckt.
-
@ SeppJ
Inwiefern Unsinn?
Mein Ziel soll es letztendlich sein die Werte der dritten Spalte auf einer Variablen zu hinterlegen und dann damit rechnen zu können. Genauer gesagt soll dann die prozentuale Veränderung von Wert zu Wert ermittelt werden.
-
@ SeppJ
Das Ziel des Programms soll sein die Werte der 3. Spalte in einer Variablen zu speichern um später damit rechnen zu können. Genauer gesagt soll von Wert zu Wert die prozentuale Veränderung ermittelt werden.
-
@ SeppJ
Das Ziel des Programms soll sein die Werte der 3. Spalte in einer Variablen zu speichern um später damit rechnen zu können. Genauer gesagt soll von Wert zu Wert die prozentuale Veränderung ermittelt werden.
-
tooony schrieb:
int i,n; char speicher[3000]; // :warning: das ergibt einen String für bis zu 2999 Zeichen. double leistung[3000], status[3000], zeit[3000]; n=0; //Kopfzeilen, Ort, etc for(n=0;n<3;n++) { fgets(&speicher[n],3000,fp); // :warning: falsches verständnis von Strings in C printf("%s", &speicher[n]); } ... i=n+1; // :warning: überflüssig, da n hier schon 3 ist. // speicher[n] ist nun speicher[i] -> DATUM while(fscanf(fp,"%s %s %lf %lf", &speicher[i], &zeit[i], &leistung[3000], &status[i])!=EOF) // ^^^^Was ist das? :warning:
char speicher[3000]; ergibt einen String für bis zu 2999 Zeichen.
Das sind keine 3000 Strings.Wenn in deiner Datei Folgende 3 Zeilen stehen:
Kopfzeilen Ort etc
Dann steht in speicher:
bei n = 0: "Kopfzeilen\n"
bei n = 1: "KOrt\n"
bei n = 2: "KOetc\n"Trenne mal einlesen und Ausgabe. Damm kannst du es sogar sehen.
for(n=0;n<3;n++) fgets(&speicher[n],3000,fp); for(n=0;n<3;n++) printf("n = %d: %s\n", n, &speicher[n]);
Nach dieser Schleife ist n = 3. da ist dann das +1 bei i = n+1 auch überflüssig.
Warum bleibst du nicht bei n?Das
&leistung[3000]
beim fscanf hast du schon bemerkt?
Da willst du in das Element 3000 von leistung schreiben. Das existiert aber gar nicht, da der Index nur bis 2999 geht.Hast du schon den Tipp von SeppJ umgesetzt?
Das&variable_fuer_dritten_wert
musst du natürlich an deine Variable anpassen. Etwa:&leistung[i]
-
Kurze Erklärung der 3000:
In den ersten 3 Zeilen steht nur irgendwas, ohne ein schema...dabei ist zeike 2 komplett leer.
Ab zeile 4 beginnt dann das schema wie folgt
datum zeit wert wert2
Es handelt sich dann hierbei um knapp 3000 solcher einträge. und von wert zu wert soll die prozentusle verändrrung berechnet werden.
-
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!
-
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; }