Bestimmte Zeile aus Datei auslesen, und Strings zu chars konvertieren



  • Hab 2 Dinge, die ich für ein kleines Spiel bräuchte, aber ich find im Internet einfach nichts passendes dazu, wobei ich mir sicher bin, dass das ganze ganz einfach ist:

    - Es soll eine zufällige Zeile aus einer Datei gelesen werden
    - der gespeicherte String soll dann in einzelne Char-Variablen zerlegt werden

    Beim Auslesen der Datei fand ich bisher nur Lösungen die die Datei Zeile für Zeile auslesen. Ich könnte es zwar so realisieren, dass er jede Zeile in einen Array speichert, und dann zufällig einen Wert aus dem Array ausgegeben wird. Aber ich bin mir nicht sicher, ob das bei einer Datei mit +500 Zeilen nicht zu viel Speicher in Anspruch nimmt, mein kleines Spielchen sollte nämlich auf jedem Windows-PC funktionieren. Es gibt sicher auch eine Möglichkeit eine bestimmte Zeile aus der Datei zu lesen, oder? Wäre nett, wenn mir da jemand auch ein Beispiel zu geben könnte, danke ^^

    Zu der Sache mit den Strings zum Char: ich bin mir sicher, dass das ganz einfach geht, aber ich hab beim googeln nichts dazu finden können. Das Problem ist sicher auch schnell gelöst o.o

    Danke im voraus für eure Hilfe ^^
    Und ja, ich bin noch ein kleiner Anfänger in C++



  • Erstens:
    Das Dateisystem kennt das Konzept von "Zeilen" nicht, vor allem wenn diese variable Längen haben. Du könntest höchstens die ganze Datei durchlesen und die Anfangsposition jeder Zeile in einem Array speichern, um später eine zufällige Zeile anzuspringen, wenn Du Angst hast, dass die ganze Datei im Speicher zuviel Platz verbraucht.

    Zweitens:
    Man kann keinen String in einen Char verwandeln, denn zweiteres ist ein einzelnes Zeichen, und ein String ist eine Kette von Chars. Vielleicht solltest Du deutlicher werden, was Du möchtest. std::string nach const char* geht mit c_str().

    Zu drittens und viertens gibts leider nichts zu sagen *aufCStollanspiel* *SCNR*



  • 1.) Würde es denn funktionieren, wenn man den Anfang einer Zeile mit irgendeinem Zeichen kennzeichnet? Oder halt das Ende einer Zeile, z.B.
    Wort1;
    Wort2;

    Und beim einlesen erkennt er dann das ;-Zeichen, und für ihm ist die Zeile dann fertig. Würde das so in etwa gehen? Dann müsste man aber jeden Buchstaben überprüfen lassen, oder nicht?
    Ich hätte jetzt schon eine Idee wie ich das umsetzen könnte, aber geht das nicht irgendwie einfacher? o.o Ich hab jetzt erwartet, dass es einen Befehl gibt wo man die Zeilennummer reinschreibt, und dann klappt alles.. ist wohl nicht so einfach

    2.) Dass ein String nicht in einen Char passt weiß ich, aber man kann die einzelnen Buchstaben doch sicher aus einem String auslesen lassen, oder? Ich probiers am besten einfach mal mit deinem c_str aus, danke ^^



  • Tsu2 schrieb:

    Und beim einlesen erkennt er dann das ;-Zeichen, und für ihm ist die Zeile dann fertig. Würde das so in etwa gehen? Dann müsste man aber jeden Buchstaben überprüfen lassen, oder nicht?

    Genau so, nur dass man zum Markieren des Zeilenendes normalerweise das Zeilenende-Zeichen ('\n') nimmt, welches auch für den Zeilenumbruch am Bildschirm sorgt 🙂

    Ich hätte jetzt schon eine Idee wie ich das umsetzen könnte, aber geht das nicht irgendwie einfacher? o.o Ich hab jetzt erwartet, dass es einen Befehl gibt wo man die Zeilennummer reinschreibt, und dann klappt alles.. ist wohl nicht so einfach

    Eine solche Funktion würde auch nichts anderes machen als Du oben vorgeschlagen hast, nämlich die Datei (sinnigerweise in kurzen Blöcken) einlesen und selbst nach dem suchen, was eine Zeile markiert ('\n'), und dann den passenden Teil zurückgeben.

    2.) Dass ein String nicht in einen Char passt weiß ich, aber man kann die einzelnen Buchstaben doch sicher aus einem String auslesen lassen, oder? Ich probiers am besten einfach mal mit deinem c_str aus, danke ^^

    Achso. Ja. Einzelne Zeichen bekommst Du mit str[n] wobei n den Index angibt 😉



  • Einzelne Zeichen würde ich mit at(i) raussuchen und nicht mit [i]. at() hat wenigstens eine Indexprüfung, []-Operator dagegen nicht (Bufferoverruns!!!).

    Schaust du hier rein:
    http://www.cppreference.com/cppstring/index.html

    bzw. genauer:
    http://www.cppreference.com/cppstring/at.html



  • Artchi schrieb:

    Einzelne Zeichen würde ich mit at(i) raussuchen und nicht mit [i].

    Kommt ganz auf die Umgebung an, in der du es brauchst - at() ist naturgemäß etwas langsamer als op[], und wenn du sicher bist, daß du im erlaubten Index-Bereich bleibst, ist dessen Zusatzprüfung überflüssig.

    LordJaxom schrieb:

    Zu drittens und viertens gibts leider nichts zu sagen *aufCStollanspiel* *SCNR*

    Ich zähle nur so weit, wie ich es für nötig halte :p (und das könnte auch jenseits der 4 weitergehen)



  • Vielen Dank für die vielen Tipps, ich glaube damit werd ich was anfangen können ^^


Anmelden zum Antworten