Probleme mit Aufgabe
-
Hallo
Ich empfehle dir statt mit char-arrays zu arbeiten dich für std::strign zu entscheiden und zweitens solltest du nun mal anfangen den ersten Punkt der Aufgabenstellung zu bearbeiten. Drittens solltest du dich entscheiden, ob du c oder c++ programmieren willst. Was du da machst, ist ein Mix aus beiden und in der Regel ist das nicht unbedingt sinnvoll.
chrische
-
chrische5 schrieb:
Ich empfehle dir statt mit char-arrays zu arbeiten dich für std::strign zu entscheiden
chrischeDas macht das speichern aber aufwendiger.
-
Hallo
bedenke schrieb:
chrische5 schrieb:
Ich empfehle dir statt mit char-arrays zu arbeiten dich für std::strign zu entscheiden
chrischeDas macht das speichern aber aufwendiger.
Verstehe ich nicht und sehe ich dementsprechend nicht so.
chrische
-
chrische5 schrieb:
Hallo
Ich empfehle dir statt mit char-arrays zu arbeiten dich für std::strign zu entscheiden und zweitens solltest du nun mal anfangen den ersten Punkt der Aufgabenstellung zu bearbeiten. Drittens solltest du dich entscheiden, ob du c oder c++ programmieren willst. Was du da machst, ist ein Mix aus beiden und in der Regel ist das nicht unbedingt sinnvoll.
chrische
Ich empfehle dir dem OP nicht Hinweise auf eine falsche Loesung seiner Aufgabe zu geben.
-
chrische5 schrieb:
Verstehe ich nicht und sehe ich dementsprechend nicht so.
chrischestruktur mit char[] speichern
Pseudocode:
write(strukt, sizeof(strukt))und wie machst du es mit nem std::string?
-
bedenke schrieb:
chrische5 schrieb:
Verstehe ich nicht und sehe ich dementsprechend nicht so.
chrischestruktur mit char[] speichern
Pseudocode:
write(strukt, sizeof(strukt))
und wie machst du es mit nem std::string?file << strukt;
-
Konrad Rudolph schrieb:
file << strukt;Konnte ich jetzt nicht glauben und hat auch zu dem geführt, was ich dachte.
#include <string> #include <fstream> struct A { int i; std::string text; } strukt; int main() { std::fstream file("C:\\test123.txt", std::ios::out); strukt.i = 10; strukt.text = "hallo 123"; file << strukt; }error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'A' akzeptiert (oder keine geeignete Konvertierung möglich)
-
Ja, Du solltest den Operator vielleicht noch geeignet überladen.
-
Konrad Rudolph schrieb:
Ja, Du solltest den Operator vielleicht noch geeignet überladen.
bedenke schrieb:
chrische5 schrieb:
Ich empfehle dir statt mit char-arrays zu arbeiten dich für std::strign zu entscheiden
chrischeDas macht das speichern aber aufwendiger.
Oder wie machst du das so einfach wie write(strukt, sizeof(strukt)) ?
-
Man könnte ihn auch einfach so speichern:
struct foo { int i; string str; }; foo f; f.i = 12; f.str = "Hallo Welt"; ofstream file( "foo" ); file.write( (const char*)&f.i, sizeof( int ) ); file.write( (const char*)&f.str.size(), sizeof( string::size_type ) ); file.write( (const char*)f.str.data(), f.str.size() ); //einlesen ifstream file( "foo" ); file.read( (char*)&f.i, sizeof( int ) ); string::size_type tmpSize; file.read( (char*)&tmpSize, sizeof( string::size_type ) ); f.str.resize( tmpSize ); file.read( (char*)&f.str[0], tmpSize );Das ist nur ein Beispiel wie man es machen kann und sollte auf keinen Fall 1:1 in ein echtes Programm übernommen werden.
Edit:
Achso, das ganze schreibt man natürlich in Methoden von foo und dann ist es einfach von außen f.write( file ) und f.read( file ).
Edit2:
Mein Beispiel bezieht sich auf das Speichern der Binärdaten, da ich davon ausging, dass es darum ging. Ich persönlich würde eine Serialisierung mit op<< und op>> bevorzugen.
-
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?