[C] existiert die Zieldatei?

Für alle, die das Programm nachcompilieren lassen wollen: Der Fehler ist nach der Eingabe von y/n. Die Datei wird zwar erstellt, es findet aber ein Memory-Leak statt, was nicht sein darf.

C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	FILE *filename, *oldfile;
	char *name = NULL;
	char answer;

	name = malloc(30);
	printf("file? ");
	scanf("%s", name);

	if( (oldfile = fopen(name, "r")) != NULL)
	{
		printf("file %s exists and will be replaced. "
			"Do you wand to proceed? (y/n): ", name);
		scanf("%s", &answer);
	}

	if( (answer == 'y') || (oldfile == NULL))
	{
		filename = fopen(name, "w+");
		fprintf(filename, "Ich fange mit einem Header an!\nCool");
		fclose(filename);
	}

	free(name);
	return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Das "fclose" für "oldfile" fehlt übrigens, wie mir gerade auffällt .....

C++:
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char **argv)
{
    FILE *filename, *oldfile;
    char *name = NULL;
    char answer;
 
    name = malloc(30);
    printf("file? ");
    scanf("%s", name);
 
    if( (oldfile = fopen(name, "r")) != NULL)
    {
        printf("file %s exists and will be replaced. "
            "Do you wand to proceed? (y/n): ", name);
        scanf("%s", &answer);
// !
    fclose(filename);
// !
    }
 
    if( (answer == 'y') || (oldfile == NULL))
    {
        filename = fopen(name, "w+");
        fprintf(filename, "Ich fange mit einem Header an!\nCool");
        fclose(filename);
    }
 
    free(name);
    return 0;
}

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
OK, Problem gelöst, wenn die Datei existiert. Das nächste Problem ist, wenn die Datei noch nicht existiert (sie muss neu erstellt werden). Laut Valgrind ist der Fehler in der 2. If-Abfrage (answer == 'y') || (oldfile == NULL)

Ich hab jetzt die Bedingungen vertauscht (zuerst oldfile, dann answer). In beiden Fällen (existiert/existiert nicht) funktioniert es ohne Memory leak und ohne Errors (obwohl die Bedingung nicht erfüllt ist, wenn es keine Datei gibt, und trotzdem kein ML).

Danke an alle beteiligten. Ein großteil der Übung ist geschaft.
 
Laut Valgrind ist der Fehler in der 2. If-Abfrage (answer == 'y') || (oldfile == NULL)
Ich hab jetzt die Bedingungen vertauscht (zuerst oldfile, dann answer).
In beiden Fällen (existiert/existiert nicht) funktioniert es ohne Memory leak und ohne Errors (obwohl die Bedingung nicht erfüllt ist, wenn es keine Datei gibt, und trotzdem kein ML).

Danke an alle beteiligten. Ein großteil der Übung ist geschaft

Äääh - nur mal so zur Info:
Deine Bedingung ist eine ODER-Verknüfung (!) :eek:
D. h. die Bedingung ist wahr, wenn eine von beiden Teilbedingungen wahr (!)
"A oder B" ist genau das Gleiche wie "B oder A" .......
Es ist nur die Frage, wie es der Compiler abhandelt!

Im Regelfall wird zuerst A geprüft und wenn A TRUE ist, dann B nicht mehr ! ! ! !
Lediglich wenn A FALSE ergibt, wird B geprüft ! ! !

Ergo: prüft Du erst, ob "oldfile == NULL" ist und es IST NULL, dann ist es völlig egal ob du ein 'y' oder sonstwas eingegeben hast ! ! ! ! !
Das solltest Du so leicht gemischten Bedingungen immer dabei beachten !

Gruß
Klaus
 
Zuletzt bearbeitet:
Zurück