Während Textdatei-Auslese Zahlen zählen

Guten Abend Deepthroat,

Top Antwort, gerne wieder ;) . Meine Textdatei sieht jetzt fast so aus, wie ich sie haben möchte... Mit der Einrückung verstehe ich nicht, in dem Thread, den du mir verlinkt hast, war die Antwort auch, dass man die Zeichen abzählen soll und in eine Variable als Längenangabe speichern soll.

Hier wird mein Problem deutlich:

#############################################
Die 1 wurde 1 gewürfelt
Die 2 wurde 2 gewürfelt
Die 3 wurde 2 gewürfelt
Die 4 wurde 2 gewürfelt
Die 5 wurde 3 gewürfelt
Die 6 wurde 2 gewürfelt
#############################################
Erstellt am: Sat Jan 31 22:13:01 2009
#############################################
12 mal wurde gewürfelt die Ergebnisse sind:
#############################################

1. Wurf: 1
2. Wurf: 4
3. Wurf: 2
4. Wurf: 5
5. Wurf: 4
6. Wurf: 3
7. Wurf: 3
8. Wurf: 6
9. Wurf: 5
10. Wurf: 5
11. Wurf: 2
12. Wurf: 6

Ich weiß eben nicht vorher, wie lang die längste Zeile wird, falls der Anwender 100.000 mal würfeln möchte, verschiebt sich das ja mehr als bei nur 100 oder 10 mal. Es soll alles schön untereinander geordnet stehen, mit meinen IF-Abfragen ging es, aber es ist zu aufwendig...

Achja:
Ganz einfach: indem du es ganz zuerst reinschreibst.

Ging bei mir nicht, ich hatte es vor der FOR-Schleife und dann hat er immer 0 ausgegeben... Habe deine
Der Einfachheit halber könntest du erstmal alles nur in einen ostringstream ausgeben:
-Variante genommen und funktioniert wunderbar... An soetwas hatte ich auch gedacht, zuerst im Speicherfesthalten und dann kann ich ja die Reihenfolge der Variabelnausgabe ändern, da sie dann definiert sind und nicht auf Werte warten müssen (um es mit den Anfängerworten zu sagen 8) ).

Nun willst du schon wieder die Datei auslesen. Ist das ein Faible von dir?
Nunja, mit den Streams habe ich mich als letztes beschäftigt, deshalb erstelle ich ja eine Textdatei mit diversen Einträgen, um zu üben. Deshalb will ich immer auslesen :)

Kleine Frage am Rande, wie lange programmierst du schon, weil du mir ziemlich gut vorkommst, also habe oft schon Suchfunktion benutzt, um Probleme zu lösen und oft warst du dabei - weiter so!
 
Zuletzt bearbeitet:
Hi.
#############################################

1. Wurf: 1
2. Wurf: 4
3. Wurf: 2
4. Wurf: 5
5. Wurf: 4
6. Wurf: 3
7. Wurf: 3
8. Wurf: 6
9. Wurf: 5
10. Wurf: 5
11. Wurf: 2
12. Wurf: 6

Ich weiß eben nicht vorher, wie lang die längste Zeile wird, falls der Anwender 100.000 mal würfeln möchte, verschiebt sich das ja mehr als bei nur 100 oder 10 mal.
Du mußt ja auch nicht wissen wie lang die längste Zeile wird. Bei dir verändert sich in jeder Zeile nur ein einzelner Wert in der Breite, der Rest bleibt doch immer konstant.

Wenn du also weißt, das du 129494 mal würfeln sollst, dann weißt du auch, das diese Zahl 6 Ziffern hat und kannst dies bei der Ausgabe gleich von Anfang an beachten indem du vor dem Zählwert mit setw() die Breite auf 6 setzt.

Kleine Frage am Rande, wie lange programmierst du schon, weil du mir ziemlich gut vorkommst, also habe oft schon Suchfunktion benutzt, um Probleme zu lösen und oft warst du dabei - weiter so!
^^ Naja, mittlerweile sind es um die 10 Jahre... ;-)

Gruß
 
Guten Abend,

vielen vielen lieben Dank Deepthroat und natürlich auchRyu1991!
Das Programm läuft und vor allem tut es jetzt genau das, was ich mir vorstelle.

