Neuling - Mit fgets gelesenes File als String wiedergeben
-
Aaahh es hat Funktioniert.
Das strtok hatte mir noch dazwischen gefunkt.
Die Ausgabe sieht nun folgendermaßen aus:
F:49.988000 FD:-0.012000 REF:06:00:15 PLT:06:00:14.997 TD:-0.003000
Frequenz 49.988000, Frequenzdifferenz -0.012000, Referenzzeit 06:00:15, Powerlinzeit 06:00:14.997, Zeitdifferenz -0.003000
So wie es sein sein soll.
Ich danke dir vielmals. Das Problem hat mich stundenlang beschäftigt
-
Nachtrag:
Beim printf gehören nur %f statt %lf hin. (War halt Copy&Paste)
Beim scanf müssen die %lf bleiben.printf("F:%f FD:%f REF:%s PLT:%s TD:%f", f, fd, ref, plt, td);
-
Hierzu noch eine kleine Nachfrage.
In einem File hab ich jetzt ein % Zeichen drin.
Dort bricht mir das fprintf jedes Mal ab. Gibts da ne Möglichkeit das zu escapen??
-
Nur der Formatstring von printf wird nach %-Zeichen durchsucht.
Deswegen nie den Ausgabetext als Formatstring (1.Paramter) angeben.
Und wie auch beim \ wird durch das doppelte %%-Zeichen, ein % Zeichen ausgegeben.char *text = "Hier ist ein Prozentseichen %%i und da nochmal: %i"; printf(text); // Hier wird nach den %-Zeichen gesucht. printf("%s", text); // Hier wird der text richtig ausgegeben. puts(text); // macht automatisch ein '\n' ans Ende) // Besser: fputs(text, stdout); // Macht, was du willst
-
Nee Funzt nicht.
Wird ja als Parameter ausgegeben.
Und zwar sieht die Zeile bei mir so aus:
printf("<span class=cfglabel style=\"width:120px;\">%s: </span><input type=text name = '%s' value = '%s' size='30' id='fdm.%s' maxlength='100'><br />", config_names[i], config_varnames[i], value, config_varnames[i]);
Und der ausgegeben werden soll sieht so aus:
""PLF %PLFRQ Hz"@20,"REF %REFTIME"@30"
-
Und wie sieht er nach der Ausgabe aus und wo kommt der her?
-
Nach der Ausgabe habe ich nur noch ""PLF und der kommt aus einer Config Datei die ich per fopen und fgets einlese.
-
Bearbeitest du den Text nach fgets noch?
Mit strtok oder sscanf ?Wie ist denn die Variable definiert, in der der String steht?
-
Das hier mache ich mit der Datei
fdmconfig = fopen("/etc/fdm_monitor.conf", "r"); //Konnte FDM Config gelesen werden? if(fdmconfig == NULL) { printf("Couldn't open fdm_monitor.conf\n"); exit(22); } char key[256], value[256]; //Inhalt der FDM Config lesen und HTML Formular generieren while(fgets(line, sizeof(line), fdmconfig) != NULL) { //Feste Config Werte deklarieren linenum++; if(line[0] == '#') continue; if(sscanf(line, "%255[^=]= %255s", key, value) != 2) { fprintf(stderr, "Syntax error, line %d\n", linenum); continue; } for(i=0;i<N_CONFIG_OPTIONS;i++) { if(strncmp(key, config_varnames[i], strlen(config_varnames[i])) == 0) { printf("<span class=cfglabel style=\"width:120px;\">%s: </span><input type=text name = '%s' value = '%s' size='30' id='fdm.%s' maxlength='100'><br />", config_names[i], config_varnames[i], value, config_varnames[i]); } } } //fdm_info schließen fclose(fdmconfig);
-
Das Problem hattest du schon mal bei
sscanf(line, "%255[^=]= %255s", key, value)
Damals hast du das erste %s durch %255[^=] ersetzt, das %s nur bis zu einem Whitespace (Leerzeichen) liest.Du kannst das %255s durch %255[^\n] ersetzen. (Lese alle Zeichen bis auf '\n' (NewLine))
Dann sind aber auch die Leerzeichen am Zeilenende wieder mit drin.
-
Hmm ok.
Dann geht die ganze Restliche ausgabe nicht mehr^^
-
Du hast da jetzt
sscanf(line, "%255[^=]=%255[^\n]", key, value)
stehen?Wenn das nicht mit den anderen Zeilen klappt, musst du wohl eine Spezialbehandlung machen.
Die Daten stehen ja noch alle in line. Das kannst du so oft auswerten wie du möchtest.
-
Nee das [^\n] fehlte noch.
Danke jetzt gehts^^
-
Aber dafür hab ich das nächste Problem.
Ich musste jetzt noch einige Config Werte übernehmen.
jetzt gibt es u.a.
display format
display
custom displayIch mache ja ziemlich weit unten einen strncmp und vergleiche dort die Möglichen Optionen.
Aktueller Code hier http://pastebin.de/26055
So jetzt habe ich aber das Problem das er mir das display format einmal als display und dann nochmal als display format erkennt.
Infolge dessen gibt er natürlich einmal das Display Format richtig aus und einmal als Display und das krieg ich nicht in den Griff.
-
Warum nimmst du denn überhaupt strncmp?
Da vergleichst du die ersten 7 Zeichen von "display format" mit "display". Und die sind gleich.
strcmp (ohne n) ergibt ungleich, da nach dem y noch zeichen kommen.
-
Waah immer diese Kleinigkeiten
Das musste ich Anfangs nehmen weil es da mit strcmp Probleme gab.
Weiß jetzt schon gar nimmer was^^
Jetzt gehts auf jeden Fall.
Gibts in diesem Forum eigentlich noch andere Leute oder nur dich??
-
Evilmachine schrieb:
Waah immer diese Kleinigkeiten
Das musste ich Anfangs nehmen weil es da mit strcmp Probleme gab.
Weiß jetzt schon gar nimmer was^^
Jetzt gehts auf jeden Fall.
Gibts in diesem Forum eigentlich noch andere Leute oder nur dich??
Mit so viel Zeit sich hier dauerhaft mit dem Forum zu beschäftigen vermutlich nur DirkB.
-
Lol ok^^
Jetzt hab ich auch grad wieder gesehen warum das strncmp
Jetzt ohne das N hab ich nämlich das Problem das er irgendwelche unsichtbaren SDteuerzeichen im String hat und z.b.
if (strcmp(key, "display") == 0 || strcmp(key, "custom display") == 0 || strcmp(key, "extended display") == 0)
Nicht mehr funktioniert^^
-
Was sollen denn das für Zeichen sein?
Die können ja nur am Ende vom Key sein.
Kannst du sehen mitprintf("<%s>", key);
Durch die <> (oder andere Symbole) kannst du erkennen ob da noch Zeichen kommen.
Wenn da ein Zeilenvorschub ist, ist die > in der nächsten Zeile.Da brauchst du eine Trim-Funktion, die dir Whitespace und beliebige andere Zeichen (vorne und/oder hinten) entfernt.
Das wurde aber schon mal erwähnt.
-
Problem gefunden.
Aber nächstes.
Jetzt habe ich ja die Displays gezählt und die Anzahl als verstecktes feld hinzugefügt.
Weil ich jetzt eine Schleife brauche die mir auch diese werte ausliest (ohne das ich 15 Displays einzeln auslese), habe ich nun das Problem das ist aus nem int einen String machen muss um diesen per strcat dahinter zu hängen.
Funzt soweit auch. Nur sagt mir der COmpiler beim bauen
main.c:232:21: Fehler: unverträgliche Typen bei Zuweisung an Typ »char[50]« von Typ »char *«
DSP ist ein int mit dem Wert 1.
char dspval[50]; sprintf(dspval, "%i", dsp); dspval = strcat("value.", dspval); printf("dspquery %s<br>", dspval);
Aktueller Gesamtcode unter http://pastebin.com/M0yTKN3S