Array Werte nach der Schleife anders als in der Schleife?



  • Hallo Allerseits 🙂

    Ich versuche gerade ein C Programm für meinen Linux rechner zu schreiben.

    Das Programm soll aus einer Datei IP-Adressen auslesen und diese dann weiter verarbeiten.
    Allerdings sind die Werte des Arrays, in dem die IP's gespeichert werden, in der While Schleife anders als nach der Schleife.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char *argv[])
    {
    
    	char ip_from_file[100];
    	char *ip_array[1000];
    	FILE *ipfile;
    
    	if(!(ipfile = fopen("ipfile.ipf", "r")))
    		fprintf(stderr, "Fehler beim oeffnen der Datei!");
    
    	ipfile = fopen("ipfile.ipf", "r");
    
    	int i = 0;
    	while(!feof(ipfile))
    	{
    
    		fgets(ip_from_file, 20, ipfile);
    
    		ip_array = ip_from_file;
    		printf("IP from File: %s\n", ip_from_file);
    		printf("IP-Array[%i]: %s\n", i, ip_array[i]);
    		i++;
    
    	}
    	fclose(ipfile);
    	int z = 0;
    
    	for(z=0; z < i; z++)
    	{
    
    		printf("IP_array[%i] ist %s\n", z, ip_array[z]);
    
    	}
    
    	return 0;
    }
    

    [i]
    Ausgabe:

    // In der While Schleife
    IP from File: 192.168.2.220

    IP-Array[0]: 192.168.2.220

    IP from File: 192.168.2.100

    IP-Array[1]: 192.168.2.100

    IP from File: 192.168.2.101

    IP-Array[2]: 192.168.2.101

    IP from File: 192.168.2.101

    IP-Array[3]: 192.168.2.101

    // In der For-Schleife

    IP_array[0] ist 192.168.2.101

    IP_array[1] ist 192.168.2.101

    IP_array[2] ist 192.168.2.101

    IP_array[3] ist 192.168.2.101
    *

    Weiss jemand woran das liegt?

    Schonmal Danke 🙂

    lg Osiron



  • Weiss jemand woran das liegt?

    Ja, ich weiß woran das liegt.

    ip_array ist nur eine Liste mit Zeigern.
    Du speicherst in dieser Liste immer den selben Zeiger:

    ip_array[i] = ip_from_file;

    zwar lädst du in den Speicher ip_from_file immer wieder neue daten,
    aber du überschreibst auch immer wieder die alten Daten

    am einfachsten kannst du eine char Feld verwenden:

    z.B.

    char ip_array[1000][20];
    

    oder du nimmst für ip_from_file einen sehr großen Buffer und sorgst dafür
    daß du nicht immer wieder den Speicher überschreibst, indem du den Zeiger,
    den du an fgets übergibst jeweils um die gelesenen Zeichen + 1 für die terminierende NULL weiter verschiebst.

    Gruß Frank



  • Hallo Frank,

    danke für die schnelle Antwort!

    Wenn ich die Variante mit dem 2 Dimensionalen Array wähle wie müsste denn dann die zuweisung aussehen? Ich müsste dann ja jeden einzelnen Buchstaben in den Array eintragen oder geht so etwas wie:

    char ip_array[1000][20]; 	
    while(!feof(ipfile))
        {
    
            fgets(ip_array[i][20], 20, ipfile);
            i++;
    
        }
    

    Also das ich den ganzen String direckt eintragen kann?

    Gruß Osiron



  • Grundsätzlich sollte das gehen. Wie sind die Datensätze in der Datei getrennt? Durch Leerzeichen? Eventuell liest du das Leerzeichen auch noch mit ein. (Komma aus dem C++ Bereich und kenne mich mit dem exakten Verhalten dieser C Funktion nicht aus.)

    Und im Zweifel: Einfach ausprobieren!



  • naja fast,

    aber so sollte es gehen:

    fgets(&ip_array[i], 20, ipfile);
    

    Gruß Frank



  • Frank Erdorf schrieb:

    naja fast,

    aber so sollte es gehen:

    fgets(&ip_array[i], 20, ipfile);
    

    Gruß Frank

    fgets(ip_array[i], 20, ipfile);
    

    funktioniert ebenso.



  • Danke für die vielen Antworten 🙂

    char ip_array[1000][20];
    int i = 0;
    while(!feof(ipfile))
    {
        fgets(ip_array[i], 20, ipfile);
        i++;
    }
    

    Funktioniert super!

    Gruß Osiron


Log in to reply