C Programmierung, Datei anlegen

  • Hallo,


    ich möchte mit einem C Programm eine Datei in einem Verzeichniss erstellen.
    Nun habe ich es soweit hinbekommen, daß eine Datei erstellt wird, doch leider ist diese Datei dann in dem selben Verzeichniss wie die C Datei.


    Meine Frage ist, wie kann ich die Datei in einem anderem Verzeichniss erstellen?


    In meinem Beispiel ist "datei" eine Variable.


    Code
    FILE *datei_ein;
    datei_ein = fopen( datei,"w");
    fclose(datei_ein);



    Gruß
    Dirk

  • Es sei datei (mit char* datei) der Name der Datei: dieser kann alle Werte annehmen, die Du zur Adressierung einer Datei aus dem aktuellen Verzeichnis während der Ausführung (Du schreibst: "in dem selben Verzeichnis wie die C Datei" -- eigentlich ist es das aktuelle Verzeichnis, in dem Dein Programm ausgeführt wird, und Du startest das Programm eben in dem Verzeichnis, in dem die Programmdatei liegt) verwenden kannst.


    Beispiele (mit Windows-Pfadnamen):


    Das aktuelle Verzeichnis sei C:\myprograms\src\


    datei = "foo" ---> C:\myprograms\src\foo
    datei = "dat\foo" ---> C:\myprograms\src\dat\foo
    datei = "..\dat\foo" ---> C:\myprograms\dat\foo
    datei = "\dat\foo" ---> C:\dat\foo
    datei = "D:\dat\foo" ---> D:\dat\foo


    Gruß
    Michael

    History: Motorola e930, t720, RAZR V3, MOTORAZR maxx V6, MOTOROKR Z6, MOTOROKR E8, MOTOZINE ZN5, Samsung S8000 Jet

  • ...und nicht vergessen backslashes in strings immer mit '\\' escapen...
    z.b. "c:\\myfiles"

    !ND - E71

  • Michael P.:
    Wenn ich es so mache, dann hatte ich das Problem, daß die Variable nicht mehr als Variable erkannt wurde.


    In meinem Beispiel ist "datei" eine Variable.



    !ND: würde das bedeuten, daß ich dann unter Linux // benutzen muß?
    z.B: "file://myfiles"



    Gruß
    Dirk

  • DirkP:
    Nein, das bedeutet es nicht. / ist ein ganz normales Zeichen, dass genau so verwendet werden darf. Nur \ ist ein Zeichen, dass manchmal besondere Bedeutung hat - man denke da an \n zum Beispiel. Man nennt die durch \ eingeleiteten Sonderzeichen "Escapes". Und wenn man ein \ selbst schreiben will, muss man die "escapende" Wirkung des \ durch ein "Escape" aufheben. Also eben \\.


    Alle Klarheiten beseitigt?


    (In kann ja leider kein C, aber aus Perl kenne ich die praktische Schreibweise, dass Zeichenfolgen in " escaped werden müssen, aber solche in ' eben nicht. An die C-Kenner: Ginge also etwas wie
    datei = 'c:\pfad\datei.ext' ?)


    Gruß, Simon

  • Zitat

    Original geschrieben von jSh
    (In kann ja leider kein C, aber aus Perl kenne ich die praktische Schreibweise, dass Zeichenfolgen in " escaped werden müssen, aber solche in ' eben nicht. An die C-Kenner: Ginge also etwas wie
    datei = 'c:\pfad\datei.ext' ?)


    nope. dazu müsste man auf C# umsteigen ;)
    da geht @"c:\blabla\blabla"

    !ND - E71

  • Dirk:

    Zitat

    Michael P.:
    Wenn ich es so mache, dann hatte ich das Problem, daß die Variable nicht mehr als Variable erkannt wurde.


    In meinem Beispiel ist "datei" eine Variable.


    von welchem Typ? als char * muss das funktionieren:


    FILE *datei_ein;
    char *datei;
    datei = "/home/dirkp/datafile"
    datei_ein = fopen( datei, "w" );
    ...
    fclose( datei_ein );


    Oder meinst Du die Beschwerden des Compilers, die sich ergeben, wenn die Backslashes nicht escaped werden (das hatte ich ja in meinen Beispielen nicht drin gehabt, worauf !ND hingewiesen hat)

    History: Motorola e930, t720, RAZR V3, MOTORAZR maxx V6, MOTOROKR Z6, MOTOROKR E8, MOTOZINE ZN5, Samsung S8000 Jet


  • Michael P.:


    Mein Problem war folgendes:


    ich habe eine Variable die z.B: "datei" heist und in dem Programm einen Namen zugewiesen bekommt.


    Wenn ich das ganze jetzt so mache (in diesem Beispiel wäre dann datafile die Variable, wo den Namen wie die Datei heisen soll zugewiesen bekommt):



    Dann will er nicht eine Datei mit dem Namen textdatei.txt im Verzeichniss /home/dirkp/ erstellen, sondern eine Datei Namens datafile.


    Ich hoffe des habe ich jetzt nicht zu kompliziert erklährt.



    Grad eben bin ich auf den Befehl strcat gestoßen, der mir mein Problem gelöst hat.
    Geht es auch anders?
    strcat soll nicht sicher sein in hinsicht auf Buffer Overflow.



    Gruß
    Dirk

  • Zitat

    Original geschrieben von DirkP
    Geht es auch anders?
    strcat soll nicht sicher sein in hinsicht auf Buffer Overflow.


    alles was du in der string.h findest ist nicht sicher in der hinsicht. es reicht einen string ohne abschließenden ascii 0 zu übergeben und das ding liest/schreibt munter bis zum ende des adressraumes... wenns vorher nicht abstürzt ;)


    auch wenn man unbedingt wissen sollte wie c-standard strings funktionieren: imho sind sie total veraltet. heute gibts dafür klassen.

    !ND - E71

  • DirkP: Wenn Du einen overflow verhindern möchtest: schau' Dir mal strncpy an -- damit kannst Du die Anzahl der zu kopierenden Zeichen einschränken (auf die Größe Deines Puffers). Beachte, dass strncpy nicht automatisch ein null-Byte anfügt, falls sich in den ersten n Zeichen des Quell-Strings kein 0 befindet. Also sicherheitshalber ein Zeichen weniger kopieren, als der Puffer lang ist, und ganz ans Ende des Puffers manuell ein 0 schreiben.

    History: Motorola e930, t720, RAZR V3, MOTORAZR maxx V6, MOTOROKR Z6, MOTOROKR E8, MOTOZINE ZN5, Samsung S8000 Jet

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!