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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
heizoeli
Beiträge: 3
Registriert: Fr Dez 05, 2014 11:15 pm

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

Beitrag von heizoeli » Sa Dez 06, 2014 12:26 am

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;
    }

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » Sa Dez 06, 2014 4:36 am

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())

heizoeli
Beiträge: 3
Registriert: Fr Dez 05, 2014 11:15 pm

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

Beitrag von heizoeli » Sa Dez 06, 2014 9:14 am

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

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

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

Beitrag von oenone » Sa Dez 06, 2014 9:45 am

Normalerweise übergibt man den Dateinamen doch im Konstruktor, oder?

heizoeli
Beiträge: 3
Registriert: Fr Dez 05, 2014 11:15 pm

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

Beitrag von heizoeli » Sa Dez 06, 2014 11:41 pm

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?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

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

Beitrag von Xin » Di Dez 09, 2014 1:12 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten