[C] existiert die Zieldatei?

myhonor

Mitglied
Ich will in C eine Datei erstellen (funktioniert super). Falls der Name der Zieldatei schon vergeben ist, soll abgefragt werden (y/n), ob die Datei überschrieben werden soll.

Ich weiß zwar, dass es mit ziel = fopen (name, modus) die Datei erstellen kann. Leider fehlt mir der Ansatz, könnt ihr mir da weiterhelfen?

mfg myhonor
 
Ich will in C eine Datei erstellen (funktioniert super). Falls der Name der Zieldatei schon vergeben ist, soll abgefragt werden (y/n), ob die Datei überschrieben werden soll.

Ich weiß zwar, dass es mit ziel = fopen (name, modus) die Datei erstellen kann. Leider fehlt mir der Ansatz, könnt ihr mir da weiterhelfen?

mfg myhonor
kuck mal:
FILE *fopen(const char *filename, const char *mode);
The function opens the file with the filename filename, associates it with a stream, and returns a pointer to the object controlling the stream. If the open fails, it returns a null pointer.
d. h. wenn kein null pointer, dann existiert die Datei.
Dann die Abfragen, ...


grüssle :)
 
Soll das heißen, dass ich zuerst überprüfen soll, ob die alte datei existiert?

Code:
if( (oldfile = fopen(DATEI, "r")) != NULL)
{
printf("Datei existiert bereits. Ueberschreiben? (y/n)");
scanf("%c", &answer);
}

und dann je nach answer darauf reagieren. versteh ich das jetzt richtig?
 
Zuletzt bearbeitet:
hab eine andere schwierigkeit, bei der Abfrage haut er mich raus. Er lässt mich nicht y/n eingeben.

Code:
#include <stdio.h>
#include <stdlib.h>

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

	name = malloc(30);
	answer = malloc (sizeof(char));
	printf("file? ");
	scanf("s", name);

	if( (oldfile = fopen(name, "r")) != NULL)
	{
		printf("Datei existiert bereits! Ersetzen? (y/n):\n");
		scanf("%c", answer);
	}
	if( (oldfile == NULL) || (*answer == 'y') )
	{
		filename = fopen(name, "w");
		fprintf(filename, "Ich fange mit einem header an!\n");
		fclose(filename);
	}

	free(name);
	free(answer);
	return 0;
}

find diesen dummen Fehler nicht. Nach valgrind hab ich ein Speicherleak, aber wo?
 
Moin,

Du solltest Deine VAR "answer" nicht als Zeiger deklarieren (oder aber dann dekrementieren mitz '&').

Versuch es mal so :
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("Datei existiert bereits! Ersetzen? (y/n):\n");
        scanf("%c", answer);
    }
    if( (oldfile == NULL) || (answer == 'y') || (answer == 'Y') )
    {
        filename = fopen(name, "w");
        fprintf(filename, "Ich fange mit einem header an!\n");
        fclose(filename);
    }

    free(name);
    return 0;
}

Und was bitte ist "valgrind" :confused:

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
Moin,

Und was bitte ist "valgrind" :confused:

Gruß
Klaus

valgrind ist eine Funktion, die auf dem Testserver meiner Uni verwendet wird. Sie zeigt an, ob es während der Ausführung zu Speicherleaks kommt oder nicht bzw. wie oft Speicher alloziert und wieder freigegeben wurde. Ziemlich praktisch.

Hab das Programm jetzt getestet, aber er hört immer in dem Punkt auf, wo y/n eingegeben werden soll.
Wenn ich statt "w" ein "w+" eingebe, führt er die Abfrage mit y/n aus, erstellt aber die Datei nicht.

Hab als Anhang die Fehlermeldungen des Compilers angehängt.
 

Anhänge

  • bild.jpg
    bild.jpg
    336,5 KB · Aufrufe: 28
Zuletzt bearbeitet:
Moin,

ok, das Programm kenne ich leider nicht, aber es zeigt ja scheinbar recht gut die Speicherzugriffsprobleme an.
Es wird auf jeden Fall mit Deinen Pointern und den entsprechenden Zugriffen zusammenhängen .... ;)

Hier mal ein Beispiel ohne MALLOC :
C++:
string strDatei;
FILE *fileDateiIn;
char *DateiInhalt = NULL;

bool bStop = false;
long dataLength = 0;

int fh = _sopen( strDatei.c_str(), _O_RDONLY, _SH_DENYNO );
if( (fh != NULL) && (fh != -1) )
{
    // jetzt die Länmge der einzulesenden Datei bestimmen !!
    dataLength = _lseek( fh, 0L, SEEK_END );
    _close(fh);

// ##############################################################################
// jetzt einlesen
// ##############################################################################
    DateiInhalt = new char[dataLength + 1];
    if( (fileDateiIn = fopen(strDatei.c_str(), "r+b")) != NULL )
    {
        int iNumRead = fread( DateiInhalt, sizeof(char), dataLength, fileDateiIn );
        if( iNumRead == dataLength )
        {
            DateiInhalt[dataLength] = 0;
            fclose( fileDateiIn );
        }
        else
        {
            DateiInhalt[dataLength] = 0;
            fclose( fileDateiIn );
            bStop = true;
        }
    }
    else
    {
        bStop = true;
    } // if( (fileDateiIn = fopen(strDatei.c_str(), "r+b")) == NULL )
    delete[] DateiInhalt;
}
else
{
    // Datei ex. nicht!
    bStop = true;
} // if( (fh != NULL) && (fh != -1) )

Muss es unbedingt C sein ? :-(

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
Du solltest mal mit 'nem Debugger durch den Code laufen und genau schauen, wo er anhält (Dein Bildanhang öffnet sich hier leider nicht!).

Ggf. ist auch das fprintf daran schuld !

Hier mal das Minimalbeispiel aus der Hilfe ....

C++:
/* FPRINTF.C: This program uses fprintf to format various
 * data and print it to the file named FPRINTF.OUT. It
 * then displays FPRINTF.OUT on the screen using the system
 * function to invoke the operating-system TYPE command.
 */

#include <stdio.h>
#include <process.h>

FILE *stream;

void main( void )
{
   int    i = 10;
   double fp = 1.5;
   char   s[] = "this is a string";
   char   c = '\n';

   stream = fopen( "fprintf.out", "w" );
   fprintf( stream, "%s%c", s, c );
   fprintf( stream, "%d\n", i );
   fprintf( stream, "%f\n", fp );
   fclose( stream );
   system( "type fprintf.out" );
}

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
Zurück