Externe Datei in Form von Array!
-
Hallo,
hätte ne Frage: Wie kann ich bei C ein Array erstellen, das aber nicht in meinem C-Code ist, sondern extern in eine andere Datei ist?
Will, dass ich auf dem array zugreifen können und da was ändern kann.Danke schon voraus auf eure Antworten!!
-
extern.h:
#ifndef _EXTERN_H #define _EXTERN_H char extern_array[50] = {"Ich bin extern."}; #endif _EXTERN_H
Programm:
#include <stdio.h> #include "extern_array.h" int main() { puts(extern_array); return 0; }
MfG,
der ganz weit weg ist ( extern )
-
Danke für deine Antwort, aber wie kann ich auf diesem array zugreifen also verändern??
-
Und will eigentlich keinen text ausgeben, sondern ein array mit zahlen.
Zum Beispiel (externe file)int array[30][30]; array[23][21]=345;
und dann beim prog:
int main(){ . . . array[23][21]=20;
Ja und hier soll jetzt die Zahl geändert werden, also von 345 zu 20.
Wie könnte ich das machen???
-
So wie du es beschrieben hast.
-
Funktioniert nicht!
Hab also das:/*extern.h*/ #ifndef _EXTERN_H #define _EXTERN_H char extern_array[50][30]; extern_array[20][12]=23; #endif _EXTERN_H
und wenn ich jetzt beim prog das schreibe:
#include <stdio.h> #include "extern.h" #include <stdlib.h> int main() { extern_array[20][12]=43; system("PAUSE"); return EXIT_SUCCESS; }
dann meldet der compiler einen Fehler.
Was kann ich machen?
-
Ja, sorry so einfach gehts wohl doch nicht.
Dann schmeiss mal die Zeile 6 aus extern.h raus und ändere das Array über
Funktionen:void wert_aendern( int i, int j, int wert ) { extern_array[i][j] = wert; }
Das Array muss mit der extern-Anweisung in den entsprechenden Dateien bekannt gemacht werden:
extern int extern_array[50][50];
-
Meinst su jetzt , dass die funktion wert_aendern im Programm-Code stehen soll oder in der headerdatei??
-
In wie vielen Dateien soll denn das Array vorkommen `?
-
Verstehe deine Frage nicht Gnaz, aber glaube eine.
Also das array soll ja nur die zahlen speichern, die man mit dem Prog hinzufügen/ändern kann.
-
Eine, dann reicht es wenn du deine extern.h so schreibst:
/*extern.h*/ #ifndef _EXTERN_H #define _EXTERN_H int extern_array[30][30] = {0}; #endif // _EXTERN_H
-
Danke, hat funktioniert. Dieser Code mit der headerdatei hat auch 56 angezeigt:
#include <stdio.h> #include "extern.h" #include <stdlib.h> void wert_aendern( int i, int j, int wert ) { extern_array[i][j] = wert; } int main() { wert_aendern(5,6,56); printf("%d",extern_array[5][6]); system("PAUSE"); return EXIT_SUCCESS; }
Aber eigentlich wollte ich die zahl 56, also dass, das:
extern_array[5][6]=56;
in der Headerdatei gespeichert wird, damit ich nach beendigung des progs, den Wert da zu stehen hab. Wie kann ich das machen?
-
Also mit anderen Worten, brauche ich eine Datei auf der ich Daten speicher kann, und die mit Hilfe von einem array zugreifen und ändern kann!
Hoffe du hast es jetzt verstanden was ich meine??
-
Aaaach sooo.
Du kannst das ganze Array in einer Datei speichern, oder einen einzelnen Wert aus dem Array.
Mit fread oder fwrite z.B.
-
Dann kann man sich das ganze Gedöns mit den Headerdateien und so sparen.
Sag doch gleich was du willst
Vielleicht bin ich heute ein wenig begriffsstutzigDas da unten speichert ein Array in eine Datei.
Ich hoffe das es jetzt das ist, was du wolltest#define INDEX 10 #include <stdio.h> void init( int a[INDEX][INDEX] ) { int i = 0, j = 0; for ( i = 0; i < INDEX; i++ ) { for ( j = 0; j < INDEX; j++ ) { a[i][j] = 0; } } } void zeig( int a[INDEX][INDEX] ) { int i = 0, j = 0; for ( i = 0; i < INDEX; i++ ) { for ( j = 0; j < INDEX; j++ ) { printf("%5d", a[i][j] ); } puts("\n"); } puts("\n"); puts("\n"); } int main() { int array[INDEX][INDEX]; int i = 0, j = 0; FILE* fp; char *datei = "test.dat"; puts("Noch ist Schrott im RAM"); zeig( array ); // Noch ist Schrott im RAM init( array ); // Initialisieren puts("Jetzt nicht mehr"); zeig( array ); // Alles Nullen array[5][5] = 100; // Einen Wert verändern fp = fopen( datei, "w" ); // Datei zum Schreiben öffnen fwrite( array, sizeof(int), INDEX * INDEX, fp ); fclose(fp); fopen( datei, "r" );// Datei zum Lesen öffnen fread( array, sizeof(int), INDEX * INDEX, fp ); fclose(fp); printf("Datei %s eingelesen:\n\n" , datei ); zeig( array ); return 0; }
-
Ja genau das ist was ich wollte. DANKE DIR SEHR!
Hätte nur noch ne Frage zum Code. Also jedes mal wenn ich beim array einen Wert ändere, muss ich das hinterher schreiben???
fp = fopen( datei, "w" ); // Datei zum Schreiben öffnen fwrite( array, sizeof(int), INDEX * INDEX, fp ); fclose(fp);
Weil logoscherweise (nach meiner Logik) sollte es so sein.
-
Die drei Zeilen speichern doch das ganze Array, komplett.
Du brauchst also nur ein einziges mal zu speichern.
-
Hätte noch (ne) Frage(n).
Also die Wert im array werden doch in der Datei "test.dat" gespeichert.
Wie kann ich die "test.dat" öffnen? (Meine jetzt nicht im prog mit fopen)Und wie kann ich einen wert im array(das sich in der test.dat befindet) "ausdrucken"(also im prompt fenster).
Zum Beispiel wenn ich:printf("%d",array[2][3]);
schreibe dann wird ja das array im prog gemeint und nicht das, was sich in der test.dat befindet.
Muss ich nicht vor dem array[2][3] schreiben, dass sich dieses array in einer externen Datei befindet???
Also irgendwei soprintf("%d",(test.dat).array[2][3]);
Weiss, dass das falsch ist, aber schreibe das nur damit du (Ihr) versteht was ich meine.
-
Wenn du den Array-Inhalt aus der Datei einliest, steht er hinterher (nach dem Abschnitt
fopen( datei, "r" );fread(array,sizeof(int),INDEX*INDEX,fp);fclose(fp);
) in dem Array in deinem Programm. Dann kannst du damit machen, was du willst (und ihn eventuell am Ende zurück auf Platte schreiben, wenn du etwas geändert hast). Direkt auf Festplatte kann C nicht so flexibel arbeiten.
-
Das heisst, wenn ich was verändern will, muss ich das machen:
fopen( datei, "r" );// Datei zum Lesen öffnen fread( array, sizeof(int), INDEX * INDEX, fp ); fclose(fp); array[2][3]=50; printf("%d",array[2][3]); fp = fopen( datei, "w" ); // Datei zum Schreiben öffnen fwrite( array, sizeof(int), INDEX * INDEX, fp ); fclose(fp);
Jetzt hat sich der Wert in der Datei "tes.dat" im array[2][3] auf 50 verändert.
Ist das richtig????