C++ Datei schreiben - Fehler?

KingLM97

Lieutenant
Registriert
Mai 2012
Beiträge
918
Hallo,

ich arbeite zurzeit an einem kleinen Programm, welches Dateien erstellt und in diese schreibt.
Ich bekomme aber immer diese Fehlermeldung:
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(19) : error C2100: illegal indirection
und
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(19) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'const char' (or there is no acceptable conversion)

Er meint, der Fehler sei bei:
Code:
cin >> *dateiName;

Der Ganze Code:
Code:
// Irgendwas.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
	extern const char dateiName;
	extern const char TextInDerDatei;

	fstream datei;

	cout << "Bitte geben sie zuerst einen Dateinamen ein: " << endl;
	cin >> *dateiName;
	datei.open(dateiName, ios::out);
	
	cout << "Bitte geben sie den Inhalt des Textes ein: " << endl;
	cin >> TextInDerDatei;
	datei << TextInDerDatei << endl;
	datei.close();


}

Hoffe mal ihr könnt mir helfen.
 
cin>>dateiname;

Du musst für cin schon einen Pointer angeben wo reingeschrieben werden kann. In Zeile 23 hast du es ja korrekt.
 
Auch die Variable "TextInDerDatei" sollte ein Pointer sein.
Ausserdem wird das schreiben in die Variablen nicht funktionieren, weil sie als "const" deklariert sind.

Probier es mal mit:

#include <string>
string dateiName;
string TextInDerDatei;
 
Zuletzt bearbeitet von einem Moderator:
nimm mal statt den chars einen string (stringname z.B.) und getline zum einlesen.

und dann sowas wie getline(cin, stringname)


schau dir das nochmal an zum einlesen von zeichen.
 
Ok, ich habe jetzt dateiName und TextInDerDatei zu einem String gemacht:
Code:
string dateiName;
	string TextInDerDatei;
Das ist jetzt der geänderte Code:
Code:
// Irgendwas.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	string dateiName;
	string TextInDerDatei;

	fstream datei;

	cout << "Bitte geben sie zuerst einen Dateinamen ein: " << endl;
	cin >> dateiName;
	datei.open(dateiName, ios::out);

	cout << "Bitte geben sie den Inhalt des Textes ein: " << endl;
	cin >> TextInDerDatei;
	datei << TextInDerDatei << endl;
	datei.close();
}

Als Fehler kommt nun folgendes:
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(21) : error C2664: 'void std::basic_fstream<_Elem,_Traits>::open(const wchar_t *,std::ios_base::openmode,int)' : cannot convert parameter 1 from 'std::string' to 'const wchar_t *'
Undzwar wird er hier angezeigt:
Code:
datei.open(dateiName, ios::out);
Ich bin jetzt nicht der Mega-Pro in C++, aber mit der Fehlermeldung kann ich nix anfangen.
 
So, aus string nun wstring gemacht.
Code:
wstring dateiName;
	wstring TextInDerDatei;

Komlett:
Code:
// Irgendwas.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main()
{
	wstring dateiName;
	wstring TextInDerDatei;

	fstream datei;

	cout << "Bitte geben sie zuerst einen Dateinamen ein: " << endl;
	cin >> dateiName; //Da soll der Fehler sein!!!
	datei.open(dateiName, ios::out);

	cout << "Bitte geben sie den Inhalt des Textes ein: " << endl;
	cin >> TextInDerDatei;
	datei << TextInDerDatei << endl;
	datei.close();
}

Fehlermeldung:
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(21) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'std::wstring' (or there is no acceptable conversion)
 
Für die Unicode Version müsstest du dann auch "wcin" benutzen und
in die datei schreiben mit "datei << TextInDerDatei.c_str() << endl;"

Oder du stellst das Projekt von Unicode zurück auf Multibyte um die klassischen cin/cout Befehle nehmen zu können.
 
OK, ich habe noch nie was von wcin gehört. Wie muss ich das machen? Und wie stelle ich das Projekt auf Multybyte zurück? Das mit dem c_str() habe ich jetzt so gemacht:
cin >> dateiName.c_str();
und
cin >> TextInDerDatei.c_str();
mit folgendem Error:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(21) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'const wchar_t *' (or there is no acceptable conversion)
Undzwar hier:
cin >> dateiName.c_str();
 
du musst nur beim schreiben in die Datei das .c_str() verwenden, also bei
"datei << TextInDerDatei.c_str() << endl;" Dies ist allerdings nicht mehr erforderlich wenn du wieder auf Multibyte umschaltest(in dem Falle sollte dein Beispiel von 10:41 Uhr direkt funktionieren)

