Character in String suchen und löschen?



  • ja, das ist super, vielen Dank!!

    funktioniert wunderbar.

    Wie man hier sieht:

    while (file.good() && std::getline(file, buf, ';' ))
    

    ... wird die Textdatei in den buf-string eingelesen immer bis zum semikolon. Die Anzahl der Durchläufe dieser while-Schleife wird also durch die Anzahl der Semikolons im File bestimmt.
    Jetzt ist das Problem das ich vorher nicht weis wieviele Strings das werden. Ich müsste jetzt jedesmal nachdem ich die Tabs und Zeilenumbrüche aus "buf" rausgeschmissen habe den String irgendwie irgendwo dynamisch speichern. Jeden einzeln in einen seperaten String. Wie könnte ich das am besten anstellen? Hat da jemand einen Rat für mich!?



  • std::vector eventuell ?



  • CodeFinder schrieb:

    Hm gibt verschiedene Möglichkeiten...Du könntest auch mit der Methode find arbeiten, glaube aber, das ist schneller:

    for(std::string::size_type i = 0; i < buf.length(); i++)
       if(buf[i] == '\n' || buf[i] == '\t')
          buf.erase(i, 1);
    

    remove_copy_if böte sich auch an.

    buf.assign(buf.begin(), remove_copy_if(buf.begin(), buf.end(), buf.begin(), static_cast<int(*)(int)>(isspace));
    


  • Dann könnte man auch noch kürzeren Code mit remove_if schreiben (da Quelle und Ziel identisch sind):

    buf.erase(remove_if(buf.begin(), buf.end(), static_cast<int(*)(int)>(isspace)), buf.end());
    


  • RunSeb schrieb:

    ja, das ist super, vielen Dank!!
    funktioniert wunderbar.

    Es gibt noch \r \v \b \f usw.
    Es können mehrere hintereinander stehen: \n\n\n\t\t\t

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string str = "\n\n\n\t\t\t\fH\v\ne\tl\nl\to\b \n\tW\n\no\trl\td";
    	cout << str << endl;
    	for ( int i = 0; i < str.size(); i++ )
    	{
    		if ( str.at(i) < ' ' )
    		{   // Entfernt alle nicht druckbaren Zeichen ( bis ASCII 31(dez) )
    			str.erase(i,1); i -= 1;
    		}
    	}
    	cout << str << endl;
    	return 0;
    }
    

    😉



  • jap, das geht.

    Jetzt will ich wenn ein Tabulator gefunden wird den mit einem Leerzeichen ersetzen.

    Funktioniert das mit replace(...) ?? Wenn ja wie?

    So gehts nicht, komme mit den Parametern nicht klar!

    if ( buf.at(i) < ' ' )
    {   
    	buf.replace(i,'\n'); 
            i -= 1;
    }
    


  • Um ein Zeichen zu ersetzen, brauchst du einfach

    buf[i] = '\n'; \\ (oder ' ' denn das ist ein Leerzeichen -)
    

    zu schreiben.

    P.S Die Anweisung 'i -= 1' ist überflüssig bei dir, da du damit ja noch mal dieselbe Position (in der nicht geposteten Schleife) abarbeiten würdest.



  • Ja, danke, ich habs dann doch schon mit replace hinbekommen gehabt:

    replace(buf.begin(), buf.end(), '\t', ' ');
    

    Th schrieb:

    P.S Die Anweisung 'i -= 1' ist überflüssig bei dir, da du damit ja noch mal dieselbe Position (in der nicht geposteten Schleife) abarbeiten würdest.

    Nein ich glaube nicht, da bei mir auch mehrere Tabulatoren gelöscht werden sollen die im STring hintereinander stehen. Wenn ich das weglasse werden nicht alle gelöscht. Wenn er einen Tabulator z.B. findet löscht er den und rückt den String quasi von hinten auf. Steht an der nächsten Stelle wieder ein Tab dann übersieht er den dann sonst.



  • CodeFinder schrieb:

    std::vector eventuell ?

    Ich bekomme 4 komische Warnungen wenn ich die strings in ein std::vector ablegen will. 😞

    #include <vector>
    
    std::vector<string> gl;
    std::ifstream file(strFile);
    std::string buf;
    
    if (!file.is_open()) { throw "Error loading File"; }
    while (file.good() && std::getline(file, buf, ';' ))
    {
         gl.push_back( buf ); 
    }
    

    1.: warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_
    traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Inf
    ormationen reduziert

    2 : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits
    <char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduzie
    rt

    3 : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
    vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt

    4 : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
    ~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt

    😮 😕

    Weis jemand was das ist und/oder was ich falsch mache und wie es richtig geht?
    THX



  • Das sind Warnungen, die du im Normalbetrieb ignorieren kannst. Der Debugger von MSVC kommt nicht mit zu langen Bezeichnern klar, deswegen werden diese Namen für ihn etwas gekürzt.

    (und die genannten Ungetüme kommen heraus, wenn du vector<string>::reverse_iterator oder den Ctor von vector<string> mit ihrem vollen Namen nennst)


Anmelden zum Antworten