Hilfe bei Eingabe



  • Hallo,

    kann mir bitte jemand kurz den folgenden VB-Code in C++ konvertieren?

    If InStr(MyText, vbCrLf) Then
        Dim MyArray As Array = Split(CSSTicketText, vbCrLf)
        For x As Integer = 0 To UBound(MyArray)
          	MsgBox(MyArray(x))
        Next
    End If
    

    Ziel: Ich möchte bei einer Eingabe prüfen ob Zeilenumbrüche vorhanden sind und wenn ja die Eingabe zeilenweise in ein Array schreiben.

    Danke schonmal und Gruss


  • Mod

    Sowas? Ist nicht 100% das gleiche, weil ich etwas flexiblere C++-Datenstrukturen anstatt Arrays benutzt habe. Irgendwie ist mir der Sinn solch einer Funktion nicht ganz klar, aber es macht das was du beschrieben hast:

    // Required:
    #include<string>
    #include<sstream>
    
    // Just for the example:
    #include<iostream>
    #include<vector>
    #include<list>
    
    // Splits a string into substrings separated by newline characters. 
    // Returns true if substrings were found, returns false if the string did not contain any newline characters
    // The substrings are appended to the container output
    template<typename T> bool split_string(const std::string& input, T& output)
    {
      if (input.find('\n')==std::string::npos) return false;  // input does not contain newlines
      std::istringstream parser(input);
      std::string substring;
      while (getline(parser,substring)) output.push_back(substring);
      return true;
    }
    
    int main()
    {
    
      std::string with_newlines="This is\nan example.\nHello\nWorld!";
      std::string without_newlines="This string does not conatain newlines";
    
      std::vector<std::string> example_container1;
      std::list<std::string> example_container2;   // The type of container does not matter
    
      split_string(with_newlines, example_container1);
      split_string(without_newlines, example_container2);
    
      std::cout<<"Container1 contains the following substrings:"<<std::endl;
      for(std::vector<std::string>::iterator i=example_container1.begin(); i!=example_container1.end();++i) std::cout<<*i<<std::endl;
    
      std::cout<<"Container2 contains the following substrings:"<<std::endl;
      for(std::list<std::string>::iterator i=example_container2.begin(); i!=example_container2.end();++i) std::cout<<*i<<std::endl;
    }
    

    Ausgabe des Beispiels:

    Container1 contains the following substrings:
    This is
    an example.
    Hello
    World!
    Container2 contains the following substrings:
    


  • Geht das nicht einfacher? Sorry, komme aus der VB-Welt.

    Das Problem ist, ich habe eine Consolenapplikation geschrieben in C++ "geerbt". Dieser Applikation kann man per Commandline Parameter übergeben die dann an eine weitere Applikation weitergegeben werden sollen. Diese kann aber mit Zeilenumbrüchen nichts anfangen und akzeptiert nur eine Zeilenlänge von jeweils 70 Zeichen.

    Als Option für die Parameterübergabe besteht die Möglichkeit, den Input als Textdatei zu übergeben oder als direkte Eingabe. Bei der Übergabe über eine Textdatei existiert bereits eine Routine die den Inhalt der Textdatei auseinandernimmt und zeilenweise weiterreicht, nur bei der direkten Eingabe fehlt mir die Routine, d.h. es funktioniert im Moment nur mit einzeiliger Eingabe ohne Zeilenumbrüche.

    Hier der Code:

    string ltext_data = GetParameter(argc, argv, "-l", "<no text>");
        if (ltext_data[0] == '@')    // read from file
        {
          string filename = ltext_data.substr(1);
          ifstream lfile(filename.c_str());
          if (!lfile.is_open())
          {
            cerr << "cannot open file for read (" << filename << ")" << endl;
            return 1;
          }
          while (!lfile.eof())
          {
            string str;
            getline(lfile, str);
            while (str.length() > 70)
            {
              ltext_line = str.substr(0, 70);
              ltext_table.push_back(&ltext);
              str = str.substr(70);
            }
            ltext_line = str;
            ltext_table.push_back(&ltext);
          }
        }
        else
        {
    		ltext_line = ltext_data;
    		ltext_table.push_back(&ltext);
        }
    

  • Mod

    TheNewbie4711 schrieb:

    Geht das nicht einfacher? Sorry, komme aus der VB-Welt.

    Klar, aber da du dich in deinem ersten Beitrag so geheimnisvoll ausgedrückt hast, habe ich mich so allgemein wie möglich gehalten.

    Das Problem ist, ich habe eine Consolenapplikation geschrieben in C++ "geerbt". Dieser Applikation kann man per Commandline Parameter übergeben die dann an eine weitere Applikation weitergegeben werden sollen. Diese kann aber mit Zeilenumbrüchen nichts anfangen und akzeptiert nur eine Zeilenlänge von jeweils 70 Zeichen.

    Als Option für die Parameterübergabe besteht die Möglichkeit, den Input als Textdatei zu übergeben oder als direkte Eingabe. Bei der Übergabe über eine Textdatei existiert bereits eine Routine die den Inhalt der Textdatei auseinandernimmt und zeilenweise weiterreicht, nur bei der direkten Eingabe fehlt mir die Routine, d.h. es funktioniert im Moment nur mit einzeiliger Eingabe ohne Zeilenumbrüche.

    Designfehler. Nimm den gleichen Code für beide Fälle. Arbeite dazu mit allgemeinen istreams und übergib jeweils den konkreten Stream an die Splitfunktion.

    P.S.: außerdem hat mein Splitter viel weniger Code als der alte, kann dabei aber mehr 🙂



  • Ich finds SeppJ's Lösung schick 😃



  • Sorry Jungs, aber ich hab null Plan von C++.
    Gehts nicht ein bisserl anfängerkonformer? 🙂

    Wie kann ich Seppl's Lösung bei meinem Code einbauen?

    Template, Vector, Container = Bahnhof, Koffer, Abfahrt.
    Ich hab massive Probleme den Code zu lesen..


  • Mod

    Ich kann dir Tipps geben, aber ich kann nicht das ganze Projekt für dich coden (zumindest nicht ohne Geld zu sehen). Bei einem kleinem Programm könnte man das noch machen, aber du musst schon genügend Grundwissen besitzen um die Antworten zu verstehen, wenn du Fragen zu einem Großprojekt hast. Dazu brauchst du noch nicht einmal wissen, was Templates sind, aber du solltest zumindest verstehen was eine Funktion ist und wie man sie einsetzt. Ich kann nicht dein ganzes Programm durchlesen und nach den richtigen Stellen zum Einbau suchen, da musst du selber wissen, was du wo brauchst.



  • TheNewbie4711 schrieb:

    Sorry Jungs, aber ich hab null Plan von C++.
    Gehts nicht ein bisserl anfängerkonformer? 🙂

    Wie kann ich Seppl's Lösung bei meinem Code einbauen?

    Template, Vector, Container = Bahnhof, Koffer, Abfahrt.
    Ich hab massive Probleme den Code zu lesen..

    Für das Problem gibts ziemlich genau zwei Lösungen:

    1. Du lässt es von jemandem lösen, der C++ bereits genügend gut kann. Wie Sepp angedeutet hat wird das höchstwahrscheinlich niemand aus Gutherzigkeit für dich erledigen, sprich, es wird dich etwas kosten.
    2. Du löst das Problem selber - dann führt allerdings nichts daran vorbei, dir zuerst die nötigen Grundlagen anzueignen.


  • Ich erwarte ja nicht das du für mich codest, aber da ich wie bereits erwähnt keine C++ Erfahrung habe, wäre es nett gewesen, wenn du kurz etwas zu deinem Code als Erklärung hinzugefügt hättest.

    Ich weiss was eine Funktion ist, aber ich weiss eben nicht was ein Template ist und ich weiss nicht was es mit den Containern auf sich hat.

    Mit dem Wissen wäre mir doch schon weitergeholfen. Den Rest kann ich mir danach selbst erarbeiten.


  • Mod

    Wie man die Funktion benutzt habe ich ja Extra als Beispiel noch mit dazu geschrieben. Ich weiß aber nicht, ob diese Funktion wirklich genau das macht, was du willst, da ich ehrlich gesagt immer noch nicht verstehe, was das gane überhaupt soll. Aber sie passt jedenfalls 100% zu meiner Interpretation deiner ersten Frage "Ziel: Ich möchte bei einer Eingabe prüfen ob Zeilenumbrüche vorhanden sind und wenn ja die Eingabe zeilenweise in ein Array schreiben.".

    TheNewbie4711 schrieb:

    Ich weiss was eine Funktion ist, aber ich weiss eben nicht was ein Template ist und ich weiss nicht was es mit den Containern auf sich hat.

    Ich gebe dir nun die wichtigste Lektion deines Lebens: Was tun, wenn man Fachwörter nicht versteht?

    Schritt 1: Google
    http://lmgtfy.com/?q=c%2B%2B+template
    http://lmgtfy.com/?q=c%2B%2B+container

    Schritt 2: Gibt es nicht.


Anmelden zum Antworten