• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[ Solved ] Häufigkeit von IP Adressen zählen in C

byron1778

Hacker
Hallo Forum,

da man ja oft mit Dateien und den aufgezeichneten IP Adressen zu tun hat möchte ich mir nun in C ein Programm schreiben, dass mir die IP Adressen zählt, wie oft dabei die jeweilige vorkommt.

Leider weiss ich aber nicht so recht, wie ich vorgehen sollte ...

Ich habe mir folgendes dabei überlegt.

1) Feststellen, wieviele Zeilen, sprich IP Adressen die Datei hat.
2) Datei nochmals öffnen und erste Zeile auslesen und diese dann mit den anderen vergleichen bis zum festgestellten Ende aus 1).
Und genau hier beginnt mein Problem.
Wie kann es mir möglich sein, nach dem lesen der ersten Zeile die nächste zu lesen und diese wiederum mit den anderen zu vergleichen?
Ich will ja nicht ständig die Datei öffnen und schliessen?!?!

Wenn mir jemand vll. den genaueren Vorgang erklären könnte?

Danke vielmals.

mfg
 
OP
B

byron1778

Hacker
Ja, genau.
In der Textdatei sind IP Adressen gespeichert und diese möchte ich verarbeiten.
Dabei will ich die erste Zeile mit der ersten IP Adresse auslesen und dann mit den anderen vergleichen. Im nächsten Schritt die 2te Zeile auslesen und mit den anderen vergleichen, usw usf.
Das Ganze möchte ich halt mit C realisieren.
 
Lies die Datei einmal in eine verkettete Liste ein, dann kannst du unkompliziert und effizient vergleichen.
Code:
#include <stdio.h>
#include <libHX/deque.h>
#include <libHX/string.h>

int main(void)
{
        const struct HXdeque_node *a, *b;
        FILE *fp = fopen("addressen.txt", "r");
        struct HXdeque *dq = HXdeque_init();
        hmc_t *line = NULL;

        while (HX_getl(&line, fp) != NULL) {
                HX_chomp(line);
                HXdeque_push(dq, line);
                line = NULL;
        }

        for (a = dq->first; a != NULL; a = a->next)
                for (b = a->next; b != NULL; b = b->next) {
                        hmc_t *m = a->ptr, *n = b->ptr;
                        printf("%s <=> %s\n", m, n);
                }
        return 0;
}
 
OP
B

byron1778

Hacker
Danke Dir vielmals.
Zwar sind meine C Kenntnisse schon sehr alt ( zu alt für meinen Geschmack ), aber es wird sich schon etwas daraus machen lassen.
Ich weiss leider noch nicht, was verkette Listen sind, aber ich werde mich darüber informieren.
Ich dachte es mir schon, dass es in C nicht so einfach ist, Sachen einzulesen und dann vergleichen, wenn ich mir so das Programm ansehe!

Danke Dir vielmals nocheinmal!
 

abgdf

Guru
Hallo,

ich würde dafür Perl (oder IMHO noch besser Python) verwenden, weil das damit alles viel einfacher ist.
Gegen jengelhs Vorschlag ist sonst auch nichts einzuwenden (seine libHX ist schon ziemlich klasse), nur, daß sein Code für andere Leute als C-Profis nicht so ganz leicht zu verstehen ist.

Ich hatte mal eine Funktion zum Einlesen einer Textdatei geschrieben, die eher in "Baby-C" ist:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *readFile(const char *filename);
int writeFile(const char *filename, char *a);
char *strMalloc(unsigned int s);
char *strRealloc(char *a, unsigned int s);

int main(void)
{
    char *a = readFile("readme.txt");
    puts(a);
    return 0;
}

