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.220IP-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 Datenam 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