Fragen zu Programmen
-
Hoffe ich bin hier richtig im Forum und kann vielleicht mal Fragen zu Programmen hier stellen. Ich versuche mich in C++ einzuarbeiten und habe ein paar Startprobleme bei Klassen. Was stimmt denn bitte bei diesem Programm noch nicht?
// klassen name
#include <iostream>
#include <string>
using namespace std;class name
{
public://Die Eigenschaften des Namens
string vname;
string nname;//Die Verhaltensweisen des Namens
void zusammen (name)
{
vname += nname;}
};int main()
{
name name1,name2;cout << "Bitte geben Sie den Vornamen ein: " << endl;
cin >> name1.vname;
cout << "Bitte geben Sie den Nachnamen ein: "<< endl;
cin >> name2.nname;string name1.zusammen(name2);
cout << "Der Name heisst " << name << endl;
getchar();
fflush(stdin);
return 0;
}
-
Wie wärs mit
#include <iostream> #include <string> using namespace std; class name { public: //Die Eigenschaften des Namens string vname; string nname; //Die Verhaltensweisen des Namens void zusammen ([b]void[/b]) { vname += nname; } }; int main() { name name1; cout << "Bitte geben Sie den Vornamen ein: " << endl; cin >> name1.vname; cout << "Bitte geben Sie den Nachnamen ein: "<< endl; cin >> name[b]1[/b].nname; string name1.zusammen(); cout << "Der Name heisst " << name[b]1.vname[/b] << endl; getchar(); fflush(stdin); return 0; }
falls das das Problem war...
Ansonten solltest du mal sagen was an der Klasse nicht funktioniert, bzw. was du damit bezwecken möchtest.Ggf. auch die Fehlermeldung des Compilers.
MfG Bongolus
-
string name1.zusammen(); <-- string weg
-
Ich will einfach einen Vorname und Nachnamen eingeben und zum schluss beide zusammen ausgegeben haben. Dummerweisse schließt sich das Programm nach der Eingabe der Werte.
-
Anfänger78 schrieb:
Ich will einfach einen Vorname und Nachnamen eingeben und zum schluss beide zusammen ausgegeben haben. Dummerweisse schließt sich das Programm nach der Eingabe der Werte.
Das sollte eigentlich mit meinen Veränderungen deines Quelltextes funktionieren.
MfG Bongolus
-
falls du visualc++ benutzt versuch mal strg + f5
-
Ja leider tuts das net. Und ich weiss einfach net warum. Ich benütze Dev-C ++
-
Hab ich was übersehen, ich kenne den Dev-C++ Compiler garnicht, aber eigentlich dürfte der den Quelltext so nicht kompilieren. Da in der main Funktion der Bezeichner name1 zweimal vergeben wird.
Also:
[cpp]
int main() {
. . .
name1.zusammen(); // das string muß weg
. . .
}[/cpp]Das sollte dann aber laufen.
-
Ich weiss immernoch net, wo mein Problem ist. Hier ist nochmal mein aktueller Quelltext:
// klassen name
#include <iostream>
#include <string>
using namespace std;class name
{
public://Die Eigenschaften des Namens
string vname;
string nname;//Die Verhaltensweisen des Namens
void zusammen (void)
{
vname += nname;
}
};int main()
{
name name1;cout << "Bitte geben Sie den Vornamen ein: ";
cin >> name1.vname;
cout << "Bitte geben Sie den Nachnamen ein: ";
cin >> name1.nname;name1.zusammen();
cout << "Der Name heisst" << name1.vname << endl;
getchar();
fflush(stdin);
return 0;
}Bei mir schließt sich immernoch nach der Eingabe der beiden Namen das MS-DOS fenster. Ich bekomme keine Fehlermeldung im Compiler.
-
Doch, tut es - aber das Programm schließt sich gleich. Grund dafür ist die gepufferte Eingabe bei C/C++. Jedes Zeichen, was du z.B. mit cin liest, kommt erstmal in einen Puffer, erst mit Drücken der Enter-Taste liest das Programm aus diesem Puffer. Das Problem ist, dass auch das ENTER-Zeichen (CR, Carriage Return) in diesen Puffer geschrieben wird und der Pufferzeiger dann akutell auf diesem CR im Pufferspeicher steht. Nun liest getchar() genau dsa Zeichen, auf welchem der Pufferzeiger steht und dies ist in deinem Fall das CR, sodass das Programm sofort beendet. Eine triviale Lösung ist das Einfügen eines Dummy-getchar()'s, d.h. du rufst getchar() einmal auf um den Pufferzeiger eine Position hinter das CR zu setzen, um dann auf die nächste Eingabe eines Zeichens mit dem zweiten getchar() zu warten. So dürfte es dann auch funktionieren:
#include <iostream> #include <string> using namespace std; class name { public: //Die Eigenschaften des Namens string vname; string nname; //Die Verhaltensweisen des Namens void zusammen (void) { vname += " "+nname; } }; int main() { name name1; cout << "Bitte geben Sie den Vornamen ein: "; cin >> name1.vname; cout << "Bitte geben Sie den Nachnamen ein: "; cin >> name1.nname; name1.zusammen(); cout << "Der Name heisst " << name1.vname << endl; fflush(stdin); getchar(); getchar(); return 0; }
-
Vielen dank an alle für die Tips:). Der letzte hat es dann gelöst. Dabei hatte ich selber schon des da unten zichmal gemerkt, was es ausmacht. Aber diesmal bin ich net drauf gekommen. Danke nochmal
-
Dann könnte man noch statt:
fflush(stdin);
das verwenden:
fflush( STDOUT );
das getchar() sollte eigentlich auch keinen richtigen Sinn haben ( weil es nur EOF liefert ).
Kann es sein daß du Windows verwendest? Dann solltest du das Programm mal aus der Konsole/Eingabeaufforderung starten. Es könnte sein, daß die zu schnell beendet wird.
Edit: zu spät
-
Bongolus schrieb:
das getchar() sollte eigentlich auch keinen richtigen Sinn haben ( weil es nur EOF liefert ).
Wie oben schon gesagt: es "überliest" das CR, auf welches der Pufferzeiger gerade zeigt und wartet deswegen nicht auf das nächste eingegebene Zeichen. Deswegen zweites getchar() einfügen und dann klappt's...
Bongolus schrieb:
Kann es sein daß du Windows verwendest? Dann solltest du das Programm mal aus der Konsole/Eingabeaufforderung starten.
Dev-Cpp für Linux hab ich noch nicht gesehen
-
RTC schrieb:
Dev-Cpp für Linux hab ich noch nicht gesehen
Ich habe den für Windows auch noch nicht gesehen...
Aber so ist das halt wenn man von sich auf andere schließt.MfG Bongolus
-
Bongolus schrieb:
Ich habe den für Windows auch noch nicht gesehen...
Gab's den nicht nur für Windows?
Na egal...
-
Hi ich habe folgendes Problem. Ich möchte das nach jeder Eingabe die Nummerierung in der Textfile passt. Und zwar bei dem was geschrieben ist, und bei dem was ich eingebe. Ich hab jetzt hier ne Zeitlang gekrübelt, wie das gehen könnte. Entweder irgendwie über ne while schleife oder eine eigene definierte Funktion. Ich wüsste nur nicht, wie da was schreiben soll. Vielleicht kenne ich einfach da den richtigen Befehl nicht.
Quellcode:
//Datenbanktest
#include <iostream>
#include <fstream>
#include <string>
using namespace std;//Klassendeklarierung
class name
{
public://Die Eigenschaften des Namens ( Vorname und Nachname )
string vname;
string nname;
int plz;//Die Verhaltensweisen des Namens (Addierung zum Gesamtnamen)
void zusammen (void)
{
vname += " "+nname;
}
};int main()
{
ifstream dat_ein;
ofstream dat_aus; // Instanz der Klasse ofstream erzeugen
string dateiname="Datenbank.txt"; // Variablenzuweisung
string utext="\t\t\t\t***D A T E N B A N K***";//Lokale Variablen
char zeichen;
name name[10];
int i=0,x=1; // Arrayzuweisung von 10 Feldern//Einlesen der Datei
dat_ein.open(dateiname.c_str(), ios_base::in); //Öffnen der Dateiausgabe
if(!dat_ein)
{
cout << "Datei konnte nicht geoeffnet werden!";
cout << endl;
return -1;
}while (!dat_ein.eof())
{
dat_ein.get(zeichen);
cout << zeichen;
}dat_ein.close(); //Schließen der Dateiausgabe
dat_aus.open (dateiname.c_str(), ios_base::out |ios_base::app); //Oeffnen der Datei und verbinden mit dem
//Ausgabestream
//Eingabe der Datencout << "Bitte geben Sie den " << x+1 << ".Vornamen ein: ";
cin >> name[i].vname;
cout << "Bitte geben Sie den " << x+1 << ".Nachnamen ein: ";
cin >> name[i].nname;if (!dat_aus)
{
cout << "Datei konnte nicht geoeffnet werden!";
cout << endl;
return -1;
}//Schreiben in die Datei
dat_aus << " " << i+1 <<".\t" <<name[i].vname<< "\t\t " << name[i].nname <<endl;
dat_aus.close(); //Schließen des Streams
fflush(stdin);
getchar();
return 0;
}
-
Hi
die Zeile:
while (!dat_ein.eof()) { dat_ein.get(zeichen); cout << zeichen; }
ist das Problem
if( !dat_ein.eof() ) { cout << x << " : "; ++x; while (!dat_ein.eof()) { dat_ein.get(zeichen); if( zeichen == '\n'; { cout << zeichen; cout << x << " : "; ++x; } else cout << zeichen; } }
Sorry, aber ich habe keine Lust dir das zu erklären, da muß ich zu viel tippen.
Es gibt gute Bücher zu C/C++, gerade als Anfänger ist ein gutes Buch einfach unverzichtbar! Es gibt hier im Forum auch genug Threats mit Buchempfehlungen.
Du kannst dir auch mal unter http://www.cppreference.com/ -> Std. C I/O -> die ganzen f-Funktionen (fopen, fputs fclose usw. ) anschauen, vieleicht reicht dir das ja...MfG Bongolus
-
vielen dank. Problem ist noch bei mir. das er mir in der else zeile ein Problem anzeigt. Aber ich weisst net was es ist.
kann es sein das -if( zeichen == '\n'); - hier das \n nicht gehen kann, weil des ja in c vorkommt und nicht in c+`+?
-
Anfänger78 schrieb:
vielen dank. Problem ist noch bei mir. das er mir in der else zeile ein Problem anzeigt. Aber ich weisst net was es ist.
Deine Fehlerbeschreibungen sind einfach klasse. Du kannst doch die Fehlermeldung deines Compiler posten, vieleicht weiß ich dann was für ein Problem du hast.
Anfänger78 schrieb:
kann es sein das -if( zeichen == '\n'); - hier das \n nicht gehen kann, weil des ja in c vorkommt und nicht in c++?
Das ist unmöglich, da C++ auf C aufbaut, also C++ ist eine Erweiterung von C.
MfG Bongolus