Filepointer an Methode übergeben
-
Das Sternchen ist an der falschen Stelle. Das
return;
ist zudem überflüssig.void printen(FILE *array_filepointer);
Dein Hauptprogramm ist auch nicht in Ordnung.
FILE *array_filepointer[i];
Es gibt bereits einen Bezeichner array_filepointer und VLAs möchtest du sicherlich nicht auch nicht verwenden, oder doch?
FILE *f; f = fopen(array_filename[i],"w"); // Fehlerbehandlung printen(f); fclose(f);
-
Ich habs jetzt so gemacht.
#include <stdio.h> #include <stdlib.h> #include <string.h> void printen(FILE **array_filepointer) { fprintf(*array_filepointer,"Hallo ich bin KLaus und du bist maus"); } int main() { int anzahl=6; char array_filename[anzahl][50]; char array_filepointer[anzahl][50]; int i; for (i=0; i<6; i++) { sprintf(array_filename[i],"filename%d",i); sprintf(array_filepointer[i], "Datei%d",i); printf("1- %s\n",array_filepointer[i]); } for(i=0; i<6; i++) { FILE *array_filepointer[i]; array_filepointer[i]=fopen(array_filename[i],"w"); printen(&array_filepointer[i]); fclose(array_filepointer[i]); } return 0; }
läuft auch alles soweit, endlich
-
nippler92 schrieb:
Ich habs jetzt so gemacht.
for(i=0; i<6; i++) { FILE *array_filepointer[i]; array_filepointer[i]=fopen(array_filename[i],"w"); printen(&array_filepointer[i]); fclose(array_filepointer[i]); }
läuft auch alles soweit, endlich
Das geht nicht lange gut. Du schreibst ständig in ein nicht vorhandenes Arrayelement. Mach einfach:
void printen(FILE *filepointer) { fprintf(filepointer,"Hallo ich bin KLaus und du bist maus"); } ... for(i=0; i<6; i++) { FILE *filepointer; filepointer=fopen(array_filename[i],"w"); printen(filepointer); fclose(filepointer); }
-
wieso ist das arrayelement nicht vorhanden?
Ich hab doch hier eine bestimmte anzahl an feldern erstellt.char array_filepointer[anzahl][50];
-
nippler92 schrieb:
wieso ist das arrayelement nicht vorhanden?
Ich hab doch hier eine bestimmte anzahl an feldern erstellt.char array_filepointer[anzahl][50];
Dieses sinnlose Objekt hat zwar den gleichen Namen wie array_filepointer, wird aber von deinem anderen array_filepointer verdeckt. Zudem ist es nicht vom Typ FILE*. Wieso überhaupt ein Array von FILE* für eine einzige Datei? Ich habe den Eindruck, du setzt hier bloß zufällig '*', '[' und ']' in deinem Code, bis es zufällig compiliert, aber ohne wirklich zu verstehen, was sie überhaupt machen. Kommentier doch mal deinen Code, was du denkt, was er machen sollte und warum du das so gemacht hast. Derzeit fragt sich ein jeder hier im Thread, warum du es nicht so machst wie von Belli vorgemacht.
-
SeppJ, vielleicht erinnerst du dich an den letzten Thread von nippler92: http://www.c-plusplus.net/forum/313128
Er möchte wohl einFILE *array_filepointer[6];
und das am Anfang von main (und nur da).
-
Sieht aber im weiteren Programmverlauf nicht so aus, als wenn er das braucht.
-
DirkB schrieb:
Er möchte wohl ein
Belli schrieb:
Sieht aber im weiteren Programmverlauf nicht so aus, als wenn er das braucht.
Genau. Was man möchte und was man braucht, ist nicht immer das gleiche
.
-
Also das was ich hier gepostet habe, ist halt nur nen kleines Beispiel für mich um den Sachverhalt zu verstehen.
#include <stdio.h> #include <stdlib.h> #include <string.h> # void printen(FILE **array_filepointer) // die Adresse meines Filepointers wird übergeben { fprintf(*array_filepointer,"Hallo ich bin KLaus und du bist maus"); return; } int main() { int anzahl=6; char array_filename[anzahl][50]; // erzeuge array was 6 verschiedene Dateinamen enthält char array_filepointer[anzahl][50]; // warum das hier? Ich habe in meinem richtigen Code 6 verschiedene Programme um eine Liste zu füllen, mit head und/oder back pointer sortiert/unsortiert //von jedem Prog messe ich die Zeit und möchte diese in eine seperate Datei schreiben, deshalb brauch ich doch auch 6 Filepointer zu meinen 6 verschiedenen .txt Dateien. oder würde einer reichen dessen Wert ich via for schleife immer auf die neue Datei bringe? int i; for (i=0; i<6; i++) // hier werden die Arrays beschrieben { sprintf(array_filename[i],"filename%d",i); sprintf(array_filepointer[i], "Datei%d",i); } for(i=0; i<6; i++) { FILE *array_filepointer[i]; // hier kommt das was ich evtl. noch nicht zu 100% verstanden habe - ich habe in meinem array einen text gespeichert und möchte diesen nun als var.-name benutzen also FILE* array_filepointer[i] oder int array_filepointer[i] oder double array_filepointer[i] , ganz egal. geht das? array_filepointer[i]=fopen(array_filename[i],"w"); // Filepointer bekommt die adresse von meiner .txt datei zugewiesen. printen(&array_filepointer[i]); //Adresse des filepointers wird übergeben um den wert dieser adresse also meinen filepointer dann in der Funktion zu benutzen. fclose(array_filepointer[i]); } return 0; }
Falls ich irgendwas falsch verstanden habe bin ich für jeden Tipp sehr dankbar.
mfg
-
nippler92 schrieb:
#include <stdio.h> #include <stdlib.h> #include <string.h> # void printen(FILE **array_filepointer) // die Adresse meines Filepointers wird übergeben //Du brauchst aber die Adresse doch gar nicht, es genügt den Filepointer selbst zu übergeben { fprintf(*array_filepointer,"Hallo ich bin KLaus und du bist maus"); return; } int main() { int anzahl=6; char array_filename[anzahl][50]; // erzeuge array was 6 verschiedene Dateinamen enthält char array_filepointer[anzahl][50]; // warum das hier? Ich habe in meinem richtigen Code 6 verschiedene Programme um eine Liste zu füllen, mit head und/oder back pointer sortiert/unsortiert //von jedem Prog messe ich die Zeit und möchte diese in eine seperate Datei schreiben, deshalb brauch ich doch auch 6 Filepointer zu meinen 6 verschiedenen .txt Dateien. oder würde einer reichen dessen Wert ich via for schleife immer auf die neue Datei bringe? int i; for (i=0; i<6; i++) // hier werden die Arrays beschrieben { sprintf(array_filename[i],"filename%d",i); sprintf(array_filepointer[i], "Datei%d",i); } for(i=0; i<6; i++) { FILE *array_filepointer[i]; // hier kommt das was ich evtl. noch nicht zu 100% verstanden habe - ich habe in meinem array einen text gespeichert und möchte diesen nun als var.-name benutzen also FILE* array_filepointer[i] oder int array_filepointer[i] oder double array_filepointer[i] , ganz egal. geht das? //Du erstellst hier in jedem Schleifendurchlauf ein neues Array vom Type //FILE*, nacheinander mit 0 - 6 Elementen (jeweiliger Wert von i) //Dieses Array benutzt Du aber gar nicht sinnvoll array_filepointer[i]=fopen(array_filename[i],"w"); // Filepointer bekommt die adresse von meiner .txt datei zugewiesen. //Hier schreibst Du immer hinter das gerade erstellte Array //wenn i == 2 ist, hat Dein Array die Element 0 und 1, Du schreibst aber in //Element 2, das es gar nicht gibt printen(&array_filepointer[i]); //Adresse des filepointers wird übergeben um den wert dieser adresse also meinen filepointer dann in der Funktion zu benutzen. //Wieso gibst Du hier die Adresse des Filepointers weiter, und nicht den //Filepointer selbst, wie ich es Dir ein paar Postings zuvor vorgemacht habe? fclose(array_filepointer[i]); //und hier wird das Array wieder zerstört, weil der Scope zu Ende ist, //in der Zwischenzeit hast Du nur einen einzigen Wert in bzw. hinter das Array //geschrieben, Du brauchst also gar kein Array } return 0; }
Falls ich irgendwas falsch verstanden habe bin ich für jeden Tipp sehr dankbar.
mfg
-
Deine Version mit 6 Dateinamen und Handles
#include <stdio.h> #include <stdlib.h> #include <string.h> void printen(FILE *array_filepointer) // die Adresse meines Filepointers wird übergeben { fprintf(array_filepointer,"Hallo ich bin KLaus und du bist maus"); return; } int main() { int anzahl=6; char array_filename[anzahl][50]; // erzeuge array was 6 verschiedene Dateinamen enthält FILE *array_filepointer[6]; // Da kommen schon die Filepointer rein und keine Dateinamen int i; for (i=0; i<6; i++) // hier werden die Arrays beschrieben { sprintf(array_filename[i],"filename%d",i); } for(i=0; i<6; i++) { array_filepointer[i]=fopen(array_filename[i],"w"); // Filepointer bekommt die adresse von meiner .txt datei zugewiesen. } for(i=0; i<6; i++) { printen(array_filepointer[i]); } for(i=0; i<6; i++) { fclose(array_filepointer[i]); } return 0; }
Gleiche Funktionalität mit 1 Dateinamen und Handle
#include <stdio.h> #include <stdlib.h> #include <string.h> void printen(FILE *array_filepointer) // die Adresse meines Filepointers wird übergeben { fprintf(array_filepointer,"Hallo ich bin KLaus und du bist maus"); return; } int main() { int anzahl=6; char array_filename[50]; // erzeuge array was 6 verschiedene Dateinamen enthält FILE *array_filepointer; int i; for (i=0; i<6; i++) // hier werden die Arrays beschrieben { sprintf(array_filename,"filename%d",i); array_filepointer=fopen(array_filename,"w"); // Filepointer bekommt die adresse von meiner .txt datei zugewiesen. printen(array_filepointer); fclose(array_filepointer); } return 0; }
BEide Ungetestet und evtl mit kleinen Fehlern.
-
@ Belli ich habs noch nichts umgeschrieben, weil ich's verstehen wollte bevor ich's umschreibe.
Also kurz zusammenfassen,
nen Filepointer dynamisch zu gestallten ist nicht notwenig wenn ich ihn in einer schleife nacheinander auf verschiedene Dateien zeigen lasse.
also:schleifendurchgang 1
Filepointer = fopen("name1","w");
datei beschrieben
fclose(Filepointer)schleifendurchgang 2
Filepointer = fopen("name2","w");
datei beschrieben
fclose(Filepointer).
.
.richtig?
-
Die Tatsache, dass du deinen fehlerhaften Originalcode wieder aufschreibst und die hier gegebenen Hinweise nicht berücksichtigst, deutet darauf hin, dass du das Problem nicht verstanden hast bzw. sogar nicht verstehen willst.
-
#include <stdio.h> #include <stdlib.h> #include <string.h> # void printen(FILE* array_filepointer) { fprintf(array_filepointer,"Hallo ich bin KLaus und du bist maus"); return; } int main() { int anzahl=6; char array_filename[anzahl][50]; FILE* array_filepointer; int i; for (i=0; i<6; i++) { sprintf(array_filename[i],"filename%d",i); array_filepointer[=fopen(array_filename[i],"w"); printen(array_filepointer[i]); fclose(array_filepointer[i]); } return 0; }
An einem richtigen Code kann ich nicht erklären wie ich evtl. falsch gedacht hab an meinem falschen code geht das schon...
-
Ich weiß zwar nicht, was Du mit 'Filepointer dynamisch gestalten' meinst, aber das tust Du ja gar nicht.
Wie ich in Deinem obigen Text per Kommentar ergänzt habe, erstellst Du in jedem Schleifendurchlauf ein neues (unnötiges) Array.
Unnötig, weil Du sowieso immer nur einen Platz davon beschreiben willst (tatsächlich aber schreibst Du ja wie erwähnt hinter das Array).Und ja, wenn Du nicht irgendwann zwei Filepointer zur gleichen Zeit benötigst, dann brauchst Du auch kein Array von Filepointern.
-
Jup, ich glaub darin lag der denk Fehler.
Danke für die Hilfe