Beste Weg, um zu Lesen analysieren von Daten aus text-Datei in C?
Ich bin an einer Aufgabe arbeiten, beschäftigt sich mit Lesen von Daten aus einer text-Datei, und analysieren, dass die Daten in verschiedenen arrays. Zum Beispiel, einen Teil meiner text-Datei sieht wie folgt aus:
arbrick pts/26 141.219.210.189 Thu Mar 29 11:23 - 11:24 (00:00)
rjmcnama pts/27 141.219.205.107 Thu Mar 29 11:02 still logged in
ajhoekst pts/26 99.156.215.40 Thu Mar 29 10:59 - 11:08 (00:08)
eacarter pts/31 141.219.162.145 Thu Mar 29 10:50 - 10:51 (00:00)
kmcolema pts/31 141.219.214.128 Thu Mar 29 09:44 - 09:47 (00:03)
Muss ich parse die Daten in folgende Felder: Benutzer-id, terminal, ip-Adresse, und event-Zeiten. Wie kann ich dies in Anbetracht, dass gibt es nicht eine gleichbleibende Menge an Leerraum zwischen den Spalten ist?
BEARBEITEN:
Ich habe versucht, mit dem Vorschlag, dass Thiruvalluvar zur Verfügung gestellt, aber ich konnte einfach nicht bekommen es funktioniert. Allerdings wollte ich wechseln zu sscanf und das funktioniert ganz gut fast...
while(!feof(myfile)) {
fgets(buffer, 256, myfile);
sscanf(buffer, "%s %s %s %s", user_id[i], terminal_id[i], ip_addr[i], events[i]);
} /*End while not EOF*/
Was funktioniert, ist die user_id, terminal_id, und ip_addr arrays. Jedoch werden die Ereignisse array ist nicht perfekt arbeitet noch. Seit den Ereignissen array ist ein string mit Leerzeichen, wie kann ich sscanf, fügen Sie den Rest der Puffer zu den Veranstaltungen array?
strtok_r
.InformationsquelleAutor kubiej21 | 2012-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die wirkliche Frage ist, wie strore Sie in nur 4 arrays. E. g.:
Tokenisierung diese Zeile mit Leerzeichen ist goin zu geben, viele Saiten. Aber wir sind nur daran interessiert, die Aufteilung der gesamten Zeile in nur 4 Zeilen, nicht mehr als das.
Lösung:
Lesen Sie die Zeile mit
fgets()
.Tokenisierung es mit
strtok()
oderstrtok_r()
(thread-safe) mit Leerzeichen als Trennzeichen.Lesen Sie den 1. Teil von 3 strings in die arrays: user_id, terminal_id und IP-Adresse
Speichern ( append) der rest des strings in das array
events
.Es muss 2D {array von strings} das ist der Grund für die seg-fault. char user_id[100][25]; //Für 100 Zeilen und stellen Sie sicher, dass keiner deiner user-Namen überschreiten 25 Zeichen Länge. Ebenso keine der Benutzer bis zu 100. Sonst, entsprechend ändern oder zuweisen, die dynamisch mit malloc(). Das gleiche für die anderen arrays.
InformationsquelleAutor P.P.
Verwenden
fgets
zum Lesen einer Zeile zu einem Zeitpunkt. Arbeiten auf der Linie mitsscanf
Anrufe, die Informationen zu speichern, da die Daten nicht in einer einheitlichen form (z.B., "noch eingeloggt").sscanf
Lesen und entsorgen Sie keine Leerzeichen zwischen Formatangaben.InformationsquelleAutor Matt Eckert
Versuchen Sie dies:
und dann:
./a.out < file.txt
InformationsquelleAutor Enrique Marcos
Für was es Wert ist, hier mein Vorschlag. Rollen Sie Ihre eigene string-tokeniser wie folgt:
Dann rufen Sie es in der Folge für jedes token. Nach dem Dritten Aufruf
string_tok
Pufferbuf
hält einen Zeiger auf den Anfang der Rest des Strings (die Ereignisse). Beachten Sie, dass buf muss schreibbar sein.InformationsquelleAutor William Morris