Hilfe fopen zerstört Variableninhalte



  • Hallo alle miteinander,

    ich habe ein schwerwiegendes Problem mit der Funktion fopen():

    Ich habe einen doppelpointer char ** ctext, in diesem steht der bearbeitete Inhalt einer Textdatei drinnen.
    Die Variable funktioniert mit der Ausgabe einwandfrei, alle escape-sequenzen wie \n \r \0 sind an den entsprechenden Stellen richtig vorhanden.

    Nun zu meinem Problem:

    Ich gebe die Variable **ctext als %s aus. Die Variable ist heil und die Ausgabe funktioniert einwandfrei.

    Jetzt führe ich die Funktion fopen(); aus:

    FILE * data;
    data = fopen("output.txt", "w+");

    Nachdem ich das gemacht habe wird der Inhalt meiner Variable ohne das ich in irgendeiner Weise eine Änderung am Inhalt etc. vorgenommen habe nach dem 12. Zeichen abgeschnitten. Diesen Effekt habe ich auf verschiedenen Rechnern.

    Ausgabe:
    *Vor fopen();:*
    Das hier ist ein Test,\n\r
    hat es funktioniert?\0

    *Nach fopen();:*
    Das hier istùÿ

    *Jetzt geht es weiter mit fwrite()...*

    Ich habe auch schon probiert fopen() durch freopen() zu ersetzen, aber es ändert nichts an dem Ergebniss...

    Leider kann ich da ich die Software im Auftrag einer Firma schreibe nicht den Quelltext posten. 😞

    Meine Frage ist aber kennt jemand das Problem? Hängt das mit einem Puffer etc. zusammen?

    Ich wäre Euch sehr dankbar wenn Ihr mir bei der Lösung helfen könntet.

    Mfg
    Vince



  • Vince schrieb:

    Hängt das mit einem Puffer etc. zusammen?

    Nein, und es hat auch nichts mit dem Aufruf von fopen zu tun!

    Irgendwo anders in deinem Programm greifst du
    fehlerhaft auf eine Variable zu (Arraygrenzen überschritten?)
    die das Überschreiben verursacht.

    Ohne Code können wir dir nicht helfen.

    Aber um zu verhindern, deinen ultra-geheimen Firmen
    source-code zu posten, kürze dein Programm einfach soweit,
    solange der Fehler noch auftritt und poste diesen Code.



  • So, hab den Code mal abgeändert..
    Der Fehler ist nach wie vor der selbe..
    Ich kopiere Daten von einem Pointer in den anderen, funktioniert auch alles wunderbar, bis zum fopen() danach ist der Inhalt von **ctext2 weg.

    Die Reihenfolge der Befehle in meinem Originalcode ist die selbe, vor dem Code in der Funktion unten ist nichts von mir entfernt worden, nur Funktionen davor und Code danach.

    void function(char **ctext){
    
    int i = 0, l = 0, w = 0;
    	char * ctext2;
    	FILE *data2;
    //zeichenweises kopieren des Pointers ctext in den Pointer ctext2
    while(w < l) {
    		*(ctext2 + i) = *(*(ctext) + i);
    		*(ctext2 + (i+1)) = '\0';
    		if (*((*ctext) + i) == '\n'){
    			w++;	
    		}
    		i++;
    	}
    	//Hier steht alles Ordnungsgemäß in der Variable **ctext2
    	data2 = freopen("lld_output.txt", "w+", stdout);
    	//Hier ist alles nach dem 12 Zeichen weg...
    	fwrite(ctext2, strlen(ctext2), 1, data2);
    	fclose(data2);
    
    }
    

    Nochmals Danke für Eurere Mühe!

    MfG
    Vince



  • Ups, Fehlerteufel,

    vor der whileschleife wird **ctext2 natürlich noch allocated:
    ctext2 = malloc((i+1)*sizeof(char));

    Der Sourcecode sieht also wie folgt aus:

    void function(char **ctext){
    
    int i = 27, l = 0, w = 0;
        char * ctext2;
        FILE *data2;
    ctext2 = malloc((i+1)*sizeof(char));
    //zeichenweises kopieren des Pointers ctext in den Pointer ctext2
    while(w < l) {
            *(ctext2 + i) = *(*(ctext) + i);
            *(ctext2 + (i+1)) = '\0';
            if (*((*ctext) + i) == '\n'){
                w++;   
            }
            i++;
        }
        //Hier steht alles Ordnungsgemäß in der Variable **ctext2
        data2 = freopen("lld_output.txt", "w+", stdout);
        //Hier ist alles nach dem 12 Zeichen weg...
        fwrite(ctext2, strlen(ctext2), 1, data2);
        fclose(data2);
    
    }
    


  • "w+" Anlegen einer Datei zum Ändern. Existiert eine Datei mit gleichem Namen, wird diese zuvor gelöscht. Bei Fehlern oder mangelnden Rechten liefert fopen() hier NULL zurück."



  • Von Fehlerüberprüfungen oder memcpy hälst du nicht viel, oder?



  • Vince schrieb:

    Ups, Fehlerteufel,

    vor der whileschleife wird **ctext2 natürlich noch allocated:

    Was soll **ctext2 heißen? Im Programm ist ctext2 ein einfacher char-Pointer. Du solltest das Programm übrigens möglichst so kürzen, dass der Rest noch lauffähig ist und das beschriebene Fehlverhalten reproduziert. Hier ist jetzt einfach so viel falsch, dass du das unmöglich ernst meinen kannst.



  • @aha:
    Was der "w+" Parameter macht ist mir bewusst.

    @hehe:
    Das Errorhandling habe ich extra entfernt, aber ich habe Rechte und die Datei wird auch erzeugt, aber eben mit dem fehlerhaften Inhalt der ctext2 Variable nach fopen().

    @Bashar:
    Ich weiß zwar nicht wirklich ob Dir das Hilft, aber bitte:

    int function (void){
    	char *ctext = "Hello World!!!";
    	FILE *data = NULL;
    	printf("%s", ctext); //Inhalt da
    	data=fopen("test.txt", "w+");
    	printf("%s", ctext); //Inhalt ab 12. Zeichen weg
    	fclose(data);
    	return(0);
    }
    


  • Vince schrieb:

    @aha:
    Was der "w+" Parameter macht ist mir bewusst.

    @hehe:
    Das Errorhandling habe ich extra entfernt, aber ich habe Rechte und die Datei wird auch erzeugt, aber eben mit dem fehlerhaften Inhalt der ctext2 Variable nach fopen().

    @Bashar:
    Ich weiß zwar nicht wirklich ob Dir das Hilft, aber bitte:

    int function (void){
    	char *ctext = "Hello World!!!";
    	FILE *data = NULL;
    	printf("%s", ctext); //Inhalt da
    	data=fopen("test.txt", "w+");
    	printf("%s", ctext); //Inhalt ab 12. Zeichen weg
    	fclose(data);
    	return(0);
    }
    

    Lass die Anwendung mal mit Valgrind laufen, da zerschiesst du dir irgendwo ganz böse was und nicht in dieser Funktion.



  • Du willst uns ernsthaft klarmachen, dass das so funktioniert?!
    Am Anfang ist i=27 du erstellst nen buffer der größe i, aber du greift auf buffer+i zu und erhöhst i weiter!
    Zudem sind w und l jeweils 0, was macht da wohl die while schleife?!



  • lagalopex schrieb:

    Du willst uns ernsthaft klarmachen, dass das so funktioniert?!
    Am Anfang ist i=27 du erstellst nen buffer der größe i, aber du greift auf buffer+i zu und erhöhst i weiter!
    Zudem sind w und l jeweils 0, was macht da wohl die while schleife?!

    Ja ich hab das i auf 27 gestellt, weil in einer anderen Funktion die Länge der Datei festgestellt wird, aber da ich den Quelltext kürzen musste habe ich das auf 27 gestellt, da die Textdatei aus der ich lese 27 Zeichen beinhaltet.

    stack corruption schrieb:

    Lass die Anwendung mal mit Valgrind laufen, da zerschiesst du dir irgendwo ganz böse was und nicht in dieser Funktion.

    Das Probiere ich mal aus, danke



  • Vince schrieb:

    stack corruption schrieb:

    Lass die Anwendung mal mit Valgrind laufen, da zerschiesst du dir irgendwo ganz böse was und nicht in dieser Funktion.

    Das Probiere ich mal aus, danke

    So, hab es jetzt mal mit mehreren Debuggern (unter Windows und Linux) durchlaufen lassen, leider bringen die mir auch nicht viel, die stürzen alle beim fopen()befehl ab.
    Folgende Meldung kommt:
    malloc(): Memory Corruption!

    Hoffentlich kann jemand etwas damit anfangen...



  • Vince schrieb:

    Vince schrieb:

    stack corruption schrieb:

    Lass die Anwendung mal mit Valgrind laufen, da zerschiesst du dir irgendwo ganz böse was und nicht in dieser Funktion.

    Das Probiere ich mal aus, danke

    So, hab es jetzt mal mit mehreren Debuggern (unter Windows und Linux) durchlaufen lassen, leider bringen die mir auch nicht viel, die stürzen alle beim fopen()befehl ab.
    Folgende Meldung kommt:
    malloc(): Memory Corruption!

    Hoffentlich kann jemand etwas damit anfangen...

    Das liegt nicht an fopen, du hast dir deinen Stack schon wo ganz anders zerschossen.



  • Soo, habe das Problem jetzt (zufällig) selber durch eine neuinstallation von cygwin gelöst.

    Trozdem danke an alle für Euere Mühe.

    Gruß Vince



  • Vince schrieb:

    Soo, habe das Problem jetzt (zufällig) selber durch eine neuinstallation von cygwin gelöst.

    Lösen durch Systemneustart??? das wird dir bestimmt irgendwann mal wieder über die Ohren fliegen. Verwende lieber valgrind und gdb um zu gucken, wo die Fehler liegen, denn du zerschiesst dir irgendwo den Stack.



  • Ich habe mein System nicht neugestartet, sondern lediglich Cygwin neuinstalliert, wie schon oft gesagt mein Stack war und ist einwandfrei. Seit dem ich die neueste Version von gcc habe läuft das Programm auf allen System einwandfrei.


Anmelden zum Antworten