zum Abschluss habe ich mir gedacht, zeige ich euch kurz einen Auszug der Würfel.ini:

#############################################
Die 1 wurde 1 gewürfelt
Die 2 wurde 2 gewürfelt
Die 3 wurde 2 gewürfelt
Die 4 wurde 2 gewürfelt
Die 5 wurde 3 gewürfelt
Die 6 wurde 2 gewürfelt
#############################################
Erstellt am: Sat Jan 31 23:12:06 2009
#############################################
12 mal wurde gewürfelt die Ergebnisse sind:
#############################################

1. Wurf: 1
2. Wurf: 4
3. Wurf: 2
4. Wurf: 5
5. Wurf: 4
6. Wurf: 3
7. Wurf: 3
8. Wurf: 6
9. Wurf: 5
10. Wurf: 5
11. Wurf: 2
12. Wurf: 6


#############################################
Visit for help:
http://www.tutorials.de
#############################################

Letzter Block soll eine Art Dankeschön und zugleich Credit sein, denn das Programm werden noch einige benutzen. Die Idee kam mir nämlich während einer Mathestunde. Wir haben gerade mit dem Thema Stochastik begonnen und als Hausaufgabe sollen wir einen Würfel 100 mal würfeln und die Augen aufschreiben, anschließend die Werte, wie oft etwas vorkam (Xi und Ni). Ich werde das Programm auf jeden Fall meinen Mitschülern sowie dem Mathelehrer zeigen und anbieten für evtl. Zwecke.

Also noch einmal tausend Dank!
 
Guten Tag,

ich habe über Nacht noch eine Idee bekommen, dich ich sehr gerne in das Programm umsetzen möchte:

Der Anwender soll den Namen der Datei bestimmen können, aber die Datei soll immer als *.txt (Dateierweiterung) gespeichert werden.

Beispiel:

Code:
char filename[255]; 
cout<<"Wie soll die Datei heissen: ";
cin>>filename;
...
ofstream fout(filename)

Wenn der Anwender als Namen "Test" eintippt, soll die Datei Test.txt erstellt werden, sodass man sie mit dem Editor öffnen kann.

Danke für eure Bemühungen
 
Hi.

Nimm lieber einen std::string, das macht sich einfacher:
C++:
string filename;

cin >> filename; // Fehlerbehandlung?
filename += ".txt";
ofstream fout(filename.c_str());
Gruß
 
Hallo Deepthroat,

wie immer vielen Dank, funktioniert sehr gut. Ich habe aber eine Frage zu deinem Code:

Code:
string filename;  // Deklariert die Variable vom Typ string
 cin >> filename; // String bekommt Inhalt in dem Fall den Dateinamen
filename += ".txt";//Fügt dem Namen noch den Suffix *.txt hinzu
ofstream fout(filename.c_str()); //Was bringt das .c_str(), ohne diese Funktion mekert der Compiler

Könntest du bitte, falls du eine freie Minute hast, mir erläutern, weshalb es nur mit der .c_str() geht, denn ohne diesen Befehl kann ich es nicht compilieren.

Danke!
 
Hi.
Könntest du bitte, falls du eine freie Minute hast, mir erläutern, weshalb es nur mit der .c_str() geht, denn ohne diesen Befehl kann ich es nicht compilieren.
Der Konstruktor des ofstream erwartet einen const char* - also einen ganz normalen C-String. Der Konstruktor akzeptiert (dummerweise) keinen std::string als Parameter.

Die .c_str() Methode der std::string Klasse liefert einen \0 terminierten C-String von den gespeicherten Daten. siehe http://www.cplusplus.com/reference/string/string/c_str.html

Gruß
 
Hallo Deepthroat,

entschuldige bitte, dass ich erst jetzt antworte, aber zurzeit habe ich einiges zu tun in Sachen Schule.

Ich arbeite immer noch an dem Würfel. Mir fallen häufig neue Ideen oder Verbesserungen ein/auf.

Dieses Mal geht es um Umlaute:

Der Text, der in der Console ausgegeben wird, verändere ich mit den hexadezimal-Codes zum Beispiel:

Code:
cout<<"Wie soll die Datei hei\xE1 \ben?: ";

