Mehrere Textfiles mit fopen einbinden?!

Davicito

Erfahrenes Mitglied
Hallo,

ich weiß, wie ich eine Textdatei einbinden kann und auch wie ich ein Ergebnis in eine Textdatei schreibe.
Aber ich weiß leider nicht, wie ich mehrere Textdateien einlesen kann.

Aufgabenstellung:

Mit folgendem Konsolenausdruck wird mein Programm aufgerufen:

./Liste <option> <Ausgabefile> <Eingabefile1> <Eingabefile2> ... <EingabefileN>.

optionen ist hier zu ignorieren, da das auch funktioniert

Folgender Programcode zu meinem Problemchen ^^
C:
...
FILE *file1[argc-3], *file2;
...
int i = 3;
while(i >= 3 && i< argc ) // Anzahl der Textdateien 
{
		// argv[1] = optionsparameter
        // argv[2] = Ausgabetextfile
        // argv[i] = Eingabetextfiles (i = Anzahl) 

		if(argc > 1 && argv[1] != NULL && (file2 = fopen(argv[2], "write")) != NULL && (file1 = fopen(argv[i], "read")) != NULL)
		{			
			while(fgets(buffer, SIZE, file1[i]) != NULL)
			{				
				....						
				while(wort != NULL)
				{								
					anhaengen(aktl_Elem, wort, copyString, counter1);
									
					wort = strtok(NULL, splitt);		    				
				}										    		
			}
            fclose(file1); 				
		}
                i++;
}
fclose(file2); // Da die äußere While-Schleife evtl. mehrere Eingabetextfilse ließt, soll
		       // die geschriebene Datei auch solange offen bleiben. 
...
Habe ich da die Logik von fopen und fclose falsch verstanden, oder ist das ersteinmal richtig so?
Oder sollte ich für jede Eingabedatei ein extra Stream aufmachen?

Sprich:
file1 = fopen(argv[3], "read"))
file3 = fopen(argv[4], "read"))
file3 = fopen(argv[5], "read"))
etc.

und anschließend alle wieder einzeln schließen

Gruß.
 
Zuletzt bearbeitet:
Hi.

Wenn du die Dateien nacheinander verarbeiten kannst, wäre eine mögl. Vorgehensweise:
Code:
// Pseudocode

parse_options()

out = open_output_file()

for name in argv[3 to argc] do
  in = open(name)
  if is_open(in) then process(in)
  else error()
  close(in)
next

close(out)
Gruß
 
Hmmm.. ist das überhaupt C ?

Diese Zeilen verstehe ich nun komplett nicht, in Anlehnung auf meine Frage bzw. Problem was ich in C habe.
Könntest du mir das C-tauglich machen?

Gruß.
 
Zuletzt bearbeitet:
Ok.. der Begriff war mir nicht so geläufig. Sorry!
Aber denn noch sagt mir der Pseudocode wenig. Wenn Du mir schon nicht den goldenen Löffel in den Mund legst, könntest Du das in eigenen Worten fassen, was du mit dem Pseudocode meinst? Ich weiß du hast eine Schleife in dem die Dateien einzeln geöffnet werden, und nach der Übergabe mit if, wieder geschlossen. aber hey.. das habe ich oben in meinem Code auch nicht anders!

Wollte nur wissen ob so wie ich das oben aufgeführt habe, korrekt ist oder nicht. Und wenn nicht, wieso? Du musst mir auch keinen Code schreiben! ich möchte es nur verstehen!

Gruß.
 
Ok.. der Begriff war mir nicht so geläufig. Sorry!
Aber denn noch sagt mir der Pseudocode wenig. Wenn Du mir schon nicht den goldenen Löffel in den Mund legst, könntest Du das in eigenen Worten fassen, was du mit dem Pseudocode meinst? Ich weiß du hast eine Schleife in dem die Dateien einzeln geöffnet werden, und nach der Übergabe mit if, wieder geschlossen. aber hey.. das habe ich oben in meinem Code auch nicht anders!
Doch dein Code sieht ziemlich anders aus. Vergleiche mal die Struktur der Codeschnipsel.
Wollte nur wissen ob so wie ich das oben aufgeführt habe, korrekt ist oder nicht.
Nein.
Und wenn nicht, wieso?
Das sollte eigentlich offensichtlich sein... :confused: Wo und vor allem wieoft öffnest du denn deine Ausgabedatei?

