[C] Datei lässt sich nach 506 Iterationen nicht mehr öffnen

Lord_Brainbug

Grünschnabel
Hallo allerseits,

Das Problem:
Windows kann Datei 506 Durchläufe lang öffnen, aber im 507ten Durchlauf nicht mehr.

Ich arbeite an einem Optimierungsprogramm in C. Das Betriebssystem ist Windows 7, 64 Bit. Bevor ich den Code poste (der aktuell fast nur aus Einträgen zur Fehlerfindung besteht) wollte ich eine Allgemeine Frage stellen.

Ich habe eine for-Schleife, die von der Struktur her wie folgt aufgebaut ist:

- Berechne Werte mit externem Solver
- Öffne Ausgabe.txt und finde Werte die nicht passen; speichere dazugehörige Punkte in ein Array
- Schließe Ausgabe.txt
- Öffne die Eingabe.txt (hier stehen die Ausgangswerte: Punkte und Koordinaten)
- Lese Eingabedatei.txt Zeile für Zeile ein und kopiere in Eingabe2.txt
- Wenn in Eingabe.txt an einem Knoten angekommen der per Definition nicht passt, dann schreibe zufällige andere Koordinaten in Eingabe2.txt (Das zufällige folgt natürlich vorgegebenen Regeln)
- Schließe Eingabe.txt und Eingabe2.txt
- Lösche Eingabe.txt und benenne Eingabe2.txt in Eingabe.txt um

Dann fängt die Schleife wieder von vorne an. Zwischendurch gibt es ein paar Situationen, in denen die Schleife frühzeitig verlassen wird, aber die helfen hier (glaube ich) nicht weiter.

Getestet habe ich das ganze mit 500 Iterationen, hat super funktioniert. Je nach Einstellung waren die gewünschten Werte schon vorher erreicht und das Programm hat sich beendet oder wenn der gewünschte Optimum nicht erreicht wurde, gab es den dazugehörigen Text auf die Konsole aus.

Habe dann die Iterationen erhöht (auf 50000).
Jetzt bricht das Programm nach 506 Iterationen (in der 507ten) ab, da es die Eingabe.txt nicht öffnen kann.

Wenn ich das Programm sofort neu starte, ohne etwas an Eingabe und Ausgabe Dateien zu ändern, läufht es wieder 506 mal durch und kann beim 507ten Durchlauf die Eingabe.txt nicht mehr öffnen.

Also nun meine Frage:

Ist bei Windows die Anzahl an Dateien, die man in einem bestimmten Zeitraum öffnen kann, begrenzt?

Meine andere Idee war es, dass irgend ein Stack voll läuft, finde in meinem Programm dazu aber keinen Fehler.

Ich werde den Code posten, sobald dieser bereinigt ist. Ich denke es ist wenig hilfreich wenn ich hier 2000 Zeilen Code hinklatsche.

Schon mal vielen Dank für die Hilfe.
 

Technipion

Erfahrenes Mitglied
Hallo Lord_Brainbug,
Bratkartoffels Beitrag enthält eigentlich schon alles, ich möchte nur noch etwas Pfeffer und Salz hinzufügen.
Ich denke es ist wenig hilfreich wenn ich hier 2000 Zeilen Code hinklatsche.
Ganz im Gegenteil. Der Code ist die Grundlage. Also wenn es rechtlich in Ordnung ist, dass du ihn hier postest, dann scheue dich nicht. Falls es wirklich viel Code ist, kannst du ihn ja in einen Spoiler packen ;).
- Lese Eingabedatei.txt Zeile für Zeile ein und kopiere in Eingabe2.txt
Ist das nur ein Tippfehler oder gibt es wirklich eine "Eingabedatei.txt". Ich kann keine Stelle finden wo die geschlossen wird?
Zwischendurch gibt es ein paar Situationen, in denen die Schleife frühzeitig verlassen wird, aber die helfen hier (glaube ich) nicht weiter.
Hmmm. Das kommt darauf an. Wenn die Schleife verlassen wird, werden die Datei-Handles dann trotzdem ordentlich freigegeben?
Schliesst du die Dateien auch sauber wieder?
Das ist wohl die wichtigste Frage. Also: Code her :D.

Übrigens: Die Anzahl geöffneter Dateien ist standardmäßig begrenzt: http://stackoverflow.com/a/870224. Deine 506 liegt verdächtig nahe am Standard von 512 :p.

Gruß Technipion
 

Lord_Brainbug

Grünschnabel
Vielen Dank für die Antworten.
Habe den Code jetzt umgeschrieben und vorbereitet um ihn hier hochzuladen, und mein vierten Durchlesen bemerkt dass ich einen Buchstabendreher beim Schließen einer Datei hatte......
Ich glaube wenn man recht lange mit sowas arbeitet überliest man bestimmte stellen einfach weil man weiß was dort stehen soll.

Jetzt funktioniert das Ganze so wie es soll.

Nochmal vielen Danke für die schnellen Antworten