String Spliitern?
-
Hallo ich hoffe ich bin im richtigen Forum :s
Also mein Problem ist folgendes,wir müssen in der Schule ein Programm schreiben in dem wir unter anderem auch abspeichern und laden müssen,
Das habe ich soweit auch hinbekommen nur mein Problem ist, beim Laden kann ich die gespeicherten Daten zwar auf der Konsole wieder geben jedoch nicht mit weiter arbeiten o.ä.
jetzt wurde mir gesagt das ich die strings splittern muss und iwie abspeichern aber damit bin ich überfordert
ich hoffe mir kann jemand helfen
ich bin jetzt nicht wirklich ein Profi das wird man sicher merken
also hier ist der code zu speichern und laden :void speichern(artikel a[], int n) { if (!n) // kurzschreibweise n = 0 { cout << "Es gibt nichts zu speichern." <<endl; return; } ofstream dat; stringstream ss; char buffer[MAX_PATH]; string::size_type pos = string(buffer).find_last_of("\\/"); std::string path = std::string(buffer).substr(0, pos); ss << path << "/ARTIKEL.DAT"; dat.open(ss.str().c_str()); for (size_t i = 0; i < n; ++i) { dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl; } dat.close();//datei schließen cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl; } void laden (artikel a[], int n) { stringstream ss; char buffer[MAX_PATH]; GetModuleFileName(NULL, buffer, MAX_PATH); string::size_type pos = string(buffer).find_last_of("\\/"); std::string path = std::string(buffer).substr(0, pos); ss << path << "/ARTIKEL.DAT"; std::ifstream Eingabedatei (ss.str().c_str()); if (!Eingabedatei) { cout << "\tEs wurden bisher keine Dateien abgespeichert oder, "<< endl; cout << "\t die Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl; } string line; if (Eingabedatei.is_open()) { while (getline(Eingabedatei, line)) { cout << line << '\n'; } Eingabedatei.close(); }
-
Hallo Kalissi,
Willkommen im C++-Forum.
Kalissi schrieb:
Also mein Problem ist folgendes,wir müssen in der Schule ein Programm schreiben in dem wir unter anderem auch abspeichern und laden müssen,
Das habe ich soweit auch hinbekommen nur mein Problem ist, beim Laden kann ich die gespeicherten Daten zwar auf der Konsole wieder geben jedoch nicht mit weiter arbeiten o.ä.
jetzt wurde mir gesagt das ich die strings splittern muss ...Nein - da ist i.A. ein Holzweg. Besser Du liest gleich die Daten, die Du intern im Programm benötigst.
getlineist dem entsprechend die falsche Wahl.Das wichtigste hast Du nicht geschrieben:
- wie sieht der Inhalt der Datei aus?
- wie ist der Typartikeldefiniert?Aus
Kalissi schrieb:
for (size_t i = 0; i < n; ++i) { dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl; }schließe ich, dass
artikelungefähr so definiert ist:struct artikel { int nr; std::string name; // ich hoffe std::string und nicht char* float preis; int anzahl; };Der C++-Weg, um
artikelzu schreiben und zu lesen, besteht darin, sogenannte stream inserter, bzw. extractor fürartikelzu schreiben. Die Prototypen wären:std::ostream& operator<<( std::ostream& out, const artikel& a ); // inserter std::istream& operator>>( std::istream& in, artikel& a ); // extractordann kannst Du Artikel so schreiben:
for (size_t i = 0; i < n; ++i) dat << a[i];und so wieder lesen:
size_t n = 0; for( ; n < N && Eingabedatei >> a[n]; ++n ) // N ist maximale Größe des array ; if( Eingabedatei.eof() ) cout << "Ok - bis End-Of-File gelesen\n"; cout << n << " Artikel gelesen" << endl;Eine sehr einfache Implementierung könnte so aussehen:
std::ostream& operator<<( std::ostream& out, const artikel& a ) { return out << a.nr << ";"<< a.name << ";" << a.preis << ";" << a.anzahl << std::endl; } std::istream& operator>>( std::istream& in, artikel& a ) { char semikolon; in >> a.nr >> semikolon; getline( in, a.name, ';' ); return in >> a.preis >> semikolon >> a.anzahl; }Gruß
Werner
-
Hay also erstmal danke für ihre ausführliche antwort :o
und danke das sie sich die zeit genommen haben
Tut mir leid das ich einige sachen Vergessen hab anzugeben nur ich war unsicher was wirklich wichitg ist ..
ich Denke ich verstehe was sie meinen , nur leider bin ich einfach zu dumm es umzusetzen oder mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt

-
Kalissi schrieb:
.. mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt

Dann zeig mal deinen gesamten Code und die dazugehörigen Fehlermeldungen (Copy/Paste). So kann dir hier am schnellsten geholfen werden.
-
Kalissi schrieb:
Hay also erstmal danke für ihre ausführliche antwort :o
und danke das sie sich die zeit genommen haben
Tut mir leid das ich einige sachen Vergessen hab anzugeben nur ich war unsicher was wirklich wichitg ist ..
ich Denke ich verstehe was sie meinen , nur leider bin ich einfach zu dumm es umzusetzen oder mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt

Ich glaube, auch wenn hier manche etwas älter als du(und auch älter als manch anderer;)) sind, sind wir hier doch eine Forengemeinschaft und ein Du ist auch Werner gegenüber Ok.
... woebi.. ein Respekt-Sie wäre auch nicht schlecht

Zu deinem Problem:
Was Werner meint, ist, dass es schöner wäre, wenn sich deine Artikel-Objekte selbst darum kümmern, wie sie ausgegeben bzw eingelesen werden. D.h. deine beiden Funktionen speichern und laden würden in die Verantwortung der Klasse Artikel gegeben, so dass du dann später sowas hier schreiben kannst:std::istream & istr = std::cin; // oder ein anderer Stream, z.B. auf eine Datei std::ostream & ostr = std::cout; // oder ein anderer OutputStream, z.B. in eine Datei Artikel a(/*....*/); ostr << a << std::endl; // speichert den Artikel a ab Atrikel b; istr >> b; // liest die Daten für Artikel b aus dem Stream
-
Also hier ist der komplette Quelltext wie gesagt das ist ziemlich Amateur haft nur bin halt nicht so gut

ehm und wegen dem sie .. ich du'ze nciht gerne einfach jemanden sondern erst wenn es einem angeboten wird :s
ich hoffe mit dem kompletten kann mir jemand sagen wie ich was machen muss damit das Programm so funktioniert wie es soll weil eure erklärungen sind eingentlich eindeutig nur sobald ich auf mein Programm dann schaue weiß ich nciht wie ihr das meint
main hab ich weg gelassen weil da nur die Voids ausgeführt werden und da wirklich ncihts besonderes gemacht wird :o[code="cpp"]
#include <string>
#include <iostream>
#include <limits>
#include <fstream>
#include <windows.h>
#include <sstream>
using namespace std;struct artikel
{
int nr; // Artikelnummer
string name; // Artikelbezeichnung
float preis; // Artikelpreis
int anzahl; // Artikelanzahl
};artikel* create()
{
int artikelnummer, anzahl;
float preis;
string name;while (1) //(1) bedeutet endlosschleife wenn nötig
{
cout << "Artikelnummer: ";
cin >> artikelnummer;
if (cin.fail())
{
cin.clear();löschen
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "(!) Fehler: Nur ganzzahlige Artikelnummernerlaubt." <<endl;
continue;
}
break; // aus while schleife austreten wenn user gülltige eingabe gemacht hat
}cin.clear(); //eingabe nciht beachten
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Artikelbezeichnung: ";
getline(cin, name);while (1)
{
cout << "Preis: ";
cin >> preis;//eingabe Preis
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "(!) Fehler: Nur Dezimalbrueche (ggf. mit Dezimalpunkt) erlaubt." << std::endl;
continue
}
break;
}while (1)
{
cout << "Anzahl: ";
cin >> anzahl;
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "(!) Fehler: Nur ganzzahlige Anzahlen erlaubt." << endl;
continue;
}
break;
}artikel *a = new artikel();
a->nr = artikelnummer;
a->name = name;
a->preis = preis;
a->anzahl = anzahl;
return a; //
}int eingeben(artikel a[], int n)
{
if (n < 100) //n max. 99
{ // anzeige wie viele datensätze bisher in der Datenbank sind
a[n] = *create(); // forderung eines artikel arrays
cout << "====================================================================" << endl;
cout << "Neuer Artikel wurde erstellt. Es " << (!n ? "ist" : "sind") << " nun " << (n + 1) << " Artikel in der Datenbank." <<endl;
cout << "====================================================================" << endl;
return ++n;
}
else
return n;
}void ausgeben(artikel a[], int n)
{
cout << "" << endl;" << endl;
for (size_t i = 0; i < n; ++i)
{
cout << "Datensatz.........: " << i << endl;
cout << "Artikelnummer.....: " << a[i].nr << endl;
cout << "Artikelbezeichnung: " << a[i].name << endl;
cout << "Preis.............: " << a[i].preis << endl;
cout << "Anzahl............: " << a[i].anzahl << endl;
cout << "
}
}void speichern(artikel a[], int n)
{
if (!n) // kurzschreibweise n = 0
{
cout << "Es gibt nichts zu speichern." <<endl;
return;
}
ofstream dat;
stringstream ss;
char buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\/");std::string path = std::string(buffer).substr(0, pos);
ss << path << "/ARTIKEL.DAT";
dat.open(ss.str().c_str());
for (size_t i = 0; i < n; ++i)
{
dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl;
}
dat.close();//datei schließen
cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl;
}void laden (artikel a[], int n)
{
stringstream ss;
char buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\/");
std::string path = std::string(buffer).substr(0, pos);
ss << path << "/ARTIKEL.DAT";std::ifstream Eingabedatei (ss.str().c_str());
if (!Eingabedatei)
{
cout << "\tEs wurden bisher keine Dateien abgespeichert oder, "<< endl;
cout << "\tdie Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl;
}string line;
if (Eingabedatei.is_open())
{
while (getline(Eingabedatei, line))
{
cout << line << '\n';
}
Eingabedatei.close();
}}
-
Korrektur (korrigierteStellen mit <======= markiert):
#include <string> #include <iostream> #include <limits> #include <fstream> #define NOMINMAX // <======= #define max unterdrücken #include <windows.h> #include <sstream> using namespace std; struct artikel { int nr; // Artikelnummer string name; // Artikelbezeichnung float preis; // Artikelpreis int anzahl; // Artikelanzahl }; artikel* create() { int artikelnummer, anzahl; float preis; string name; while( 1 ) //(1) bedeutet endlosschleife wenn nötig { cout << "Artikelnummer: "; cin >> artikelnummer; if( cin.fail() ) { cin.clear(); // löschen // <====== kommentar vergessen cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "(!) Fehler: Nur ganzzahlige Artikelnummernerlaubt." << endl; continue; } break; // aus while schleife austreten wenn user gülltige eingabe gemacht hat } cin.clear(); //eingabe nciht beachten cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Artikelbezeichnung: "; getline(cin, name); while( 1 ) { cout << "Preis: "; cin >> preis;//eingabe Preis if( cin.fail() ) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "(!) Fehler: Nur Dezimalbrueche (ggf. mit Dezimalpunkt) erlaubt." << std::endl; continue; // <======= ';' vergessen } break; } while( 1 ) { cout << "Anzahl: "; cin >> anzahl; if( cin.fail() ) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "(!) Fehler: Nur ganzzahlige Anzahlen erlaubt." << endl; continue; } break; } artikel *a = new artikel(); a->nr = artikelnummer; a->name = name; a->preis = preis; a->anzahl = anzahl; return a; // } int eingeben(artikel a[], int n) { if( n < 100 ) //n max. 99 { // anzeige wie viele datensätze bisher in der Datenbank sind a[n] = *create(); // forderung eines artikel arrays cout << "====================================================================" << endl; cout << "Neuer Artikel wurde erstellt. Es " << ( !n ? "ist" : "sind" ) << " nun " << ( n + 1 ) << " Artikel in der Datenbank." << endl; cout << "====================================================================" << endl; return ++n; } else return n; } void ausgeben(artikel a[], std::size_t n) // <======== signed/unsigned mismatch n & i { cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl; for( size_t i = 0; i < n; ++i ) { cout << "Datensatz.........: " << i << endl; cout << "Artikelnummer.....: " << a[i].nr << endl; cout << "Artikelbezeichnung: " << a[i].name << endl; cout << "Preis.............: " << a[i].preis << endl; cout << "Anzahl............: " << a[i].anzahl << endl; cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl; } } void speichern(artikel a[], std::size_t n) // <======== signed/unsigned mismatch n & i { if( !n ) // kurzschreibweise n = 0 { cout << "Es gibt nichts zu speichern." << endl; return; } ofstream dat; stringstream ss; char buffer[MAX_PATH]; GetModuleFileName(NULL, buffer, MAX_PATH); string::size_type pos = string(buffer).find_last_of("\\/"); std::string path = std::string(buffer).substr(0, pos); ss << path << "/ARTIKEL.DAT"; dat.open(ss.str().c_str()); for( size_t i = 0; i < n; ++i ) { dat << i << ";" << a[i].nr << ";" << a[i].name << ";" << a[i].preis << ";" << a[i].anzahl << endl; } dat.close();//datei schließen cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl; } void laden(artikel a[], int n) { stringstream ss; char buffer[MAX_PATH]; GetModuleFileName(NULL, buffer, MAX_PATH); string::size_type pos = string(buffer).find_last_of("\\/"); std::string path = std::string(buffer).substr(0, pos); ss << path << "/ARTIKEL.DAT"; std::ifstream Eingabedatei(ss.str().c_str()); if( !Eingabedatei ) { cout << "\tEs wurden bisher keine Dateien abgespeichert oder, " << endl; cout << "\tdie Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl; } string line; if( Eingabedatei.is_open() ) { while( getline(Eingabedatei, line) ) { cout << line << '\n'; } Eingabedatei.close(); } }
-
Oha vielen vielen dank das sie sich so viel mühe gemacht haben :o
Das Programm geht wieder dank ihrer Hilfe !