Neuling - Mit fgets gelesenes File als String wiedergeben
-
Hallo,
ich bin ziemlicher Neuling in C. Ich sitze gerade an einem Programm, das mir 2 Textdateien ausliest und dann ausgibt.
Jetzt habe ich aber das Problem das ich von der fgets Funktion ein Buchstaben Array zurück gegeben bekomme.
Wie bekomme ich denn den String jetzt zu einem ganzen um diesen mit strtok weiter verarbeiten zu können??
Danke schon einmal.
Hier noch der Code.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LAENGE 100 //länger der einzelnen Zeilen #define ANZAHL 10 //Anzahl der Zeilen int main(int argc, char** argv) { //Variablen setzen FILE* FDMFILE; FILE* FDMCONFIG; char data[80]; char* fdminfo; //fdm_info Datei öffnen FDMFILE = fopen("/fdm_info", "r"); //checken ob fdm_info geöffnet werden konnte if( !FDMFILE ) goto done; //Inhalt der fdm_info holen und ausgeben // fdm_info Format F:49.988 FD:-00.012 REF:06:00:15 PLT:06:00:14.997 TD:-00.003 if( fgets(data,80, FDMFILE)) //fdm_info String cutten und komsetisch verschönern fprintf(stdout, "Frequenz %s, Frequenzdifferenz %c, Referenzzeit %c, Powerlinzeit %c, Zeitdifferenz %c\n", frequenz, fdminfo[1],fdminfo[2],fdminfo[3],fdminfo[5]); //fdm_info schließen fclose(FDMFILE); //FDM Konfiguration holen FDMCONFIG = fopen("/etc/fdm_monitor.conf", "r"); //Konnte FDM Config gelesen werden? if( !FDMCONFIG ) goto done; //Inhalt der FDM COnfig lesen und in einer Variable speichern while(feof(FDMCONFIG) == 0) { fgets(data, 80, FDMCONFIG); if (data[0] == '#') continue; printf("%s<br />",data); } //fdm_info schließen fclose(FDMCONFIG); done: return 0; }
-
fgets kopiert die gelesenen Zeichen in das übergebene char-Array und hängt auch ein '\0' hinten dran.
Das kannst du ohne Probleme mit den Stringfunktionen bearbeiten.Ein String in C ist ein char-Array mit dem Stringterminator am Ende ('\0')
Das '\0' ist das Zeichen mit dem Wert 0 (s. ASCII)
-
Das ist schon klar.
Ich will aber mit strtok den String als ganzes behandeln und das funzt nicht.
In der einen Datei steht eine Zeil drin die so aussieht F:49.988 FD:-00.012 REF:06:00:15 PLT:06:00:14.997 TD:-00.003
Bei dieser muss ich die Definitionen (F: FD: usw.) entfernen und die werte ausgeben.
Später muss ich dann noch eine ganze Config Datei auslesen und neu speichern.
Problem ist jetzt halt das der Compiler meckert weil ich %s übergeben will (also den string) aber er ein %c erwartet.
-
Evilmachine schrieb:
Problem ist jetzt halt das der Compiler meckert weil ich %s übergeben will (also den string) aber er ein %c erwartet.
Dann zeig mal wie du das versuchst.Und wo erwartet er ein %c. %c steht (bei printf und scanf) für ein Zeichen. Und das kannst du mit der Arrayzugriff bekommen:
data[i]
mit i von 0 bis strlen[data]-1
-
Ich gebe vor dem fprintf ein
fdminfo = strtok(data, " ");
Damit will ich eigentlich die einzelnen Parts der Zeile splitten.
In der Zeile
fprintf(stdout, "Frequenz %s, Frequenzdifferenz %c, Referenzzeit %c, Powerlinzeit %c, Zeitdifferenz %c\n", frequenz, fdminfo[1],fdminfo[2],fdminfo[3],fdminfo[5]);
Meckert er dann wegen den %s.
Ich brauche im Prinzip nur die Möglichkeit ein Char Array in einen String umzuwandeln. Gibt es da in C Funktionen für??
Komme aus dem PHP Bereich und da gibts sowas ja^^
Verstehe halt nicht warum fgets ein Char Array zurück gibt. Dann hätte ich doch fgetc genommen, wenn ich das gewollt hätte.
-
Da sagt der Compiler dann aber auch bei welchem Parameter. Was ist den frequenz für eine Variable?
strtok musst du auch mehrmals aufrufen. Du bekommst einen Zeiger auf den ersten Token. Beim zweiten Aufruf (fdminfo = strtok(NULL, " "); )dann den Zeiger zum 2. Token.
Die Werte musst du dann aber immer noch rausfriemeln.
strtok verändert den String. Es schreibt an die Stelle der Trennzeichen ein '\0'.Ist die Reihenfolge der Tags (F: FD: ...) immer gleich?
Geht es so?char in[] = "F:49.988 FD:-00.012 REF:06:00:15 PLT:06:00:14.997 TD:-00.003\n"; double f, fd,td; char ref[20] ="", plt[20] = ""; sscanf(in,"F:%lf FD:%lf REF:%s PLT:%s TD:%lf", &f, &fd, ref, plt, &td); printf("F:%lf FD:%lf REF:%s PLT:%s TD:%lf", f, fd, ref, plt, td);
-
Hab dein Edit gerade erst gelesen.
fgetc liest ein einzelnes Zeichen ein. Keinen String.Ein char ist für ein einzelnes Zeichen da.
Ein char-Array ist ein C-String, wenn die '\0' dranhängt.Du erwartest wohl ein Array von Strings. Das liefert strtok aber nicht.
Arrays haben eine feste Länge. Die wächst nicht automatisch.
Integrale Typen (int, char, double, ...) werden anders behandelt als Arrays.
Und C ist nicht PHP.
-
Fast.
Als Ausgabe bekomme ich nun
F:49.988000 FD:0.000000 REF: PLT: TD:0.000000Frequenz 49.988000,
Frequenzdifferenz 0.000000, Referenzzeit , Powerlinzeit , Zeitdifferenz 0.000000
REF und PLT passt irgendwas noch nicht. Die anderen gehen.
EDIT: Ja ich weiß das c nicht php ist
Alte Angewohnheiten und so^^
Und ja die Reihenfolge ist immer gleich. Zur Differenz FD gehört auch noch ein Vorzeichen.
Habe auch grade gesehen das die Werte gar nicht stimmen.
-
Bei dir wird schon der zweite Wert nicht eingelesen.
Ich habe es dort auch probiert: http://codepad.org/aJ63ajuX
-
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^^