Parser
-
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