Programieren anfangen



  • #include<cstdlib>
    #include<fstream>
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main( ) {
        ifstream quelle;
        string quelldateiname;
        cout << "ZZ (Zeichenzaehler) \n\nQuelldatei? ";
        cin >> quelldateiname;
        quelle.open(quelldateiname.c_str(), ios::binary|ios::in);
    	if (!quelle) {
            cerr << quelldateiname
                 << " kann nicht geöffnet werden!\n";
            exit(-1);
        }
        char ch;
    	bool wort;
    	int long zeichen, worte, zeilen; 
    	int short anzeiger;
        while (quelle.get(ch))
    	{
    		if(ch != '\n') {
    			zeichen++;
    			if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
    				wort = true;
    			else
    			{
    				if(wort)
    					worte++;
    				wort = false;
    			}
    		}
    		else {
    			zeilen++;
    		}
    	}
    	cout << "\n\nBerechnung Beendet!";
    	string dateiausgabe("x");
    	dateiausgabe = quelldateiname + " berechnung.txt";
    	ofstream target(dateiausgabe, ios::binary|ios::out);	
    	target.width(30); "Zeichen:" << zeichen;
    	target.close;
    }
    

    Diese Anwendung habe ich geschrieben bzw. umgeschrieben...

    allerdings kommt der Fehler:

    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(44) : error C2664: 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const char *,std::ios_base::openmode,int)': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]
    1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(45) : error C2296: '<<': Ungültig, da der linke Operand vom Typ 'const char [9]' ist
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(46) : error C3867: "std::basic_ofstream<_Elem,_Traits>::close": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&std::basic_ofstream<_Elem,_Traits>::close", um einen Zeiger auf den Member zu erstellen.
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]

    was bedeutet das? bzw wo ist der Fehler?

    .brot



  • ofstream target(dateiausgabe.c_str(), ios::binary|ios::out);
    

    So müsste es gehen. c_str() liefert einen const char* auf den Stringinhalt zurück.

    Gruß
    Don06



  • habs geändert - neue fehlermeldung:

    1>------ Erstellen gestartet: Projekt: filecopy, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>filecopy.cpp
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(44) : error C2296: '<<': Ungültig, da der linke Operand vom Typ 'const char [9]' ist
    1>c:\dokumente und einstellungen\poschinger\eigene dateien\visual studio 2005\projects\filecopy\filecopy\filecopy.cpp(45) : error C3867: "std::basic_ofstream<_Elem,_Traits>::close": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&std::basic_ofstream<_Elem,_Traits>::close", um einen Zeiger auf den Member zu erstellen.
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Poschinger\Eigene Dateien\Visual Studio 2005\Projects\filecopy\filecopy\Debug\BuildLog.htm" gespeichert.
    1>filecopy - 2 Fehler, 0 Warnung(en)



  • Dann erstmal das:

    target.close;
    

    umändern in das:

    target.close();
    

    Behebt den einen Fehler.

    //edit: Achja,

    und das:

    target.width(30); "Zeichen:" << zeichen;
    

    ist mehr oder weniger Schwachsinn.
    Vielleicht meinst du sowas:

    target.width(30);
    target << "Zeichen:" << zeichen;
    

    //edit2:
    Sehr viele uninitialisierte Variablen. Weist du denen keinen Wert zu ist ihr Startwert undefiniert. Aber das müsste dir dein Kompiler ja auch sagen.

    Gruß
    Don06



  • ok, danke

    jetzt hab ich aber schon wieder mal eine frage mit der ich euch belästigen muss:

    void str_umkehr(string& s) {
    	string target("");
    	size_t i = s.length();
    	cout << "Zeichen: " << i << endl;
    	for(i; i >= 1; i--) {
    		target += s[i];
    	}
    	cout << target << endl;
    }
    

    dies hab ich in einem programm geadded um das wort umzudrehen...

    bitte geben sie ein Wort ein: urang
    Zeichen: 5
    gnar

    doch warum fehlt der erste (also umgedreht letzte) Buchstabe?
    und warum wird am anfang ein leerzeichen eingesetzt?

    .brot



  • Du benutzt den Indexoperator [], um auf die einzelnen Zeichen zuzugreifen. Der indiziert aber nicht von 1 bis n, sondern von 0 bis n-1.

    Der erste Buchstabe ist also nicht s[1], sondern s[0].
    Der letzte Buchstabe ist also nicht s[s.length()], sondern s[s.length()-1].

    Du solltest dir aber wirklich ganz dringend ein gutes Tutorial oder Buch durchlesen! Sonst bringst du dir falsche Dinge bei!
    Dein Code da oben kann ganz leicht deine Anwendung abschießen (Stichwort Access Violation) 😉



  • void str_umkehr(string& s) 
    {
        string target = s;
        reverse (target.begin(), target.end());
        cout << target.c_str() << endl;
    }
    

    🙂



  • vista schrieb:

    void str_umkehr(string& s) 
    {
        string target = s;
        reverse (target.begin(), target.end());
        cout << target.c_str() << endl;
    }
    

    🙂

    cout verträgt auch std::strings, wozu das c_str()?



  • hab ein buch 🙂
    da oben war ich ein bissl zu voreilig

    nur da versteh ichs absolut nicht - ich hab deine lösung zwar ursprünglich in betracht bezogen - doch das verursacht bei mir nur fehlemeldungen...

    void str_umkehr(string& s) {
    	string target("");
    	bool block = true;
    	size_t i = s.length();
    	cout << "Zeichen: " << i << endl;
    	for(i; i >= 0; i--) {
    		if(block) {
    			i--;
    			block = false;
    		}
    		target += s[i];
    	}
    	cout << target << endl;
    }
    

    hatte ich vorher - doch zumindest wenn ich "i >= 0" habe ist die Fehlermeldung
    ".... Expression: string subscript out of range...."

    Die Lösung im Buch selbst habe ich mir auch schon angeschaut, nur dass diese mit nicht viel weiter hilft, da es ein anderer Lösungsweg ist. Ich will ja aus meinen Fehlern lernen 😛 und nicht nur die Sachen ausm Buch abschreiben.

    (mag sein das die Lösung über Reverse auch richtig währe - nur das ich im Moment versuche die Übungsaufgabe mit vorhandenen Mitteln zu lösen :))



  • darthdespotism schrieb:

    cout verträgt auch std::strings, wozu das c_str()?

    flüchtigkeitsfehler 😉



  • vista schrieb:

    void str_umkehr(string& s) 
    {
        string target = s;
        reverse (target.begin(), target.end());
        cout << target.c_str() << endl;
    }
    

    🙂

    void str_umkehr(string s) {
      reverse(s.begin(), s.end());
      cout << s;
    }
    

    :p

    (und wenn schon const-correctness beachten :p)


Anmelden zum Antworten