char *readFile(const char *filename)
{
    /* Open a text-file mostly regardless of its size,
       store it in memory and return a char-pointer pointing
       to the memory-adress. */

    FILE *fp;

    char *a;

    char buff[1000];

    int i;

    int size;

    size = 0;

    buff[999] = '\0';

    a = strMalloc(1000);

    if ((fp = fopen(filename, "r")) == NULL)
    {
        puts("Error opening file; probably file not found.");
        exit(1);
    }

    while (!feof(fp))
    {
        for (i = 0; i < 999; i++)
        {
            buff[i] = fgetc(fp);
            size++;
            if (buff[i] == EOF)
            {
                buff[i] = '\0';
                break;
            }
        }

        size++;

        a = strRealloc(a, size);

        strcat(a, buff);
    }

    fclose(fp);

    return a;
}


int writeFile(const char *filename, char *a)
{
    FILE *fp;

    if ((fp = fopen(filename, "w")) == NULL)
    {
        puts("Error writing file.");
        return 1;
    }
        
    fprintf(fp, "%s", a);

    fclose(fp);

    return 0;
}


char *strMalloc(unsigned int s)
{
    /* Allocates memory for a string, testing if allocation has
       been successfull. */

    char *a;
    if ((a = (char *) malloc(s * sizeof(char))) == NULL)
    {
        puts("Error allocating memory.");
        exit(1);
    }

    return a;
}


char *strRealloc(char *a, unsigned int s)
{
    /* Reallocates memory of a string, testing if reallocation has
       been successfull. */

    if ((a = (char *) realloc(a, s * sizeof(char))) == NULL)
    {
        puts("Error reallocating memory.");
        exit(1);
    }

    return a;
}
Die ganze Textdatei ist dann in einem String, also im Speicher. "writeFile()" habe ich auch mal mitgepostet.

Bestimmt nörgeln jetzt wieder mehrere Leute über meinen Code, obwohl der läuft. Über C-Code zu diskutieren, ist nach meiner Erfahrung leider relativ unerfreulich :( ...

Ich hatte noch mehr solche Funktionen (auch mit Listen) geschrieben, bis mir das dann alles zu stressig wurde. Jetzt mache ich sowas in Null komma nix in Python:
Code:
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os

f = file("readme.txt", "r")
a = f.readlines()
f.close()

for i in a:
    print i.rstrip("\n")
Das kann ich nur empfehlen.

Viele Grüße
 
OP
B

byron1778

Hacker
Normalerweise verwende ich dafür auch Perl, aber dieses Mal dachte ich mir ich versuche es mit C, um darin wieder reinzukommen.
Aber ob die Idee dafür so gut war ??
Sieht doch schwieriger aus, als ich mir dachte.
Bzgl. Python: Da bin ich gerade dabei es zu lernen, weil es recht nett zu sein scheint !

Danke für Eure Beispiele !
 
A

Anonymous

Gast
byron1778 schrieb:
Ich habe mir folgendes dabei überlegt.

1) Feststellen, wieviele Zeilen, sprich IP Adressen die Datei hat.
2) Datei nochmals öffnen und erste Zeile auslesen und diese dann mit den anderen vergleichen bis zum festgestellten Ende aus 1).
Und genau hier beginnt mein Problem.
Wie kann es mir möglich sein, nach dem lesen der ersten Zeile die nächste zu lesen und diese wiederum mit den anderen zu vergleichen?
Ich will ja nicht ständig die Datei öffnen und schliessen?!?!

wie wäre es denn mit einem ganz anderem Lösungsvorschlag?
* Datei nach IP-Adresse sortieren
* erste IP mit der folgenden IPs vergleichen, solange gleich dann Anzahl hochzählen, und dann mit nächster IP vergleichen usw.
* ist IP anders, dann Ausgabe IP und Anzahl.
* Anzahl wieder 1 und mit neuer IP in der Schleife von oben weitermachen.

Zum Schluss sortierst du die IPs dann noch nach ihrer Anzahl.

das ganze dürfte etwas einfacher zu programmieren sein da du die sortierte Datei nur einmal der Reihe nach lesen brauchst ( Sortieralgorithmen sollte es genügend zu finden geben) , und wird in der Endkonsequenz bei großen Datenmengen wohl auch schneller sein.

robi
 
Oben