Parser
-
Hi,
ich muss noch zwei Nachfragen stellen.
- Wie würdest Du aus einer Datei die jeweilige Textzeile für sscanf einlesen, wenn Du die Zeilenlänge nicht genau absehen kannst. (Meine Zeilen sind nicht unendlich lang; aber ich will die Verwendung einer tmpZeile mit 1000-Zeichen vermeiden.
char tmpZeile[1000]; char test[20]; double i; fPtr = fopen("datenbank.dat", "r"); if (fPtr != NULL) { fgets(fPtr, 100, tmpZeile); // So ??? // tmpZeile = "Benny is 29.15 years old"; sscanf(tmpZeile,"%s %*s %d", test, &i); }
- Aus irgend einem Grund meckert mein Compiler immer an der sscanf-Zeile. Ich weiß beim besten Willen nicht warum. Der Fehler muss etwas mit der Fließkommazahl für i zu tun haben.
FEHLERMEDLUNG: floating point not loaded
Gruß,
W2K2005
-
An der sscanf-zeile hat der compiler nichts herumzumeckern.
"floating point not loaded" ist eine Laufzeit Fehlermeldung.
Der compiler sollte vielmehr an der fgets-zeile herummeckern.
sollte so aussehen:fgets(tmpZeile, 100, fPtr );
Kurt
-
Hi,
ich schicke einmal genau die Zeilen, die bei mir nicht funktionieren.
Die fgets-Zeile hatte ich noch gar nicht implementiert.int getCoordinates(char filename[], sCoords *p_Coords, int maxI, int maxJ) { int ij=0; double x; double y; char string[512] = "STATIC PRESSURE : 29.0 [pa]"; char tmp[20], tmp2[20]; FILE *fPtr; // Öffne die Gitterdatei, um die Kontrollparameter einzulesen fPtr = fopen(filename, "r"); if (fPtr != NULL) { //do { // Anzahl der Punkte in i und j Richtung einlesen // fgets(string, 100, fPtr); sscanf(string, "%[^:]:%lf [%[^]]", tmp, &y, tmp2); //ij = ij + 1; //} while (ij < maxI*maxJ); fclose(fPtr); return 1; } else { // Datei konnte nicht zum Lesen geöffnet werden return 0; } }
-
Also am sscanf liegts nicht wenn irgendwas nicht funktioniert.
Wenn du immer noch den laufzeitfehler "floating point not loaded" bekommst dann musst du wahrscheinlich irgend ein library dazulinken.
Kurt
-
Könnte der Fehler in Verbindung mit MS Visual Studio .NET stehen?
Ich habe vorher immer mit Version 6 gearbeitet. Allerdings wüsste ich auch nicht welche Bibliothek ich noch einbinden muss. Das merkwürdige an dem Problem ist, dass die Anweisungen funktionierten, sobald ich aus der double-Variable y einen int-Wert gemacht habe.
-
-
Hallo Kurt,
noch eine letzte Frage zu Deinem Code:
sscanf(str, "%[^:]:%lf [%[^]]", name, &value, unit )
Könntest Du bitte noch einmal erklären was Du mit den Ausdrücken "%[^:]:" und "[%[^]]" erreichst.
Vielen Dank.
-
der Ausdruck "%[12345abcd]" bedeutet lese solange in einen string solange irgend ein zeichen vorkommt das zwischen den '[' und ']' steht.
das ^ invertiert die Bedeutung.
"%[^:]" lese solange in den string bis ein ':' gefunden wird.
Kurt
-
int parse(char *string, char *name, double *value, char *unit) { if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) { if (name[strlen(name)-1] == ' ' ) { name[strlen(name)-1]='\0'; } return 1; } else { printf("> Error parsing. "); return 0; } }
Hi,
wenn ich versuche über den nachfolgenden Aufruf eine Zeile in *string zu parsen, bricht das Programm immer mit einem Ausnahmefehler zusammen.
// Textzeile auslesen fgets(string, max, fPtr); // string = STATIC PRESSURE : 55790.0230145 [Pa] (not reduced quantity) RetVal = parse(string, name, &value, unit);
Ich weiß nicht so recht wonach ich suchen soll, denn ich erhalte nicht einmal eine Fehlermeldung...
Gruß,
W2K2005
-
In meinem Beispiel war name nur 30 zeichen lang. Wenn das noch immer so ist dan krachts.
BTW du hast jetzt mehrere lehrzeichen vor dem ':' dann wäre wahrscheinlichint parse(char *string, char *name, double *value, char *unit) { if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) { while ( strlen(name) && (name[strlen(name)-1] == ' ' )) name[strlen(name)-1]='\0'; return 1; } else { printf("> Error parsing. "); return 0; } }
Kurt
-
Hey,
Du bist echt gut!
Also, mittlerweile läuft das Programm - nur der Wert in value kommt noch nicht an...
Mal gucken, wer schneller drauf kommt!P.S.:
Die Leerzeichen waren eigentlich schon die ganze Zeit dabei - diese werden aber vom Forum geschluckt!!!
Ich hatte nur etwas andere Zeilen als erstes gepostet.
Allgemein sieht mein Inhalt so aus:STATIC PRESSURE : 55790.0230145 [Pa] STATIC PRESSURE : 55790.0230145 [Pa] (not reduced quantity) STATIC PRESSURE : 94192.1555228 [Pa] (reduced quantity) ABSOLUTE MACH NUMBER : 0.318594727252 [-] (not reduced quantity)
-
Seh gerade value ist jetzt ein pointer
int parse(char *string, char *name, double *value, char *unit) { if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) {
dann mach's so
int parse(char *string, char *name, double *value, char *unit) { if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, value, unit)) {
Kurt
-
Es geht!
Lag am VS6!
Aber irgend etwas klappt mit dem Datenfeld noch nicht, welches ich aufgespannt habe.
double **dataBag = (double**) malloc(sizeof(double *) * ydim); for (i = 0; i < ydim; ++i) { dataBag[i] = (double*) malloc(sizeof(*dataBag) * xdim); } i=0; do { printf("> Scanne %d. Datei: %s\n", i+1, pLIST[i].filename); fPtr = fopen(pLIST[i].filename, "r"); if (fPtr != NULL) { // Spaltenindex zurücksetzen j=0; while (!feof(fPtr)) { // Textzeile auslesen fgets(string, max, fPtr); RetVal = parse(string, name, &value, unit); if (RetVal == 1) { // Daten ins Feld speichern dataBag[i][j] = value; j = j + 1; } } fclose(fPtr); } else { /// !!! Umlaute suchen printf("> Die Datei: %s konnte nicht ge%cffnet werden. Weiter...\n", pLIST[i].filename, 123); } i=i+1; } while (i < nums);
Solange ich nur eine Datei einlese (aus meiner Liste pLIST) funktioniert das Programm - SUPER!!! Genau wie es soll.
Sobald ich aber mehrere Dateien nacheinander Scanne - also in mehreren Zeilen von dataBag einen Wert ablegen will - stehen in der Matrix dataBag schwachsinnige Werte.
-
fehler liegt da
for (i = 0; i < ydim; ++i) { dataBag[i] = (double*) malloc(sizeof(*dataBag) * xdim); }
*dataBag ist ein pointer auf double ( bei mir 4 byte gross )
sollte aber double sein ( bei mir 8 bytes gross ).
Mach's sofor (i = 0; i < ydim; ++i) { dataBag[i] = (double*) malloc(sizeof(double) * xdim); }
Kurt
-
Leider nicht?!
Es kommt immer noch zum Ausnahmefehler.
-
wüde es mal so probieren Vielleicht sind mehr Werte in einer Datei als du annimmst
while (!feof(fPtr) && j < xdim ) {
BTW du solltest IMMER auf Überlauf überprüfen.
Kurt