Erste Klasse erkennt Filefunktionen nicht
-
Hallo,
ich habe mir, nachdem ich ja so kreativlos war leider eine Idee "geklaut" was ich machen könnte und habe meine erste Klasse in C++ programmiert.Wie zu erwarten war funktioniert sie nicht.:D
Zur Klasse: Es soll ein FileHandler sein mit dem man Datein schreiben, lesen und löschen kann.Das ist mein Code:
#include <iostream> #include <cstdio> #include <fstream> #include <string> #include <cstdlib> using namespace std; //Klasse definieren class FileHandler { private: //Variablen string DateiName; string path; string Text; char zeichen; public: //Methoden void NewData(); //Neue Datei anlegen void DeleteData(); //Datei löschen void ShowData(); //Dateiinhalt auslesen }; void FileHandler::NewData() { //Methode um neue Dateien erstellen zu können ofstream data; //Instanz der Fileklasse erstellen cout << "Bitte geben Sie den Dateinamen ein, die die Datei haben soll" << endl; cin >> DateiName; cout << "Bitte geben Sie den Pfad zu Datei im Format C:\\Pfad\\" << endl; cin >> path; data.open(path+DateiName.c_str(), ios_base::out); if(!data) { cout << "Die Datei konnte nicht erfolgreich geöffnet werden!" << endl; } cout << "Bitte geben Sie nun den Text ein!" << endl; cin >> Text; data << Text << endl; data.close(); //Datei schliessen } void FileHandler::DeleteData() { //Methode um Datei zu löschen cout << "Bitte geben Sie den Dateinamen ein (Bitte beachten Sie, dass die Datei gelöscht wird und somit nicht wieder zuverwenden ist!)" << endl; cin >> DateiName; cout << "Bitte geben Sie den Pfad zur Datei im Format C:\\Pfad\\ an" << endl; cin >> path; remove(path+DateiName.c_str()); cout << "Die Datei konnte erfolgreich gelöscht werden!" << endl; } void FileHandler::ShowData() { cout << "Bitte geben Sie den Dateinamen ein" << endl; cin >> DateiName; cout << "Bitte geben Sie den Pfad zur Datei im Format C:\\Pfad\\ an" << endl; cin >> path; ifstream data2; //Instanz der Fileklasse erstellen data2.open(path+DateiName.c_str(), ios_base::in); if(!data2) { cout << "Die Datei konnte nicht erfolgreich geöffnet werden!" << endl; } while(!data2.eof()) { data2.get(zeichen); cout << zeichen; } data2.close(); //Datei schließen } //Mainfunktion mit Menü int main() { FileHandler FIHA; //Innstanz von der Klasse FileHandler erstellen int auswahl; //Userwahl while(auswahl != 0) { cout << "Bitte wählen Sie aus folgenden Funktionen aus:" << endl; cout << "Neue Textdatei mit Inhalt erstellen (1)" << endl; cout << "Datei löschen (2)" << endl; cout << "Datei auslesen (3)" << endl; cout << "Programm beenden (4)" << endl; //Menüverarbeitung switch(auswahl) { case 1: FIHA.NewData(); break; case 2: FIHA.DeleteData(); break; case 3: FIHA.ShowData(); break; case 4: return 0; break; default: cout << "Ihre Eingabe war falsch!\a" << endl; return 0; break; } } }Und das sagt mir mein Compiler:
manu@manu-desktop:~$ g++ filehandler.cpp -o filehandler
filehandler.cpp:130:7: warning: no newline at end of file
filehandler.cpp: In member function »void FileHandler::NewData()«:
filehandler.cpp:35: Fehler: keine passende Funktion für Aufruf von »std::basic_ofstream<char, std::char_traits<char> >::open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::_Ios_Openmode&)«
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/fstream:626: Anmerkung: Kandidaten sind: void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
filehandler.cpp: In member function »void FileHandler::DeleteData()«:
filehandler.cpp:57: Fehler: keine passende Funktion für Aufruf von »remove(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)«
/usr/include/stdio.h:152: Anmerkung: Kandidaten sind: int remove(const char*)
filehandler.cpp: In member function »void FileHandler::ShowData()«:
filehandler.cpp:71: Fehler: keine passende Funktion für Aufruf von »std::basic_ifstream<char, std::char_traits<char> >::open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::_Ios_Openmode&)«
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/fstream:495: Anmerkung: Kandidaten sind: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]Leider verstehe ich nicht, was ich falsch gemacht habe, da ich noch nicht so der Profi bin.
Ich hoffe ihr könnt mir ein paar Tips geben!
Vielen Dank schonmal!Gruß
-
data.open(path+DateiName.c_str(), ios_base::out);open erwartet einen C-String als Parameter. Daher musst du die Methode c_str für den resultierenden String aufrufen!
(path+DateiName).c_str()btw. wäre es eher zu empfehlen das Anlegen der Variable
dataauf den Zeitpunkt zu verschieben, an dem du die Datei öffnest. Dascloseam Ende ist übrigens nicht notwendig, da dies implizit im Destruktor passiert.ofstream open( (path + DateiName).c_str() );entsprechend auch beim einlesen.
btw. solltest du imho entweder englische oder deutsche Bezeichner wählen, aber kein Mischmasch!
filehandler.cpp:130:7: warning: no newline at end of file
Das sollte verständlich sein.
-
1. Der Benutzer braucht in der Konsole nicht den \ escapen, das muss man nur im Quellcode machen. Bei der Eingabe in der Konsole reicht z.B. C:\Temp\
data.open(path+DateiName.c_str(), ios_base::out);Entweder liest Du den kompletten Pfad + Dateinamen auf einmal in einen string oder Du kombinierst beide in einem zusätzlichen string und übergibst den als Parameter
string complete_path(path + DateiName); data.open(complete_path.c_str());ebenso bei remove.
-
Ok, vielen Dank!
-
Ich bins nochmal. Also es funktioniert alles wunderbar, allerdings habe ich noch eine Frage: Wie kann ich mit cin einen mehrzeiligen Text einlesen? Ich will ja auch Dateien schreiben können, die mehr als nur eine Zeile beinhalten.
-
In etwa so:
cout << "Text eingeben (# um abzubrechen):\n"; do { cin >> text; if (text == "#") break; data << text; } while (true);
-
Das funktioniert auch!:)
Vielen Dank!