Gruß
 
Ich öffne in Zeile 11 in der If-Abfrage die Dateien jeweils nur einmal -
Code:
file1 = fopen(argv[i], "read").
meine While-Schleife öffnet die einzelen Streams hintereinander, wie Parameter auf der Konsole angegeben sind (Zeile 5). Geschlossen wird jeder geöffnete File in Zeile 23

Hab Dein Code verglichen, ist aber genau das selbe Prinzip
Wenn du der Meinung bist, das er dennoch nicht richtig ist, wie würdest du das realisieren. Begründung bitte nur Sätze!

Gruß.
 
Hi

deepthroat meint die file2-Datei.
Die öffnest du immer wieder in der Schleife und schließt sie aber nur ein einziges Mal danach.
Da das Ganze auch noch zum Schreiben ist, wird das erste Öffnen funktionieren, die weiteren nicht mehr.
Weil immer nur einer gleichzeitig schreiben kann und du die Datei ja nicht jedes Mal wieder schließt.

Nochwas dazu: "write" und "read" als zweite fopen-Parameter anzugeben ist seltsam.
Warum nicht einfach w und r?

Zum generellen Ablauf:
Was ist am Pseudocode von deepthorat so unverständlich?

Zuerst verarbeitest du die Optionsparameter in argv[1].
Einmal, nicht in jedem Schleifendurchgang

Dann öffnest du die Ausgabedatei mit argv[2]. Auch außerhalb der Schleife.

Dann machst du eine Schleife von 3 bis (argc-1) und
{
Öffnest eine Eingabedatei. Dateiname in argv[...Schleifennummer...].
Dazu brauchst du übrigens auch nur eine FILE-Variable, kein Array davon.

Verarbeitest die Eingabedatei.

Schließt die Eingbedatei wieder.
}

Dann schließt du die Ausgabedatei. Außerhalb der Schleife.

Zu der Ausgabedatei und in der Schleife zur Eingabedatei gehören noch jeweils Prüfungen, ob das Öffnen geklappt hat.
Wenn die Ausgabedatei nicht geöffnet werden konnte, hats keinen Sinn, weiter zu machen: Fehlermeldung, Schluss.
Wenn eine der Eingabedateien nicht geöffnet werden konnte, musst du nur die eine auslassen und kannst mit den anderen in der Schleife trotzdem weitermachen. Ausgabe, das die Datei nicht gefunden wurde, wäre trotzdem gut.

Auch noch zum Prüfen ist ganz am Anfang, ob argc überhaupt für Optionsparameter und Ausgabedatei reicht.
Wenn argc<3 dann Ende.
Programmname, Optionsparameter, Ausgabedatei.

Gruß
 
Zuletzt bearbeitet:
;-) vielen Danke sheel,

ich habe den Glauben an Euch wieder bekommen! Deine Erklärungen waren verständlich und haben mir sehr geholfen. Das hatte ich mir so schon die ganze Zeit gewünscht!

..ja das mit "write" und "read" ist nicht korrekt, weil das Parameter sind um Schreib und Leserechte der Funktion "fopen" mitzugeben - wie ich in einem C-Buch nachgelesen habe. Ich hatte das erst ausgeschrieben gehabt -für mich, damit ich das nicht vergesse. Hab es aber wieder auf "w" und "r" zurück gesetzt.

...und Du hast völlig recht mit file2. Ich öffne das oft und schließe das nur einmal... aber da war ich völlig blind und hatte das auch komplett übersehen.

Aber vielen dank Dir! Manchmal steht man einfach auf neben sich ^^.

Gruß
 
Zurück