[gelöst]C++, Datei mit String als Parameter öffnen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

[gelöst]C++, Datei mit String als Parameter öffnen

Beitrag von mampfi » 14.01.2016 20:04:12

Das Ganze spielt sich in einem Objekt ab, dürfte aber wohl keine Rolle spielen.

Ich wollte eine Datei mit einem String als Parameter öffnen.

String ist deklariert in dieser Art.

dateiname = "cpprec.txt";


fstream datei(dateiname, ios::out); //funktioniert nicht

Grund: dateiname muss vom Typ char sein.


Eine Erbschaft von C.


Nun suche ich eine einfache Lösung für die Umwandlung von char[256] nach string.


Muss man im 21. Jahrhundert das selbst schreiben?
Zuletzt geändert von mampfi am 16.01.2016 22:24:55, insgesamt 1-mal geändert.
Es gibt viele Foren

TomL

Re: C++, Datei mit String als Parameter öffnen

Beitrag von TomL » 14.01.2016 20:48:12

mampfi hat geschrieben: String ist deklariert in dieser Art.
dateiname = "cpprec.txt";

Code: Alles auswählen

String x = "cpprec.txt"
s = (const char *) x
Ohne Gewähr... weil das schon wieder sooo lange her ist..... aber ich meine, so war das......

owl102

Re: C++, Datei mit String als Parameter öffnen

Beitrag von owl102 » 14.01.2016 21:31:34

mampfi hat geschrieben:String ist deklariert in dieser Art.

dateiname = "cpprec.txt";
Und was ist der Typ von "dateiname"? Ist das ein char[] oder std::string?
Nun suche ich eine einfache Lösung für die Umwandlung von char[256] nach string.
Du meinst andersherum? Irgendwie ist dein Beitrag nicht konsistent.

Meine Kristallkugel sagt, du suchst http://www.cplusplus.com/reference/string/string/c_str/

P.S.: 256 Zeichen sind für einen Dateinamen zu wenig. Wieso ist die Länge überhaupt limitiert?
Zuletzt geändert von owl102 am 15.01.2016 11:23:00, insgesamt 1-mal geändert.

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: C++, Datei mit String als Parameter öffnen

Beitrag von wanne » 14.01.2016 22:03:32

mampfi hat geschrieben:String ist deklariert in dieser Art.

dateiname = "cpprec.txt";
Das ist keine Dekleration sondern eine Zuweisung. Die Dekleration wäre für deine Frage aber vermutlich deutlcih relevanter.
mampfi hat geschrieben:Nun suche ich eine einfache Lösung für die Umwandlung von char[256] nach string.

Code: Alles auswählen

char* cstring="abc";
string cppstring(cstring);
Verstehe deine Frage aber absolut nicht: "cpprec.txt" ist ein klassischer C-String. (char[]) Genau das was auch fstream frisst. Da braucht es keine weiteren Konversationen.
rot: Moderator wanne spricht, default: User wanne spricht.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: C++, Datei mit String als Parameter öffnen

Beitrag von JTH » 14.01.2016 23:29:31

Wenn dateiname in deinem Beispiel oben ein std::string ist, liefert dir

Code: Alles auswählen

dateiname.c_str()
einen const char * auf das zugrundeliegende Character-Array, siehe http://en.cppreference.com/w/cpp/string ... ring/c_str. (Die Seite bezieht sich auf std::basic_string, aber ein std::string ist nur ein Typedef für std::basic_string<char>.)

Andererseits – der Konstruktor von std::fstream nimmt auf std::strings als Argument: http://en.cppreference.com/w/cpp/io/bas ... ic_fstream, dein Problem liegt wohl an anderer Stelle.
Manchmal bekannt als Just (another) Terminal Hacker.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++, Datei mit String als Parameter öffnen

Beitrag von mampfi » 15.01.2016 12:53:00

Also, ich bin in einer Klasse auf das Problem gestoßen.

