Programm
-
jetzt funktionierts. Habs einfach nochmal ganz neu gemacht.Habe noch einige Fragen dazu:
-Woher weiss denn das Programm das sich erste Spalte in der datei.txt sich auf die Artikelnummer bezieht.
- was wäre wenn die Lagernummer auch buchstaben enthalten würde. Müsste ja irgendwo deklariert werden oder???
-ist ein Einbezug mit einer anderen datei auch möglich. zb. excel datei??
-wie würde sich das Programm ändern wenn ich zb. noch eine dritte oder sogar eine 4. Info dazuhaben möchte. zb. Anzahl und Artikelbeschreibung
-
So, ich versuche mal, deine Fragen zu beantworten.
Zur ersten Frage:
SElem tmp; dat_ein >> tmp.Artikelnummer; dat_ein >> tmp.Lagernummer; Elemente.push_back(tmp);Das Programm liest immer zwei strings hintereinander ein, die durch Leerzeichen, Tabulatoren, Zeilenumbrüche etc. getrennt sind. Den ersten string sieht das Programm dabei als Artikelnummer an, den zweiten als Lagernummer. Die beiden strings werden in die jeweiligen Elemente der Struktur gespeichert und in den vector Elemente aufgenommen. Dies wird solange gemacht, wie die Bedingung !dat_ein.eof() erfüllt ist. (Also solange, wie das Programm Datensätze findet.) Artikelnummern und Lagernummern wechseln sich in der Datei beginnend mit der Artikelnummer ab.
Zur zweiten Frage:
Du kannst in der Artikelnummer sowohl Zahlen als auch Buchstaben verwenden, da strings sowohl zahlen als auch Buchstaben enhalten können (Wäre ja sinnlos, wenn sie es nicht könnten). Eine Anpassung des Programms ist also nicht erforderlich. Allerdings musst du, wenn du Buchstaben verwendest, eventuell Groß/Kleinschreibung beachten.Zur dritten Frage:
Da Excel-Dateien anders aufgebaut sind als die Textdateien, die dieses Programm erwartet, ist es mit diesem Programm nicht möglich, Excel-Dateien auszuwerten. Zu diesem Zweck müsste das Programm modifiziert werden.Zur vierten Frage:
Du müsstest der Struktur SElem noch zwei weitere Elemente hinzufügen, sodass die Struktur in etwa so aussieht:struct SElem { string Artikelnummer; string Lagernummer; int Anzahl; string Beschreibung; };Der Code zum Einlesen der Datensätze müsste dann so aussehen:
SElem tmp; dat_ein >> tmp.Artikelnummer; dat_ein >> tmp.Lagernummer; dat_ein >> tmp.Anzahl; getline(dat_ein,tmp.Beschreibung); Elemente.push_back(tmp);Auch die Ausgabe muss so angepasst werden, dass das Programm auch die neuen Informationen anzeigt.
Hier nochmal das angepasste Programm:
#include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; struct SElem { string Artikelnummer; string Lagernummer; int Anzahl; string Beschreibung; }; int main() { ifstream dat_ein; dat_ein.open("datei.txt",ios_base::in); vector<SElem> Elemente; while(!dat_ein.eof()) { SElem tmp; dat_ein >> tmp.Artikelnummer; dat_ein >> tmp.Lagernummer; dat_ein >> tmp.Anzahl; getline(dat_ein,tmp.Beschreibung); Elemente.push_back(tmp); } int Anzahl = Elemente.size(); dat_ein.close(); string ArtNum; bool found = false; cout << "Artikelnummer: ";cin >> ArtNum; for(int loop1=0;loop1<Anzahl;loop1++) { if(Elemente[loop1].Artikelnummer==ArtNum) { cout << "Lagernummer\t: " << Elemente[loop1].Lagernummer << endl; cout << "Anzahl\t\t: " << Elemente[loop1].Anzahl << endl; cout << "Lagernummer\t:" << Elemente[loop1].Beschreibung << endl; found = true; break; } } if(found==false)cout << "(Keine Informationen gefunden)" << endl; cin.get(); return 0; }Der Inhalt von Datei.txt lautet nun:
105-10-2467.5 2117 3 Dies ist eine Produktbeschreibung. 108-48-4757.8 3456 7 Das ist auch eine Produktbeschreibung 140-47-4564.2 4567 5 Das hier ist Produnkt nummer DreiDie Datei ist so aufgebaut:
Artikelnummer1 Lagernummer1 Anzahl1 (Rest der Zeile Produktbeschreibung1)
Artikelnummer2 Lagernummer2 Anzahl2 (Rest der Zeile Produktbeschreibung2)
Artikelnummer3 Lagernummer3 Anzahl3 (Rest der Zeile Produktbeschreibung3)
...Ich hoffe, meine Erklärungen sind hilfreich.
MfG, Jochen
-
FreakY<3Cpp schrieb:
Mach aus dem double ein string.
Dann meinst du, du hast 100 Artikelnummer und dazu passende Lagernummer, da würd ich wohl map empfehlen.
Und dann noch etwas ganz schlaggebendes
ES GIBT KEINE IF-SCHLEIFEN!!!doch gibt es
und zwar werden solche konstruktionen if schleifen genannt:int main() { punkt: if ( 0 == 0 ) goto punkt; }das prinzip sollte klar sein, ich weiss nicht obs syntaktisch richtig ist, hab goto nie gelernt (wieso auch xD)
-
Skym0sh0 schrieb:
doch gibt es
und zwar werden solche konstruktionen if schleifen genannt:int main() { punkt: if ( 0 == 0 ) goto punkt; }Das hast du dir gerade ausgedacht, oder?
-
Skym0sh0 schrieb:
und zwar werden solche konstruktionen if schleifen genannt:
Gib mal 'ne Quelle. :p
-
Skym0sh0 schrieb:
doch gibt es
und zwar werden solche konstruktionen if schleifen genannt:int main() { punkt: if ( 0 == 0 ) goto punkt; }Das ist korrekt.
-
Hihi.
int main() { // switch-schleife label: switch(false) { default: goto label; } // hallo-schleife label: "hallo"; goto label; // baadf00d-schleife label: 0xbaadf00d; goto label; }
-
Nukularfüsiker schrieb:
Hihi.
int main() { // switch-schleife label: switch(false) { default: goto label; } // hallo-schleife label: "hallo"; goto label; // baadf00d-schleife label: 0xbaadf00d; goto label; }Denen bin ich so noch nicht begegnet, aber die "if-Schleifen" habe ich schon oft gesehen. Aber ich nenne sie umständlich "if-goto-Schleifen", unter anderem damit ich nicht mit oben genannter Webseite kollidiere.
-
volkard schrieb:
Aber ich nenne sie umständlich "if-goto-Schleifen"
Ist doch fein, da kommt wenigstens das Schleifenkonstrukt drin vor.
Ansonsten ist mir noch die else-Schleife eingefallen:
label: if(false); else goto label;
-
Nukularfüsiker schrieb:
Ansonsten ist mir noch die else-Schleife eingefallen:
label: if(false); else goto label;Das erste
;gehört da nicht hin.
EDIT: Natürlich gehört es da doch hin.Zusammengefasst: Es gibt keine
if-Schleifen, weil man alles zwischenlabel:undgoto label;tun kann.
-
TyRoXx schrieb:
Zusammengefasst: Es gibt keine
if-Schleifen, weil man alles zwischenlabel:undgoto label;tun kann.Manche Schleifen haben mehr oder weniger gebräuchliche Namen, die Zeitschleife (eher DOS), die Idiotenschleife (eher 64-er), die Menuschleife (eher DOS), ... und auch eben die If-Schleife (eher C/Basic).
-
Gibt es auch die Exception-Schleife? Also sowas wie das hier?
label:try{throw 0;}catch(int i){goto label;}@TyRoXx: Das Semikolon bei der "else-Schleife" ist richtig. Bei Pascal wäre es falsch, nicht aber in C/C++.
-
_matze schrieb:
Skym0sh0 schrieb:
und zwar werden solche konstruktionen if schleifen genannt:
Gib mal 'ne Quelle. :p
siehe volkard weiter unten xD
-
volkard schrieb:
Manche Schleifen haben mehr oder weniger gebräuchliche Namen, die Zeitschleife (eher DOS), die Idiotenschleife (eher 64-er), die Menuschleife (eher DOS), ... und auch eben die If-Schleife (eher C/Basic).
Aber warum etwas völlig Sinnfreies benennen? Ist das hier etwa eine Kommentarschleife:
label: /*hier gehts ab*/ goto label;Was hat man denn davon, einen konstanten Ausdruck wie
0 == 0als Bedingung für einen Sprung zu nehmen? Oder meinst du richtige Bedingungen?int again = 1; loop: //.. again = 0; //.. if (again) goto loop;Warum dann nicht einfach so:
int again = 1; do { //... again = 0; //oder break; //... } while (again);
-
Ich ging davon aus, daß er richtige Bedingungen meint.
-
hi Leute!
Habe das gleiche programm wie das vorhinbeschriebene.Ich habe das problem wenn ich es über MS Visual C++ ausführe klappt es super.Ohne Fehler!! Wenn ich die Exe im Debug ordner ausführe, passiert garnix. es öffnet sich lediglich der kleine schwarze bildschirm. Der cursor blinkt, man kann aber nichts eingeben geschweige den überhaupt irgendwas machen.
Was is da los?
-
Hallo,
Schau mal im Taskmanager nach, wie hoch die CPU- Auslastung ist. Sollte diese hoch sein, hängt das Programm eventuell in einer Endlosschleife fest. Du kannst ja vor jedem kritischen Codeabschnitt (schleifen, etc.) eine Nummer ausgeben lassen:
cout << "1" << endl; while(!dat_ein.eof()){/*...*/} cout << "2" << endl;Dann siehst du, wo der Fehler verursacht wird.
Außerdem habe ich auch in dem Beispielquelltext auf Fehlerbehandlung verzichtet. Du solltest also auf jeden Fall sicherstellen, dass das Programm auch die Datei "Datei.txt" findet.
Also nach dem Öffnen der Datei sowas schreiben:if(!dat_ein){cout << "Datei konnte nicht geöffnet werden." << endl;}Und achte darauf, dass die Datei nicht etwa Datei.txt.txt heißt, was vorkommen kann, wenn du unter Ordneroptionen die Option Dateiendungen ausblenden aktiviert hast.
MfG, Jochen
-
die datei.txt wird meines erachtens ohne probleme eingelesen. Wenn das nicht der fall der wäre, dann würde ja schon beim ausführvorgang im visual ein fehler zu erkennen sein oder? Habe die Datei im Projektordner stehen. Soweit richtig???
Das komische ist. Als ich das ganze gestern ausprobiert habe, meine ich es hat funktioniert. Bin mir jedoch nichtmehr sicher.......
-
elvis911 schrieb:
die datei.txt wird meines erachtens ohne probleme eingelesen. Wenn das nicht der fall der wäre, dann würde ja schon beim ausführvorgang im visual ein fehler zu erkennen sein oder?
Trotzdem kann es nicht schaden, das auch zu überprüfen, wie von Jochen S. vorgeschlagen wurde.
Vielleicht hat es ja auch mit dem Ausführungsverzeichnis zu tun. Hast du mal probiert, deine Textdatei mit 'nem absoluten Pfad ("C:\...") zu öffnen?
-
Ich habs glaub ich herausgefuden. Du musst die Anhangdatei beim ausführen der .exe auch im Debugordner speichern. Denn wenn due die .exe ausführst dann sucht er ja nur nach "datei.exe". Also sprich im gleichen ordner wie die .exe.
Hört sich auch iregndwo logisch an. Bitte korrigiert micht wenns nicht stimmt.Dennoch frage ich mich, wie ich einen Pfad angebe, der auserhalb diese Ordners liegt.
Habe zb. meine Datei einfach auf C: gelegt. Da müsste ich doch folgenden Pfad bekommen? ("C:\\datei.txt",ios_base::in)
Sobald ich den angebe funktioniert nichts mehr.Gruss