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 data auf den Zeitpunkt zu verschieben, an dem du die Datei öffnest. Das close am 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!


Anmelden zum Antworten