Problem mit string funktion



  • Guten Morgen,
    ich schreibe gerade zu Übungszwecken ein kleines Textbasiertes RPG. Zunächst habe ich Textdateien in der main einlesen lassen und diese in einem (bzw. mehreren) String zwischengespeichert und anschließend auf dem Bidschirm ausgegeben.

    fstream finE( "Einleitung.txt" );
        string bufferE;
        string tmp_Einleitung[10];
        int i=0;
        while (finE.good()) {
          getline(finE,bufferE);
          tmp_Einleitung[i]=bufferE;
          i++;
       }
        finE.close();
    

    Davon hatte ich dann mehrere geschrieben. Nunja irgendwann wollte ich diese Einlese-Routinen als Funktionen in andere Sourcedateien auslagern.
    Ich hatte schon einige Versuche gestartet dies zu bewerkstelligen, bei der aktuellen Version wird zwar der erste Teil der Story ausgegeben jedoch folgt anschließend ein segemtation fault (core dumped).
    Hier der ausgelagerte Code:

    string Einleitung() {
        fstream finE( "Einleitung.txt" );
        string bufferE;
        string tmp_Einleitung[10];
        int i=0;
        while (finE.good()) {
          getline(finE,bufferE);
          tmp_Einleitung[i]=bufferE;
          i++;
       }
        finE.close();
    cout << tmp_Einleitung[0] << endl;
    cout << tmp_Einleitung[1] << endl;
    cout << tmp_Einleitung[2] << endl;
    cout << tmp_Einleitung[3] << endl;
    cout << tmp_Einleitung[4] << endl;
    }
    

    Und der Aufruf in der main:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <fstream>
    #include <string>
    #include "story.hpp"
    #include "player.hpp"
    
    using namespace std;
    
    int main() {
        char eingabe;
        char namenseingabe[40];
        int e;
        //Einleitung Einleit;
        //einl.Einleitung();
        string tmp_Einleitung, tmp_Portal, tmp_U, tmp_K, tmp_M, tmp_B;
    
        Einleitung();
       // cout << tmp_Einleitung[1] << endl;
       // cout << fileContents;
        cout << Sp1 << endl;
        do {
        cout << "#Drücke W um auf den Fremden zuzugehen#" << endl << endl;
        cin >> eingabe;
    

    Ich hoffe ihr könnt mir helfen. Ich nutze ein Linux 64bit System.



  • Vermeide Arrays mit konstanter Länge! In C++ nimmst du bitte vector für all deine Arrays.

    Dann beim Einlesen: deine Logik ist nicht ok:

    while (finE.good()) {
          getline(finE,bufferE);
          tmp_Einleitung[i]=bufferE;
          i++;
       }
    

    Wenn getline fehlschlägt, führst du danach trotzdem noch munter weiter die Zuweisung durch. Überprüfe den Rückgabewert!

    Also vielleicht so (ungetestet hingerotzt):

    void Einleitung() {
        fstream finE( "Einleitung.txt" );
        if (!finE.is_open()) throw runtime_error("Einleitung.txt konnte nicht geöffnet werden");
        string line;
        vector<string> tmpEinleitung;
        while (getline(finE, line)) {
            tmpEinleitung.push_back(line);
        }
        for (const auto &s : tmpEinleitung) {
            cout << s << "\n";
        }
    }
    

    Stellen sich mit nun aber noch 2 Fragen:
    1. warum returnst du "string"? Die Funktion hat kein return-Statement!
    2. warum erst alle Zeilen in ein Array (oder vector) einlesen und dann ausgeben - man könnte sie auch direkt ausgeben.

    => dein Compiler sollte zumindest bei (1) eine Warnung ausgegeben haben!



  • Vielen Dank 🙂 👍 ich habe deinen code etwas angepasst aber mein Compiler gibt noch folgende Meldung aus:
    error: ISO C++ forbids declaration of ‘s’ with no type [-fpermissive]
    for (const auto &s : tmp_Einleitung) {
    ^

    und außerdem:

    warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11
    for (const auto &s : tmp_Einleitung) {
    ^

    Zu deinen Fragen: Den return Wert hatte ich wohl mittlerweile weggelassen da ich da nicht mehr weiterkam.
    Warum ich den Dateitext einlese? Das hat den Grund das ich halt bei diesem Projekt möglichst viele Aspekte der C++ Sprache abdecken möchte und wengiger auf Programmperformance achte



  • L3R050tH schrieb:

    mein Compiler gibt noch folgende Meldung aus:
    error: ISO C++ forbids declaration of ‘s’ with no type [-fpermissive]
    for (const auto &s : tmp_Einleitung) {
    ^

    und außerdem:

    warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11
    for (const auto &s : tmp_Einleitung) {
    ^

    Einfach: mach das, was der Compiler sagt!

    also: g++ -std=c++11 datei.cc -o executable
    Außerdem würde ich neben -std=c++11 noch -Wall -Wextra -pedantic -O2 benutzen.


Log in to reply