Zeilen einer Textdatei in Array speichern und zufällig ausgeben
-
...oder das?
for(int choiceGen = 0; choiceGen<2; choiceGen++){ cout << textArray[choice]; }
-
@twoplustwoisfour sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
Eine meiner Quellen: http://www.cplusplus.com/forum/beginner/191280/
Hast du auch gelesen, dass das, was du kopiert hast, die Frage war? Und dass darunter jemand auf
std::getine
verweisen hat, um Zeilen einzulesen?Warum das hier:
std::string textArray[100];
Nimmstd::vector<std::string>
!
-
#include "text.txt" sollte ein Workaround für meine Unfähigkeit sein, die Datei über ifstream inFile("\text.txt") bearbeitbar zu machen. Das funktioniert auch wunderbar.
Im Grunde funktioniert das Programm insoweit, dass es die Datei aufruft. Daraufhin wird mir der Text für jede Zeile ausgegeben und gesagt, dass die Zeichen leider non-ASCII sind.Was meine Logik angeht, so dachte ich:
srand(time(0)) //errechnet eine zufällige Zahl
int choice = 1+ (rand()%100) // gibt mir eine Zahl zwischen 0 und 99 und speichert diese in der Variable choice. Das korreliert ja genau mit der Anzahl der im Array gespeicherten Zeilen. Ich sehe hier den Fehler irgendwie nicht.
Ich stelle mich hier sicher dumm an, weiß jemand weiter?
-
@twoplustwoisfour sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
#include "text.txt" sollte ein Workaround für meine Unfähigkeit sein (...) Das funktioniert auch wunderbar.
Nein, das funktioniert nicht. Dann wird das als C++-Quelltext interpretiert, nicht als Zeichenketten.
ifstream inFile("\text.txt")
Du hast einen Backslash zu viel drin, die Datei wird doch "text.txt" heißen und nicht "<tabulator>ext.txt"?!
srand(time(0)) //errechnet eine zufällige Zahl
Siehe Doku zu srand. Das ruft man einmalig im Programm auf (wenn man nicht lieber den
<random>
-Header nutzt).
-
Ich weiß nicht wofür man da eine Klasse braucht?
#include <cstdlib> #include <vector> #include <string> #include <iostream> #include <fstream> #include <random> int main() { char const* const filename{ "hugo.txt" }; std::ifstream is{ filename }; if (!is.is_open()) { std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n"; return EXIT_FAILURE; } std::vector<std::string> cites; for (std::string line; std::getline(is, line); cites.push_back(line)); if (!cites.size()) { std::cerr << "Couldn't read cites from \"" << filename << "\" :(\n\n"; return EXIT_FAILURE; } std::mt19937 mt{ std::random_device{}() }; std::uniform_int_distribution<std::size_t> dist{ 0, cites.size() - 1 }; std::cout << cites[dist(mt)] << '\n'; }
hugo.txt
Was du liebst, lass frei. Kommt es zurück, gehört es dir für immer. Fordere viel von dir selbst und erwarte wenig von den anderen. So wird dir Ärger erspart bleiben. Die Erfahrung ist wie eine Laterne im Rücken; sie beleuchtet stets nur das Stück Weg, das wir bereits hinter uns haben. Der Weg ist das Ziel. Zu wissen, was man weiß, und zu wissen, was man tut, das ist Wissen. Lernen, ohne zu denken, ist eitel. Denken, ohne zu lernen, ist gefährlich. Ist man in kleinen Dingen nicht geduldig, bringt man die großen Vorhaben zum Scheitern. Wer ständig glücklich sein möchte, muss sich oft verändern. Es ist besser, ein einziges kleines Licht anzuzünden, als die Dunkelheit zu verfluchen. Die Menschen stolpern nicht über Berge, sondern über Maulwurfshügel. Wenn über das Grundsätzliche keine Einigkeit besteht, so ist es sinnlos, miteinander zu planen. Der sittliche Mensch liebt seine Seele, der gewöhnliche sein Eigentum. Essen und Beischlaf sind die beiden großen Begierden des Mannes. An einem edlen Pferd schätzt man nicht seine Kraft, sondern seinen Charakter. Nur die Weisesten und die Dümmsten können sich nicht ändern. Von Natur aus sind die Menschen fast gleich; erst die Gewohnheiten entfernen sie voneinander. Der Anführer eines großen Heeres kann besiegt werden. Aber den festen Entschluß eines einzigen kannst du nicht wankend machen. Wenn du die Absicht hast, dich zu erneuern, tu es jeden Tag. Arm sein und nicht murren ist schwer. Reich sein und nicht hochmütig werden, ist im Vergleich damit leicht. Dem klugen Schützen gleicht der höhere Mensch. Verfehlt dieser sein Ziel, so wendet er sich ab und sucht die Ursache seines Fehlschusses in sich selbst. Das Wasser nimmt nicht mehr Platz ein, als es wirklich bedarf. So gleicht es der Mäßigung. Der Edle steht der Welt ohne Vorliebe und Vorurteil gegenüber. Er hält sich allein an das Rechte. Der Mensch hat dreierlei Wege, klug zu Handeln; erstens durch Nachdenken, das ist das Edelste, zweitens durch Nachahmen, das ist das Leichteste, und drittens durch Erfahrung, das ist das Bitterste. Der Mensch ist von Geburt an gut, aber die Geschäfte machen ihn schlecht. Der wahrhaft Edle predigt nicht, was er tut, bevor er nicht getan hat, was er predigt. Es gibt niemanden, der nicht ißt und trinkt, aber nur wenige, die den Geschmack zu schätzen wissen. Erzähle mir die Vergangenheit, und ich werde die Zukunft erkennen. In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. Lernen ohne zu denken, ist eitel, denken, ohne zu lernen, gefährlich. Menschenliebe ist das Wesen der Sittlichkeit, Menschenkenntnis das Wesen der Weisheit. Nur der größte Weise und der größte Tor können sich ändern. Wenn die Begriffe sich verwirren, ist die Welt in Unordnung. Unwissenheit ist die Nacht des Geistes, eine Nacht ohne Mond und Sterne. Wer aufrichtig ist, dem vertraut das Volk. Wer sich seiner Fehler schämt, macht sie zu Verbrechen. Über das Ziel hinausschießen ist ebenso schlimm wie nicht ans Ziel kommen. Wer das Morgen nicht bedenkt, wird Kummer haben, bevor das Heute zu Ende geht. Wer Menschen beurteilt, hüte sich vor billigem Tadel und vor billigem Lob. Wohin du auch gehst, geh mit deinem ganzen Herzen. Sage es mir, und ich werde es vergessen. Zeige es mir, und ich werde es vielleicht behalten. Lass es mich tun, und ich werde es können. Es ist nicht wichtig, wie langsam du gehst, sofern du nicht stehen bleibst. Der wahrhaft Weise hält es wie der wilde Büffel, er wedelt mit dem Schwanz. Der Edle strebt nach Harmonie, nicht nach Gleichheit. Der Gemeine strebt nach Gleichheit, nicht nach Harmonie. Das Rechte erkennen und nichts tun, ist Mangel an Mut. Das Lernen ist wie ein Meer ohne Ufer. Das erste Haus baust du für deinen Feind das zweite für deinen Freund und das dritte für dich selbst. Das Aussehen eines Menschen siehst du bei Licht, seinen Charakter jedoch, erkennst du im Dunkeln. Auch der weiteste Weg beginnt mit einem ersten Schritt. Der Weise lässt was er nicht tun kann. Nur der Dumme tut was er nicht lassen kann. Der Weise sucht, was in ihm selber ist, der Tor, was außerhalb. Der Mann, der den Berg abtrug, war derselbe, der anfing, kleine Steine wegzutragen. Der Mensch lebt durch Geradheit. Ohne sie lebt er nur von glücklichen Umständen und rechtzeitigem Ausweichen. Die eigenen Fehler erkennt man am besten mit den Augen anderer. Die Männer des Altertums, die dem ganzen Reich ein Beispiel der Tugend sein wollten, brachten zuerst ihr eigenes Fürstentum in Ordnung. Wollten sie ihr Fürstentum in Ordnung bringen, so ordneten sie zuerst ihre Familie. Wollten sie ihre Familie ordnen, so kultivierten sie zuerst ihren Charakter. Wollten sie ihren Charakter kultivieren, so läuterten sie zuerst ihr Herz. Die Quintessenz des Wissens ist das Erlernte auch anzuwenden. Du kannst den Hahn zwar einsperren, die Sonne geht dennoch auf. Einen Fehler machen und ihn nicht korrigieren, das erst heißt wirklich einen Fehler machen. Exekutiere einen Mann um die Moral von tausend zu töten. Fehler werden gemacht, damit danach eine Erfahrung stattfindet und aus dieser wiederum das Erkennen stattfindet und dadurch eine Veränderung vorgenommen wird. Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. In allen Dingen hängt der Erfolg von den Vorbereitungen ab. Laute Freunde sind oft leise Feinde. Leuchtende Tage. Nicht weinen, dass sie vorüber. Lächeln, dass sie gewesen. Ob es Unglück bringt, wenn dir eine schwarze Katze über den Weg läuft, hängt alleine davon ab, ob du ein Mensch oder eine Maus bist. Sind die Worte im voraus festgelegt, so stockt man nicht. Sind die Arbeiten im voraus festgelegt, so kommt man nicht in Verlegenheit. Sind die Handlungen im voraus festgelegt, so macht man keinen Fehler. Ist der Weg im voraus festgelegt, so wird er nicht plötzlich ungangbar. Überlege, was du sagst. Deine Sätze sollen sein wie ein Wasserfall, klar und rein und gewichtig wie ein Fels. Um an die Quelle zu kommen, muss man gegen den Strom schwimmen. Wenn die Sprache nicht stimmt, ist das was gesagt wird nicht das was gemeint ist. So kommen keine guten Werke zustande. Also dulde man keine Willkür in den Worten. Wenn du einen Würdigen siehst, dann trachte ihm nachzueifern. Wenn du einen Unwürdigen siehst, dann prüfe dich in deinem Inneren. Wenn man selbst lieber zu viel tut und wenig von anderen erwartet, so bleibt man fern vom Groll. Wer das Ziel kennt, kann entscheiden. Wer entscheidet, findet Ruhe. Wer Ruhe findet, ist sicher. Wer sicher ist, kann überlegen. Wer überlegt, kann verbessern. Wer alles glaubt, was er liest, sollte besser aufhören zu lesen. Wer auf Rache aus ist, der Grabe zwei Gräber. Wer neu anfangen will, soll es sofort tun, denn eine überwundene Schwierigkeit vermeidet hundert neue.
-
@Swordfish Danke!! Das funktioniert richtig gut. Ich muss nur noch herausfinden wieso
-
@twoplustwoisfour sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
Das funktioniert richtig gut.
Normal Brudi.
@twoplustwoisfour sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
Ich muss nur noch herausfinden wieso
Lehrbuch besorgen und durcharbeiten?
-
@Swordfish sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
std::mt19937 mt{ std::random_device{}() };
std::uniform_int_distributionstd::size_t dist{ 0, cites.size() };
std::cout << cites[dist(mt)] << '\n';
}Wenn du genau einen Zufallswert brauchst - warum dann erst einen mt19937 mit riesigem State initialisieren? Nicht, dass ich das nicht auch schon öfter aus Gewohnheit so gemacht hätte.
Edit: ach so: und wenn man nur genau eine zufällige Zeile haben will, bekommt man das auch hin, ohne die komplette Datei in einem vector zu halten... Aber das ist eine fortgeschrittene Aufgabe.
-
@wob sagte in Zeilen einer Textdatei in Array speichern und zufällig ausgeben:
Aber das ist eine fortgeschrittene Aufgabe.
Soweit bin ich in meinem Lehrbuch noch nicht.
-
Zunächst mal solltest du lernen, dich selbst besser zu hinterfragen. Deine beiden Aussagen
Gerade scheint mein größtes Problem allerdings zu sein, dass die Zeichen " und ; keine ASCII-Zeichen sind
und
#include "text.txt" sollte ein Workaround für meine Unfähigkeit sein, die Datei über ifstream inFile("\text.txt") bearbeitbar zu machen. Das funktioniert auch wunderbar.
sind krass falsch. Wir als erfahrene Leute könne das wissen, aber es muss ja irgendeinen Grund geben, wie du darauf gekommen bist. Das heißt, du musst ganz schön große Fehler in der Beurteilung gemacht haben, was in deinem Programm passiert, vielleicht sogar Logikfehler bei deinen Schlussfolgerungen.
So etwas zu vermeiden, ist ein ganz wichtiger Schritt als Programmierer, weil man auch hartnäckigste Fehler knacken kann, wenn man nur konsequent, gründlich und streng logisch vorgeht. Bloß keine voreiligen Schlüsse ziehen!
Allgemein gilt:
- Sich ständig im Klaren sein, was man weiß, und was man nur vermutet
- Ständig hinterfragen, wieso man etwas zu wissen meint. Kann vielleicht der Grund, wieso man etwas zu wissen meint, falsch sein? Das kommt erstaunlich oft vor.
Nützlich dabei ist das sogenannte Quietscheentchen-Debugging: Man erklärt sein Programm jemand anderem, das kann ein echter anderer Programmierer sein, oder nur eine eingebildete Person (das Quietscheentchen). Und dieses Gegenüber stellt ständig "dumme" Fragen zu allem was du erklärst: Wieso? Weshalb? Warum? Dann findet man schnell die Stellen, wo man selber etwas nicht versteht. Und wenn man nicht versteht, was passiert, dann kann da auch ein unbekannter Fehler lauern.
Das ist ungeheuer wichtig, wenn du mal halbwegs gut werden möchtest.