Datei öffnen



  • Hallo zusammen,

    ich versuche gerade C++ zu lernen und bin gerade bei dem Kapitel Dateiverwaltung. Ich lerne mit dem Buch von Andrè Willems, nur bezieht dieser sämtliche Dateioperationen auf eine bereits eingefügte Textdatei, ich aber möchte gerne beliebige Dateien auf meinem Rechner öffnen, auslesen und wiederbeschreiben.

    Das Beispiel lautet:

    String^ inhalt1=File::ReadAllText("Readme.txt",
    System::Text::Encoding::UTF7);

    Ich möchte gerne so etwas machen:

    String^ inhalt=File::ReadAllText("C:\Dokumente und Einstellungen\Desktop\ReadMe.txt");
    Console::WriteLine(inhalt);

    Laut Buch soll es:

    static String^ ReadAllText(String^ pfad, Encoding^ codierung);

    lauten, jedoch versucht mein Compiler immer im Verzeichnis der Programms die datei zu finden? Wie kann ich das ändern?

    Schonmal danke, Areas



  • Areas schrieb:

    String^ inhalt=File::ReadAllText("C:\Dokumente und Einstellungen\Desktop\ReadMe.txt");
    

    Hier sehe ich eventuell ein Problem: Der Compiler interpretiert Zeichenfolgen wie \D in Strings als so genannte Escape-Sequenzen, die Runtime sieht daher möglicherweise keine Pfade, welche durch \ abgestuft sind, sondern einen einzigen, langen Dateinamen. Du musst, wenn du in einem String ein \ schreiben willst \\ schreiben, sonst wird es durch irgendetws anderes ersetzt.

    String^ inhalt=File::ReadAllText("C:\\Dokumente und Einstellungen\\Desktop\\ReadMe.txt");
    

    MfG



  • Supi, dank dir.

    Muss aber zugeben, dass ich gerade wieder hiereingeguckt habe, weil ich selber auf die Lösung gekommen bin *schäm*.

    Aber danke nochmal für die schnelle Antwort.



  • Hallo zusammen,

    bei mir hat sich ein Folgeproblem ergeben. Und zwar möchte ich meinen Dateipfad nicht vorab in einem String abspeichern müssen, sondern diesen in meine Console eingeben, jedoch ohne den Doppelbackslash.
    Dummerweise meckert mein Compiler, beim Abspeichern des Pfades bereits. So kann ich mit:

    static System::String^ formatieren(System::String^ s)
    {
    System::String^alt="\";
    System::String^neu="\\\";
    System::String^b;
    b=s->String::Replace(alt,"neu");
    return(b->ToString());
    }

    dummerweise mein "\" nicht durch ein "\" ersetzen lassen, gibt es da eine Möglichkeit das zu realisieren?

    Gruß Areas



  • Ich verstehe Dein Problem nicht ganz!
    Du brauchst doch die doppel-Backslashes nicht!!!
    Die benötigst Du nur, wenn Du *Strings* ind C/C++ angeben willst und dort nicht das "Escape-Symbol" verwenden willst, sondern einen "richtigen" Backslash!
    Wenn Du im Source Code ein

    String ^s = "Hallo\nWorld in c:\\Test" schreibst, dann wird im "String" Folgendes daraus:
    "Hallo" + 13 + "World in c:\Test" + 0



  • Naja, um die Datei zu öffnen benötige ich deren Pfad als String und mit doppelten Backslash als Verzeichnisangabe, jedoch möchte ich bei der Consoleneingabe den Pfad eingeben können, wie er auch unter Windows angegeben wird

    (C:\Dokumente und Einstellungen\Desktop\ReadMe.txt)

    anstatt immer schon bei der Eingabe einen doppelten Backslash verwenden zu müssen

    (C:\\Dokumente und Einstellungen\\Desktop\\ReadMe.txt)
    .

    Nun stehe ich aber vor dem Problem, dass schon nach Einlesen des Strings das einzelne Backslashszeichen als Escape-Symbol behandelt wird und mein Replace nichts zum austauschen findet, wenn ich es nach "\" suchen lasse. Da muss es doch eine Lösung für geben?



  • Areas schrieb:

    Naja, um die Datei zu öffnen benötige ich deren Pfad als String und mit doppelten Backslash als Verzeichnisangabe

    WARUM?



  • Weil, wie am Anfang des Threads erwähnt, sonst der Dateipfad nicht ordnungsgemäß geöffnet wird.

    Wenn es andere Möglichkeiten gibt, eine Datei inklusive Pfad aus der Tastatureingabe auszulesen und zu öffnen, unabhängig in welchem Verzeichnis sich diese befindet, wäre ich auch sehr dankbar.

    Gruß Areas



  • Mach doch mal ein simples Beispiel der Form:

    void main()
    {
      string ^s = Console::ReadLine();
      File::ReadAlltext(s); 
    }
    

    und dann zeig mal, was da schief geht!
    Du machst was anderes falsch!



  • Also ich hab das jetzt mal mit dem ReadLine geschrieben und es funktioniert.
    Ich hatte für Testzwecke einfach vorab einen String gesetzt, wo der entsprechende Dateipfad abgespeichert war, mit einem Backslash, damit ich nicht jedesmal den Pfad von Hand eingeben muss. Ich werde also wohl zum testen weiterhin die Variante mit zwei Backslahes verwenden und dann bei Fertigstellung das wie du oben geschrieben hast ändern.

    Danke für eure Hilfe, Gruß Areas


Anmelden zum Antworten