Tabs und führende Leerzeichen eines std::string löschen



  • Hallo,

    ich lese eine Datei in einen ifstream ein übergebe dann jede fileline als string an eine Funktion, um Kommentare zu löschen.
    Das ganze funktioniert leider bisher suboptimal bis gar nicht. Es kompiliert zwar und läuft auch durch, in cout sieht man noch alle Tabs und Leerzeichen. Mein Code ist:

    #include <boost/algorithm/string/predicate.hpp>
    #include <boost/lexical_cast.hpp>
    #include <string>
    #include <algorithm>
    
    ifstream file ("path to file");
    if (file.is_open()) {
        std::cout << "file opened correctly" << std::endl;
      } else {
        std::cerr << "error while opening file" << std::endl; return 0;
      }
    
    while(!file.eof()){
        	  std::string fileline;
        	  getline(file, fileline);
        	  cout<<fileline<<endl;
        	  fileline.erase(remove(fileline.begin(), fileline.end(), '\t'), fileline.end());
        	  cout<<fileline<<endl;
        	  trim(fileline);
        	  cout<<fileline<<endl;
        	  if(boost::starts_with(fileline, "//")){
    //    	  std::string comm_test = "//";
    //    	  if(fileline.compare(0, comm_test.length(), comm_test) == 0) {
        		  std::cout << "Comment seen and ignored" << std::endl;
        	  } 
          }
    
    void trim(string& str)
    	{
    	  string::size_type pos = str.find_last_not_of(' ');
    	  if(pos != string::npos) {
    	    str.erase(pos + 1);
    	    pos = str.find_first_not_of(' ');
    	    if(pos != string::npos) str.erase(0, pos);
    	  }
    	  else str.erase(str.begin(), str.end());
    	}
    

    Kann mir jemand sagen, warum das so gar nicht funktioniert?

    Herzlichen Dank im Vorraus!!



  • Ich habe zwar keine Ahnung was das da werden soll, aber führende Leerzeichen kannste mit

    #include <cctype>
    #include <algorithm>
    #include <iostream>
    #include <string>
    
    void remove_leading_spaces(std::string& s)
    {
      auto pred = static_cast<int (*) (int)>(std::isspace);
      auto i = std::find_if_not(s.begin(), s.end(), pred);
      s.erase(s.begin(), i);
    }
    
    int main()
    {
      std::string s = "    \t\t   Hallo, Welt!";
      remove_leading_spaces(s);
      std::cout << s << '\n';
    }
    

    löschen.



  • cooky451 schrieb:

    GCC

    Du verwendest GCC? Seit wann? 😃



  • 314159265358979 schrieb:

    cooky451 schrieb:

    GCC

    Du verwendest GCC? Seit wann? 😃

    Seit ich Ideone für solche Kleinigkeiten nutze. 😉



  • @JRS
    Wenn do sowieso schon die Boost verwendest, wieso dann nicht gleich auch trim (bzw. trim_left ) aus der Boost?

    http://www.boost.org/doc/libs/1_49_0/doc/html/string_algo/reference.html#header.boost.algorithm.string.trim_hpp



  • Hallo nochmal,

    danke für die super schnelle Antwort.
    Also, was ich vor habe:

    ifstream file;
    remove_comments(file);
    

    Hierbei sollen alle Zeilen, die mit "//" anfangen aus dem stream gelöscht werden. Das will ich eigentlich über eine If Anfrage machen

    while(!file.eof){
    iostream processed;
    getline(file, fileline);
    if(boost::starts_with(fileline, "//")){
    //do nothing
    } else {
    processed << fileline;
    }
    }
    

    Aber die Abfrage funktioniert bei mir nicht. Daher dachte ich, den string erst zu trimmen. Das ging dann mit den Whitespaces ganz gut, aber anscheinend nicht mit dem Tabs.

    Naja ich versuche es mal mit boost::trim

    Danke


Anmelden zum Antworten