Probleme mit Aufgabe
-
Ich glaube, wir beide haben sehr unterschiedliche Auffassungen von "einfach". Einfach heißt für mich nicht "sehr wenig Code zu schreiben" sondern "übersichtlicher Code, der keine komplexen Konzepte und keine potenziell gefährlichen Low-Level-Details benötigt".
-
Christian_c++ schrieb:
...
Name - maximal 20 Zeichen array of character
Vorname - maximal 20 Zeichen array of character
...nur mal so zur info: Die Lösung sollte mit char gelöst werden laut Aufgabenstellung, daher würde ich in diesem Fall kein string nehmen.
gez. info
-
Konrad Rudolph schrieb:
Ich glaube, wir beide haben sehr unterschiedliche Auffassungen von "einfach". Einfach heißt für mich nicht "sehr wenig Code zu schreiben" sondern "übersichtlicher Code, der keine komplexen Konzepte und keine potenziell gefährlichen Low-Level-Details benötigt".
Ach jetzt plötzlich rausreden. :p

Hat nachfile << strukt;mehr nach "sehr wenig Code zu schreiben" und nicht nach "übersichtlicher Code, der keine komplexen Konzepte und keine potenziell gefährlichen Low-Level-Details benötigt" ausgeschaut.
Und das Operator überladen ist sicher nicht weniger komplex und auch nicht immer ungefährlich. Bei file << ist es noch ziemlich klar was << bedeutet, aber genau weiß man es nie. Außerdem musst du dann aufpassen, dass du keine element vergisst. Wenn C++ Reflection hätte, dann könnte man das schöner machen.
Und die info von info sollte man auch beachten.
-
bedenke schrieb:
Hat nach
file << strukt;mehr nach "sehr wenig Code zu schreiben" und nicht nach "übersichtlicher Code, der keine komplexen Konzepte und keine potenziell gefährlichen Low-Level-Details benötigt" ausgeschaut.
Hm, das war dann ein Missverständnis. Natürlich soll der Anwendungscode so kurz wie möglich sein; daher ist Operatorenüberladung ja gerade so schön (und daher ist die Einführung dieses Konzepts verkraftbar). Die Implementierung hingegen muss nicht kurz sein; sie wird ja nur einmal geschrieben.
-
Hi,
danke das so viele etwas geschrieben haben, ich muss sagen, dass ich bisher nur Programme mit ein paar Schleifen und evt. einer Funktion geschrieben habe. Mit struct hatte ich bisher nioch nichts gemacht, deshalb tue ich mich so schwer.Ist es so richtig einen Datensatz zu erstellen?
# include <iostream> using namespace std; struct Adresse { long integer Postleitzahl; char Stadt[20]; char Straße[20]; }; struct Datensatz { char Name[20]; char Vorname[20]; long integer Martikelnummer; Adresse adresse; bool Geschlecht; int Noten[10]; }; Datensatz a; a.Name="Mueller"; a.Vorname="Hans"; a.Martikelnummer=254781; a.adresse.Postleitzahl=64258; a.adresse.Stadt="Darmstadt"; a.adresse.Straße="Darmstaedter Str"; a.Geschlecht=1; a.Noten=5;
-
Bei char arrays solltest du besser mit strcpy den string "eintragen"
strcpy(a.Name, "Mueller")Das mit = zuweisen geht nur bei std::string richtig, aber die sollst du ja nicht verwenden.
Und wenn Noten ein array ist, dann kannst du da nicht nur eine Zahl zuweisen, sondern mehrerea.Noten[0]=5; a.Noten[1]=1; a.Noten[2]=3;
-
Hi,
danke stimmt. Nur warum soll der name, vorname, stadt, straße ein array sein?
-
a.Name[0] = 'M'; a.Name[1] = 'a'; a.Name[2] = 'x'; a.Name[3] = 0;
-
kann man da nicht einfach nur:
char name;.......
a.name="Max";
schreiben?
-
Hi,
ich habe jetzt mal ein Datensatz erstellt und den Abschnitt zum speichern der Daten als Datei einfach wie vorgegeben reinkopiert. so sieht es jetzt aus:[cpp]# include <iostream>
using namespace std;struct Adresse
{
long int Postleitzahl;
char Stadt[20];
char Straße[20];
};struct dateielement
{
char Name[20];
char Vorname[20];
long int Martikelnummer;
Adresse adresse;
bool Geschlecht;
int Noten[10];
};int main ()
{
char speichername;
int anzahl;
cout<<"Bitte Anzahl eingeben"<<endl;
cin>>anzahl; das muss const int sein, wie bekomm ich das hin?
dateielement datensatz[anzahl];
strcpy(datensatz[0].Name, "Mueller");
strcpy(datensatz[0].Vorname, "Hans");
datensatz[0].Martikelnummer=254781;
datensatz[0].adresse.Postleitzahl=64258;
strcpy(datensatz[0].adresse.Stadt,"Darmstadt");
strcpy(datensatz[0].adresse.Straße,"Darmstaedterstraße");
datensatz[0].Geschlecht=1;
datensatz[0].Noten[0]=5;
datensatz[0].Noten[3]=2;cout << "unter welchem namen speichern ? " << endl;
cin >> speichername;
FILE *stream;
if( (stream = fopen( speichername, "w+b" )) == NULL ) *folgender Fehler:error C2664: 'fopen' : cannot convert parameter 1 from 'char' to 'const char '
{
cout << "The file was not opened" << endl;
return(-1);
}
else
{
cout << "The file was opened" << endl;
fwrite ( &anzahl, sizeof(anzahl), 1, stream);
fwrite ( datensatz, sizeof(datensatz), 1, stream);
if( fclose( stream ) )
cout << "The file was not closed" << endl;
else
cout << "file was closed " << endl;
}return 0;
}[/cpp]Jetzt gibts 2 Probleme, könnt ihr mir da bitte helfen?
-
Hallo
cin>>anzahl; das muss const int sein, wie bekomm ich das hin?
Wenn ein Array keine feste Größe hat, kannst du kein statisiches C-Array nehmen. Entweder reservierst du selber nötoigen Speicher (siehe new), oder du verwendest gleich std::vector. Schau in das Forumeigene Magazin, da gibt es ein Artikel zu den STL-Containern.
if( (stream = fopen( speichername, "w+b" )) == NULL ) folgender Fehler:error C2664: 'fopen' : cannot convert parameter 1 from 'char' to 'const char *'
Die Fehlermeldung ist doch aussagekräftig genug. "Speichername" ist als char definiert. Aber ein einzelnes Zeichen ist wohl kaum ausreichend für einen Dateienamen, also will fopen davon nichts wissen. Du müßtest schon char* verwenden, oder besser gleich std::string und dann auch std::ifstream.
Am besten machst du erstmal ein ordentliches C++ Tutorial, dieser C/C++ Mischmasch ist schlecht.
bis bald
akari
-
Danke jetzt funktioniert es.
Teil 1+2 hab ich ja jetzt in main().
1. Als erstes muss die Anzahl der Personen eingegeben ( 0 < Anzahl <=100 ) und einige Datensätze erstellt werden.
2. Anschließend werden die Daten als Datei abgespeichert.Als nächstes soll folgendes gemacht werden:
3. Danach sollen in einem seperaten Programm alle Daten eingelesen werden.
4. In diesem Programm werden nun alle Datensätze nach den angegebenen Bedingungen sortiert.und ausgegeben.
Bei der Ausgabe sollen zuerst die Matrikelnummer, anschließend der Nachname, der Wohnort sowie die Anzahl der bestandenen Fächer ausgegeben werden.
Ausgabebeispiel:
456321 Schmidt Darmstadt 5 bestandene Leistungsnachweise
456478 Mueller Darmstadt 3 bestandene Leistungsnachweise
573452 Streber Darmstadt 10 bestandene Leistungsnachweise
598765 Looser Darmstadt 1 bestandener Leistungsnachweiswie soll denn jetzt das neue Programm aussehen? wie kann ich es einführen?
Gruß Christian
-
Ich habe jetzt das Einlesen erst mal in main geschrieben.
Er zeigt mir in Zeile 66 einen Fehler an und in Zeile 50 nicht, könnt ihr mir bitte sagen warum und wie ich den Fehler beheben kann.# include <iostream> using namespace std; struct Adresse { long int Postleitzahl; char Stadt[20]; char Straße[20]; }; struct dateielement { char Name[20]; char Vorname[20]; long int Martikelnummer; Adresse adresse; bool Geschlecht; int Noten[10]; }; int main () { char* speichername= "datensatz1"; const int anzahl=100; dateielement datensatz[anzahl]; strcpy(datensatz[0].Name, "Mueller"); strcpy(datensatz[0].Vorname, "Hans"); datensatz[0].Martikelnummer=254781; datensatz[0].adresse.Postleitzahl=64258; strcpy(datensatz[0].adresse.Stadt,"Darmstadt"); strcpy(datensatz[0].adresse.Straße,"Darmstaedterstraße"); datensatz[0].Geschlecht=1; datensatz[0].Noten[0]=5; datensatz[0].Noten[3]=2; FILE *stream; if( (stream = fopen( speichername, "w+b" )) == NULL ) { cout << "The file was not opened" << endl; return(-1); } else { cout << "The file was opened" << endl; fwrite ( &anzahl, sizeof(anzahl), 1, stream); fwrite ( datensatz, sizeof(datensatz), 1, stream); if( fclose( stream ) ) cout << "The file was not closed" << endl; else cout << "file was closed " << endl; } if( (stream = fopen( speichername, "rb" )) == NULL ) { cout << "The file was not opened" << endl; return(-1); } else { cout << "The file was opened" << endl; fread (&anzahl, sizeof(anzahl), 1, stream); [b]error C2664: 'fread' : cannot convert parameter 1 from 'const int *__w64 ' to 'void *'[/b] cout << " Anzahl "<< anzahl << endl; fread ( datensatz, sizeof(datensatz), 1, stream); } return 0; }
-
Du hast 'anzahl' als "const int" deklariert, also bist du nicht berechtigt, diesen Wert zu ändern (und der fread()-Aufruf will den Wert ändern und wird deshalb vom Compiler mit Recht als Fehler eingestuft).
-
Vielleicht solltest du dir mal 2 Tage Zeit nehmen und ein C++-Tutorial durcharbeiten...
-
Hi,
ich habe mir jetzt noch mal einiges durchgelesen, was für das Programm interessant sein könnte und es fertig geschrieben.
Hab 2 Programme geschrieben.
-1. für die Eingabbe und zum speichern als Datei
-2. einlesen und sortierenHab nur das Problem, dass beim 2ten Programm die Datei, die ich im ersten erstellt habe nicht gefunden wird.
Stück aus dem 1.Programm:
cout << "unter welchem Namen speichern? "<<endl; cin >> Speicher; if ( (stream = fopen(Speicher, "wb")) == NULL) { cout << "Datei konnte nicht geöffnet werden " << endl; return -1; } else { cout<<"Die Datei konnte geöffnet werden"<<endl;; fwrite(&Anzahl, sizeof(Anzahl), 1, stream); fwrite(daten, sizeof(datensatz), Anzahl, stream);2.Programm:
if ( (stream = fopen(Speicher, "rb")) == NULL) { cout << "Datei konnte nicht geöffnet / gefunden werden " << endl; return -1; } else { fread(&Anzahl, sizeof(Anzahl), 1, stream); fread(daten, sizeof(datensatz), Anzahl, stream);wenn ich jetzt z.b die Daten vom ersten Programm unter data speichere, kann es das zweite bei Eingabe von data nicht öffnen.
Hoffe ihr könnt helfen
Gruß Christian
-
Badestrand schrieb:
Vielleicht solltest du dir mal 2 Tage Zeit nehmen und ein C++-Tutorial durcharbeiten...
Btw: Du mischt grad C und C++ durcheinander. Statt fread und fwrite nimm lieber Filestreams und die << und >> Operatoren..
-
Hallo
THX 1138 schrieb:
Badestrand schrieb:
Vielleicht solltest du dir mal 2 Tage Zeit nehmen und ein C++-Tutorial durcharbeiten...
Btw: Du mischt grad C und C++ durcheinander. Statt fread und fwrite nimm lieber Filestreams und die << und >> Operatoren..
Bei dem Punkt waren wir schon einmal ganz am Anfang.
chrische
-
Sry hab nicht alles gelesen
-
Hallo
Das war ja auch kein Vorwurf, sondern nur ein Bemerkung.
chrische