Und habs hiermit nochmal ausprobiert (includes sind weggelassen).

using namespace std;



void datei_lesen()

{
char dateiname_char[256];
string dateiname_string;

string zeile;


dateiname_string = "datei.txt";
strcpy(dateiname_char, "datei.txt");

cout << "----------- Hier ist datei_lesen()" << endl << endl;

//ifstream textDatei(dateiname_char);
ifstream textDatei(dateiname_string); //Das hier geht nicht

while(textDatei)
{
getline(textDatei, zeile);

cout << zeile << endl;
}
}

/****/

int main()

{
datei_lesen(); cout << "----------------------------------------------------------------------------------" << endl;
}




int main()

{
datei_lesen(); cout << "----------------------------------------------------------------------------------" << endl;
}
Zuletzt geändert von mampfi am 15.01.2016 13:02:36, insgesamt 2-mal geändert.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++, Datei mit String als Parameter öffnen

Beitrag von mampfi » 15.01.2016 12:57:19

Fehlermeldung und Folgemeldungen bei String:

cpp_zeilen_lesen.cpp: In function ‘void datei_lesen()’:
cpp_zeilen_lesen.cpp:32:40: error: no matching function for call to ‘std::basic_ifstream<char>::basic_ifstream(std::string&)’
ifstream textDatei(dateiname_string); //Das hier geht nicht
^
cpp_zeilen_lesen.cpp:32:40: note: candidates are:
In file included from cpp_zeilen_lesen.cpp:4:0:
/usr/include/c++/4.9/fstream:470:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)
^
/usr/include/c++/4.9/fstream:470:7: note: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’
/usr/include/c++/4.9/fstream:456:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char; _Traits = std::char_traits<char>]
basic_ifstream() : __istream_type(), _M_filebuf()
^
/usr/include/c++/4.9/fstream:456:7: note: candidate expects 0 arguments, 1 provided
/usr/include/c++/4.9/fstream:430:11: note: std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)
class basic_ifstream : public basic_istream<_CharT, _Traits>
^
/usr/include/c++/4.9/fstream:430:11: note: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const std::basic_ifstream<char>&’
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++, Datei mit String als Parameter öffnen

Beitrag von mampfi » 15.01.2016 13:07:38

@TomL:

Hat er auch wieder was zu murren, der g++, setze ich Deinen Vorschlag mit meinen Variablen um:



invalid cast from type ‘std::string {aka std::basic_string<char>}’ to type ‘const char*’
dateiname_char = (const char *) dateiname_string
Es gibt viele Foren

owl102

Re: C++, Datei mit String als Parameter öffnen

Beitrag von owl102 » 15.01.2016 13:20:29

Die Lösung steht doch in viewtopic.php?p=1074330#p1074330 und viewtopic.php?p=1074341#p1074341 :

Code: Alles auswählen

ifstream textDatei(dateiname_string.c_str());

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: C++, Datei mit String als Parameter öffnen

Beitrag von mampfi » 16.01.2016 22:16:10

Danke, das funktioniert, gleich mal das Testprogramm komplett (einige includes wohl überflüssig):

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

#include "stdio.h"
#include "string.h"



using namespace std;



void datei_lesen()

{
char dateiname_char[256];
string dateiname_string;

string zeile;


dateiname_string = "datei.txt";
strcpy(dateiname_char, "datei.txt");

cout << "----------- Hier ist datei_lesen()" << endl << endl;


//ifstream textDatei(dateiname_char);
//ifstream textDatei(dateiname_string); //Das hier geht nicht

ifstream textDatei(dateiname_string.c_str()); //debian-forum owl102

while(textDatei)
{
getline(textDatei, zeile);

cout << zeile << endl;
}

}



int main()

{
datei_lesen(); cout << "----------------------------------------------------------------------------------" << endl;
}
Es gibt viele Foren

Antworten