brauch hilfe bei fscanf

cm0n

Grünschnabel
Hi,

also ich würde gerne eine acccess.log auslesen die ist so aufgebaut:

Code:
217.32.215.224 [2000/01/01 21:25:06] Mozilla 5.0 /top.html
220.29.193.173 [2000/01/02 05:02:05] Mozilla 5.0 /index.html
213.44.194.32 [2000/01/04 14:46:46] IE 6.2 /cgi-bin/show?q=47
212.37.196.112 [2000/01/04 18:27:31] IE 5.1 /cgi-bin/show?q=4
206.29.197.246 [2000/01/06 11:55:13] IE 6.2 /projects.html

Das Programm dafür muss in C geschrieben sein, ich bin noch nicht so gut in C, aber ich denke mit fscanf kann man dies doch am besten lösen oder?

Am liebsten würde ich ja jeden Teil einzelt speichern, also irgendwie so:
den ersten teil IP in ein char Array, dann jahr monat tag stunden minuten sekunden (jeweils in ein int) browser in char und dann zuletzt url auch in ein char

Ich komme mit den ganzen sonderezichen nicht klar ich weis nicht wie ich fscanf aufbauen muss damit es die sachen ordentlich einliest.
Ich hab auch leider kein vernüftiges Beipiel gefunden wo so etwas erklärt wird wie man so was aufbaut.
Also wenn mir einer zeigt wie man fscanf auf bauen muss bzw, eine Seite sagt wo dies gut erklärt wird wäre mir echt geholfen.

mfg cm0n
 
Zuletzt bearbeitet:
Hallo cm0n,

ich kann dir nur eine kurze Starthilfe geben wie ich es realisieren würde. Als erstes liest du eine komplette Zeile aus, die du wiederum bearbeitest. Da bräuchte man eine Funktion die nach dem Leerzeichen splittet, dann hast du schon mal die groben Einzelteile. Diese Einzelteile kann man wiederrum bearbeiten. Das Problem wird die Fummelei mit C sein denn C++ bietet z.B. die string Klasse mit der solche Geschichten sehr einfach handhabbar sind.

Meines Wissens nach wäre fscanf geeignet wenn alle Teile die gleiche Länge haben z.B. IP-Adressen, jedoch ist das nicht der Fall. Am besten du suchst die per Suchmaschine eine C Referenz und suchst nach geeigneten Funktionen, sind ja nur ein paar wenige. Wichtige Hilfsfunktionen sollten dann selbst implementiert werden.

Viel Erfolg :)
 
Hi.

Du solltest die Datei in der Tat zeilenweise (fgets) verarbeiten.

Ich würde folgenden Formatstring mit sscanf verwenden:
C:
char ip_addr[16];
unsigned int year, month, day, hour, min, sec;
char agent[200];
char req[1025];

if (sscanf(line, "%15[0-9.] [%u/%u/%u %u:%u:%u] %199[^/] %1024s", 
    ip_addr, &year, &month, &day, &hour, &min, &sec, agent, req) == 9) {
  // ...
} else {
  // zeile konnte nicht verarbeitet werden..
}
Gruß
 
Zurück