\xE1 \b sorgt für das ß.

Mein Problem besteht jetzt, wenn der Anwender zum Beispiel auf die Frage, wie die Datei heißen soll, antwortet: "Würfel", wird eine Textdatei erstellt, die keine Umlaute kennt ("W[]rfel.ini").

Wie bekomme ich das hin, denn wenn ich eine Textdatei manuell erstelle und Umlaute in den Dateinamen angebe, werden diese korrekt dargestellt.

Dieses Problem tritt auch auf, wenn der Benutzer den Inhalt der erstellten Datei direkt in der Console sehen will, werden keine ä,ö,ü,ß dargestellt, sondern irgendwelche anderen Zeichen.

Ich hoffe ihr könnt mir wieder einmal helfen und danke recht herzlich im Voraus!
 
Hi.
Dieses Mal geht es um Umlaute:

Der Text, der in der Console ausgegeben wird, verändere ich mit den hexadezimal-Codes zum Beispiel:

Code:
cout<<"Wie soll die Datei hei\xE1 \ben?: ";

\xE1 \b sorgt für das ß.

Mein Problem besteht jetzt, wenn der Anwender zum Beispiel auf die Frage, wie die Datei heißen soll, antwortet: "Würfel", wird eine Textdatei erstellt, die keine Umlaute kennt ("W[]rfel.ini").
Das Thema hatten wir neulich schonmal. Im Prinzip mußt du zwsichen dem ANSI und ASCII Zeichensatz übersetzen. Siehe http://www.tutorials.de/forum/c-c/333896-ascii-code-von-umlauten-nicht-korrekt.html

Du müßtest dir überlegen in welchem Zeichensatz du die Dateien grundsätzlich speichern willst. Im ASCII CodePage 850 würde es alles in der Konsole richtig dargestellt, du könntest die Datei aber nicht mit Notepad editieren. Andersherum müßtest du die Datei beim Lesen und schreiben immer explizit übersetzen.

Die Eingabe das Benutzers müßtest du allerdings immer von ASCII nach ANSI übersetzen, so dass der richtige Dateiname entsteht.

Gruß
 
Moin,

das liegt daran, dass Du es mit ANSI- und nicht mit ASCII-Zeichen zu tun hast! Das ist abhängig von der eingestellte Codepage im Betriebssystems und der jeweiligen Anwendung!

Die Zeichen 32 - 127 sind in ANSI und ASCII identisch! Für die Zeichen 128 - 255 gibt es verschiedene Codepages - eben abhängig von der Konfiguration des BS und der Anwendung (u. a. der eingestellten Sprache)!

Ich nutze hier die beiden folgenden kleinen Funktionen zur Konvertierung einzelner Zeichen:
Code:
// %Funktion: Wandelt ein ASCII-Zeichen in entsprechendes ANSI-Zeichen um
// %Übergabe: ansi = ASCII-Wert
// %Rückgabe: Funktionswert : ANSI-Wert des Zeichens
char ascii2ansi(char ascii)
{
    switch (ascii)
    {
    case char(132): return char(228);                    // ä
    case char(148): return char(246);                    // ö
    case char(129): return char(252);                    // ü
    case char(142): return char(196);                    // Ä
    case char(153): return char(214);                    // Ö
    case char(154): return char(220);                    // Ü
    case char(225): return char(223);                    // ß
    default: return ascii;
    }
}


// %Funktion: Wandelt ein ANSI-Zeichen in entsprechendes ASCII-Zeichen um
// %Übergabe: ansi = ANSI-Wert
// %Rückgabe: Funktionswert : ASCII-Wert des Zeichens
char ansi2ascii(char ansi)
{
    switch (ansi)
    {
    case char(228): return char(132);                    // ä
    case char(246): return char(148);                    // ö
    case char(252): return char(129);                    // ü
    case char(196): return char(142);                    // Ä
    case char(214): return char(153);                    // Ö
    case char(220): return char(154);                    // Ü
    case char(223): return char(225);                    // ß
    default: return ansi;
    }
}

Vielleicht hilft es Dir ja! Du musst dann einfach die Strings zeichenweise prüfen!

Gruß
Klaus
 
Zurück