Da du offensichtlich MS Visual C++ verwendest schaltet man zurück auf Multibyte indem man z.B. in der Menüleiste auf "Project->Properties" klickt oder rechtsklick auf das Projekt im "Solution Explorer" und dort auf "Properties" klicken.
Im erscheinenden Dialog in der Rübrick "Configuration Propties/General" muss bei "Character Set" umgestellt werden auf "Use Multi-Byte Character Set".
 
Zuletzt bearbeitet von einem Moderator:
OK, habe ich nun gemacht.
Wieder mal Fehler....
Code:
cin >> TextInDerDatei.c_str();

Komplett:
Code:
// Irgendwas.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main()
{
	wstring dateiName;
	wstring TextInDerDatei;

	fstream datei;

	cout << "Bitte geben sie zuerst einen Dateinamen ein: " << endl;
	cin >> dateiName; //Da ist der Fehler....
	datei.open(dateiName, ios::out);

	cout << "Bitte geben sie den Inhalt des Textes ein: " << endl;
	cin >> TextInDerDatei.c_str();
	datei << TextInDerDatei << endl;
	datei.close();
}

Error:
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(21) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'std::wstring' (or there is no acceptable conversion)
 
Scheinbar hat das umstellen geklappt. Du musst natürlich nun auch aus den Unicode wstring's wieder einen normalen "string" machen und das .c_str() kann man dann weg lassen(genau wie in deinem Post von 10:41 Uhr)
 
So, alles gemacht wie du es gesagt hast, ich bekomm bald nen Schlaganfall....

Code Komplett:
Code:
// Irgendwas.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main()
{
	string dateiName;
	string TextInDerDatei;

	fstream datei;

	cout << "Bitte geben sie zuerst einen Dateinamen ein: " << endl;
	cin >> dateiName;
	datei.open(dateiName, ios::out); // Hier ist der Fehler.... komm raus PuttPuttPutt

	cout << "Bitte geben sie den Inhalt des Textes ein: " << endl;
	cin >> TextInDerDatei;
	datei << TextInDerDatei << endl;
	datei.close();
}

Fehler:
Code:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(22) : error C2664: 'void std::basic_fstream<_Elem,_Traits>::open(const wchar_t *,std::ios_base::openmode,int)' : cannot convert parameter 1 from 'std::string' to 'const wchar_t *'
 
Offensichtlich kompiliert dein Projekt immernoch nach Unicode (wide char), hast du dein Projekt wirklich auf Multibyte umgeschaltet?(Dies sollte man natürlich nicht nur für die Debug, sondern auch Release Version machen)
 
Ja habe ich. Bei Character Set steht: Use Multi-Byte Character Set.
Wie man das beim Debug macht, keine Ahnung.
Vllt hilft es ja weiter?!:
Microsoft Visual Studio 2008 - Englische Version
 
Im Properties-Dialog hast du links oben eine Auswahl-Box("Configuration").
Dort schaltet man z.B. zwischen Debug & Release hin und her. Die Einstungen müssten bei allen gemacht werden.
 
Habe ich nun gemacht. Der zeigt mir trotzdem hier den Fehler an:
datei.open(dateiName, ios::out);

Folgende Fehlermeldung:
c:\dokumente und einstellungen\administrator.ip-015-104\eigene dateien\visual studio 2008\projects\irgendwas\irgendwas\irgendwas.cpp(22) : error C2664: 'void std::basic_fstream<_Elem,_Traits>::open(const wchar_t *,std::ios_base::openmode,int)' : cannot convert parameter 1 from 'std::string' to 'const wchar_t *'
 
Probier es mal mit:
datei.open(dateiName.c_str(), ios:ut);
Scheinbar geht das direkte string übergeben an Open erst mit VS2010,denn bei mir kompiliert dein Code ohne Probleme.
 
Boah, danke, endlich, es funktioniert. VIELEN DANK.
Auch wenns fast 1 Stunde gedauert... :D.

P.S.
DANKE!

P.P.S:
Wenn ich jetzt den Text eingebe, also das was in der Datei stehen soll, hört der Nach einen Punkt oder Komma auf. Gibts dafür ne Lösung?
 
Zuletzt bearbeitet:
Das liegt wahrscheinlich daran, dass du ein Whitespace eingibts, also ein Zeichen, bei dem cin die Eingabe abbricht. Dafür müsstest du unformatiert lesen...
Kurz:
Code:
datei<<cin.rdbuf();
Dann bricht das geschreibe in die Datei erst bei einem STRG+D ab.
Oder:
Code:
char ch=0;
while(cin)//Prüfen, ob Eingabestream noch gültig
{
cin>>ch;//Lese Zeichen ein
if(ch=='\n')//Return gedrückt, beende Eingabe
break;
datei<<ch;//Schreibe Zeichen in Datei
}
 
Zurück
Oben