Seite 1 von 1

fstream.open akzeptiert String-Objekt als Argument nicht???

Verfasst: Sa Dez 06, 2014 12:26 am
von heizoeli
Hallo liebe C/C++ - Gemeinde!

Ich bin C/C++ Neuling, ein bisschen am Einlesen und Probieren und habe zum ersten Mal ein (naja) ernstes Problem:

Ich will eine Datei zum Lesen öffnen. Der Datei- bzw. Pfadname soll per Kommandozeilenargument ( argv ) übernommen werden. Bevor mit dem Pfadnamen die Datei geöffnet wird, soll ggf. noch automatisch die Namenserweiterung angehängt werden, Bsp. ".txt". Für solche String-Operationen gibt es ja in der C++ Standard-Bib die Klasse "string" mit lauter wunderbaren und nützlichen Funktionen.

Jetzt hab ich aber das Problem: Ich schaffe es nicht, das string-Objekt der fstream.open-Methode als Argument schmackhaft zu machen - der Compiler gibt ständig Fehlermeldungen aus. (Im Codebeispiel die Zeile "Datei.open(Dateiname, ios::in)" , wobei Datei ein ifstream und Dateiname das string-Objekt ist. )

Was mache ich falsch?
Habe trotz Suche keine Lösung gefunden.

Muss ich etwa auf cstring ausweichen (dann ist es aber nicht mehr "reinrassig" C++ ...)?
Oder muss ich vielleicht "nur" einen kleinen aber wichtigen Operator benutzen?
Oder einen anderen Workaround verwenden?

Falls das ne Rolle spielt, ich verwende gcc bzw. g++, die Platform ist Linux Debian wheezy.

LG heizoeli

Code: Alles auswählen

    #include <iostream>
    #include <fstream>
    #include <string>

    using namespace std;

    int main(int argc, char* argv[])
    {
       string buffer;
       string Dateiname;
       ifstream Datei;

       if (argc >= 2) {
          Dateiname = argv[1];
          Dateiname += ".txt";
          
          cout << Dateiname << endl; // zur Kontrolle ob Dateiname stimmt
          
          Datei.open(Dateiname, ios::in);
                 //  ^ Das akzeptiert die ifstream.open -Funktion nicht
                 //    Was mache ich falsch?
                
  //      Datei.open("Test.txt", ios::in); // funktioniert
          
          getline(Datei, buffer);
          cout << buffer << endl;

          Datei.close();
       }
        return 0;
    }

Re: fstream.open akzeptiert String-Objekt als Argument nicht

Verfasst: Sa Dez 06, 2014 4:36 am
von nufan
Wie du in der Dokumentation zu open() erkennen kannst, gibt es die Funktionsüberladung für std::string erst seit C++11. Dein Compiler verwendet aber - wenn du ihm nichts Anderes mitteilst - einen älteren Standard. Du kannst jetzt:
a) Deinem Compiler sagen er soll C++11 verwenden (-std=c++11)
b) Dein std::string Objekt in einen char-Zeiger umwandeln (Dateiname.c_str() im Aufruf von open())

Re: fstream.open akzeptiert String-Objekt als Argument nicht

Verfasst: Sa Dez 06, 2014 9:14 am
von heizoeli
dani93 hat geschrieben: b) Dein std::string Objekt in einen char-Zeiger umwandeln (Dateiname.c_str() im Aufruf von open())
Danke!!! Genau nach sowas habe ich gesucht!

Und dafür dass du mich auf cppreference.com hingewiesen hast. Kannte bisher "nur" cplusplus.com, wo aber auch alles drinsteht, was ich gesucht habe. War nur zu blöd das zu finden. So ist es halt, wenn ich nach was suche, dessen Name ich noch nicht weiß. Werd euch vielleicht noch öfters nerven...

LG heizoeli

Re: fstream.open akzeptiert String-Objekt als Argument nicht

Verfasst: Sa Dez 06, 2014 9:45 am
von oenone
Normalerweise übergibt man den Dateinamen doch im Konstruktor, oder?

Re: fstream.open akzeptiert String-Objekt als Argument nicht

Verfasst: Sa Dez 06, 2014 11:41 pm
von heizoeli
Ja stimmt, dann braucht man kein .open() .Habs ich nur aus Verzweiflung damit versucht.
Gehen tut beides, gehupft wie gesprungen. Aber gute Frage, wie ist es "richtig", bzw. wie macht man's heutzutage?

Re: fstream.open akzeptiert String-Objekt als Argument nicht

Verfasst: Di Dez 09, 2014 1:12 pm
von Xin
Die Frage ist doch eher, welches Problem man lösen möchte.

Wenn man einen fstream per Referenz an eine Funktion übergibt, die dann entscheidet, ihn auf eine andere Datei umzulenken, kann open doch recht praktisch sein. ^^
Ansonsten kann man es sich mit dem Konstruktor einfacher machen.