Probleme beim Auslesen von char flexibler Länge



  • Hallo zusammen,
    Ich habe folgendes Problem. Mein Programm soll Daten aus einer Liste lesen und diese einzelnen Variablen einer Klasse zuweisen. Ich verwende eine verkettete Liste, in welcher die jeweiligen Objekte miteinander verknüpft werden.
    Das Einlesen der Daten gelingt soweit fehlerfrei. Allerdings bekomme ich beim Auslesen der Daten auf einer höheren Ebene nur unverständliche Zeichen.
    Zunächst mal die Deklarationen:

    class ClEintrag
    {
    private:
    char *aut; //Variable, in die der Text gelesen werden soll
    public:
    void druckeEintrag(ClEintrag *aktuell); // Toolfunktion, welcher den Zugriff auf die Daten aus einer anderen Klasse gestatten soll
    char vergleicheKategorie(char *kategoriebezeichnung, char *puffer);

    nun die Zuweisung der Daten zu aut in vergleicheKategorie(char *kategoriebezeichnung, char *puffer)

    this->aut = puffer; // puffer ist in der ursprünglichen Deklaration ein char puffer[500]

    Funktion druckeEintrag(ClEIntrag *aktuell) sieht so aus:

    void ClEintrag::druckeEintrag(ClEintrag *aktuell)
    {
    cout << aktuell->aut << endl;
    }

    Das seltsame ist, dass die Ausgabe funktioniert, wenn ich sie von vergleicheKategorie() aus starte, dann gibt er aus, was er soll. Ich vermute, dass dies daran liegt, dass vergleicheKategorie() und druckeEIntrag() Funktionen der geleichen Klasse sind. Trotzdem verstehe ich nicht, warum der Aufruf
    aktuell->druckeEintrag(aktuell);
    aus einer höher liegenden Klasse zwar die richtige Instanz (hab die Speicheradresse überprüft) verwendet und diese auch korrekt an druckeEIngabe() übergibt, aber trozdem nur Quatsch produziert!
    Wenn ich aut als char fester Länge deklariere, kann ich über strcpy puffer auch auf diesem weg einlesen. Dann funktioniert auch die Ausgabe. Da ich allerdings eine flexible Deklaration verwenden will, bin ich mit meinem Latein am Ende. Wenn also irgendwer eine Idee hat, wär ich sehr dankbar!
    Patrick



  • Habe gerade mal versucht, this->aut mit einem beliebigen Wort zu initialisieren => gibt man ein festes Wort ein, funktioniert die Ausgabe wie gewünscht, weise ich allerdings den Inhalt von puffer zu, produziert er wie erwähnt, nur Quatsch. Hat also wahrscheinlich was mit der Variablendeklaration zu tun. Kann es sich um ein Problem der Aus - oder Weitergabe von Pointern auf Chars handeln? Wenn ja, wie löse ich dieses Problem am Besten?
    MfG, Patrick



  • Hi,

    ich weiss gerade gar nicht, ob ich dein Problem überhaupt richtig verstanden habe, aber immer wenn ich char[5000], strcpy oder sowas in Verbindung mit C++ sehe, frag ich mich, ob da nicht ein std::string angebrachter wäre.



  • CarstenJ schrieb:

    Hi,

    ich weiss gerade gar nicht, ob ich dein Problem überhaupt richtig verstanden habe, aber immer wenn ich char[5000], strcpy oder sowas in Verbindung mit C++ sehe, frag ich mich, ob da nicht ein std::string angebrachter wäre.

    Ich verwende das char[500], weil ich die Daten Zeichen für Zeichen einlesen möchte . Das hat den Vorteil, dass ich die Strings mit '\0' abschließen und dann in dieser Form weiterverarbeiten kann. Ist denn ein solches Einlesen mit Strings überhaupt möglich und kann ich auch bei string - variablen das Stringende - Zeichen verwenden?



  • Hi,

    du kannst soviel in einen String einlesen wie du magst, ohne dabei selber Speicher reservieren zu müssen. Diese werden aber nicht durch \0 abgeschlossen. Sobald du aber an irgendeiner Stelle ein char* benötigst, erhälst du das durch die Memberfunktion c_str(). Damit ersparst du dir sämtliche malloc, new und sonstwas aufrufe, musst dich nicht mit der korrekten Speicherreservierung bzw. -Freigabe auseinandersetzen, hast eine intuitivere Syntax und musst auch keine (teilweise unsicheren) C-Funktionen benutzen.



  • Dann hab ich noch eine Frage, bevor ich mein gesamtes Programm auf string umstelle:
    Werden strings ähnlich wie chars in arrays organisiert, und überschreibt das Programm beim zeichenweisem Einlesen die vorher eingelsesen Zeichen?



  • Hi,

    ja, im Grunde handelt es sich um ein dynamisch erweiterbares Array.

    und überschreibt das Programm beim zeichenweisem Einlesen die vorher eingelsesen Zeichen?

    Noe, wobei ich natürlich nicht weiss, die du Daten einliest.



  • PatrickWG schrieb:

    Werden strings ähnlich wie chars in arrays organisiert...

    das ist davon abhängig wie's implementiert ist. gut wär's schon, wenn alle zeichen nacheinender im speicher liegen, aber ich würd' mich nicht drauf verlassen.



  • Mit Strings funktionierts einwandfrei!
    Herzlichen Dank für eure Hilfe!
    Patrick


Anmelden zum Antworten