Datei in Array lesen

henri97

Grünschnabel
Hallo,

kann mir jemand erklären warum er die Datei nicht im Array data speichert ?:

Code:
char word[20],data2[20], data[20], temp[80];
int len=0, lenwhil=0, zahl=0, var;
bool equal;

readstring(void)
{
printf("Wort eingeben: ");
scanf("%s", &word);
}

readfile(void)
{
FILE *file=fopen("C:/Users/Henri/Desktop/words.txt", "r");

while(feof(file)==0)
{
fgets(data2, 20, file);
printf("%s", data2);
data[20]=data[20];
var++;
}

printf("%s", data);

fclose(file);
}

Header usw. hab ich eingebunden

Vielen Dank Schonmal :D
 
Hi und Willkommen bei tutorials.de :)

Das die Header drin sind, ist klar. Sonst kannst du das Programm gar nicht kompilieren/starten.

Aber im Code sind einige Probleme/Fehler:

Funktionen sollten/müssen Returntypen haben.
Wenn man nichts returnen will, dann "void".

Beim scanf in readstring gehört das & weg! Array!

Beim gleichen scanf: Eingaben mit Leerzeichen werden so nicht genommen.
Nimm fgets.

Im readfile steht ein "data[20]=data[20]"
Wozu ist das gut?
Du weist einer Variable ihren eigenen Wert wieder zu?
Die Zeile könntest du genau so gut weglassen.

Außerdem gehen die Indizes von data[20] nur von 0 bis 19.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19.
Sind genau 20 Stück.
data[20] ist also etwas, das gar nicht mehr zu data gehört.
Irgendeine andere Variable etc., die im Speicher danach kommt.

Nach der while-Schleife gibst du data aus,
obwohl im ganzen readfile nichts darin gespeichert wurde.

Auf globale Variablen sollte man verzichten.
Es gibt doch Funktionsparameter.

Zu diener Frage: Warum sollte die komplette Datei in data gespeichert werden?
Steht doch nicht im Code.

Gruß
 
Funktionen sollten/müssen Returntypen haben.
Wenn man nichts returnen will, dann "void".

Danke dafür, aber ich möchte doch nichts returnen deswegen ist es void.

Beim scanf in readstring gehört das & weg! Array!
Ich habe gerade gedacht das müsste man machen.

Beim gleichen scanf: Eingaben mit Leerzeichen werden so nicht genommen.
Nimm fgets.
Ja das weis ich.

Im readfile steht ein "data[20]=data[20]"
Wozu ist das gut?
Du weist einer Variable ihren eigenen Wert wieder zu?
Die Zeile könntest du genau so gut weglassen.
Es sollte eigentlich heißen "data[20]=data2[20]" ,das war ein versehen.
Weil dann müsste er es doch zuweisen oder nicht, weil wenn ich es ändere gibt er es weiter unten in printf trotzdem nicht aus?!


Außerdem gehen die Indizes von data[20] nur von 0 bis 19.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19.
Sind genau 20 Stück.
data[20] ist also etwas, das gar nicht mehr zu data gehört.
Irgendeine andere Variable etc., die im Speicher danach kommt.
Das weiß ich auch.

Nach der while-Schleife gibst du data aus,
obwohl im ganzen readfile nichts darin gespeichert wurde.
Erklärt sich durch weiter oben.

Auf globale Variablen sollte man verzichten.
Es gibt doch Funktionsparameter.
Warum dass ?

Zu diener Frage: Warum sollte die komplette Datei in data gespeichert werden?
Steht doch nicht im Code.
Erklärt sich auch durch weiter oben, bzw. ich möchte aber die ganze Datei in das Array speichern, habs aber probe weise mit nur der ersten Zeile probiert, was aber auch nicht geklappt hat :(


Wenn ich aber schreibe:
Code:
char word[20],data2[20], data[20][6], temp[80];
int len=0, lenwhil=0, zahl=0, var;
bool equal;

readstring(void)
{
printf("Wort eingeben: ");
scanf("%s", word);
}

readfile(void)
{
FILE *file=fopen("C:/Users/Henri/Desktop/words.txt", "r");

while(feof(file)==0)
{
fgets(data2, 20, file);
printf("%s", data2);
data=data2;
printf("%s", data[20][var]);
var++;
}

fclose(file);
}

kommt aber der Compilerfehler : "incompatible types when assigning to type 'char[20][6]' from type 'char"
Was bedeutet das ?
 
Returntypen: Du hast aber eben kein void, du hast da gar nichts.
Müsste so ausschauen:
C++:
void readfile(void)
Bei der anderen Funktion genauso.

& beim scanf: Nur bei Einzelvariablen (bei denen Pflicht).
Arrays sind aber schon von Anfang an Pointer.

scanf kommt nicht mit Leerzeichen klar:
Wenn du das weißt und das absichtlich so machst, gut.

0-19: wenn dir das klar ist, warum greifst du dann trotzdem
auf [20] zu? bei [19] ist Schluss!

Und auch wenn da [19] stehen würde (und data2) kopierst du nur einen Byte der 20. Um alles zu kopieren: Entweder eine Schleife bis '\0' oder einfach
C++:
strcpy(data, data2);

Dazu, dass am Schluss die komplette Datei in data sein soll:
In der Schleife speicherst du jede Zeile in data2 und löscht damit den alten Inhalt. Wenn du data2 auch noch in data kopierst wirst du am Schluss nur die letzte Zeile haben.

Zu den globalen Variablen vs. Parameter:
Glob. Variablen sind einfach schlechter Stil. Sie funktionieren, aber...
man sollte Code möglichst so schreiben, dass man Teile davon in anderen Programmen weiterverwenden kann, ohne alles von vorne machen zu müssen. Indem sich Funktionen auf glob. Var. verlassen erreichst du genau das Gegenteil und machst dir so selbst mehr Arbeit.

Zum neuen Code: Warum ist data auf einmal [20][6]?
 
Zurück