String aus Char Array extrahieren



  • Hallo,

    ich freue mich, hier registriert zu sein. Seit kurzem programmiere ich in C/C++ und ich fühle mich recht wohl darin.

    Ich habe auch eine konkrete Frage dazu. Ich lasse eine Textdatei von meinem Programm in ein Char Array einlesen, das Array ist ca. 23000 Zeichen lang. Dannach wird das Array manipuliert und bearbeitet durch das Programm. Das klappt auch 😉

    Nun kommt der Teil, der nicht klappt:
    Und zwar schaut der Char Array wie folgt aus:

    ZeichenZeichenZeiche\n
    ZeichenZeichenZeichenZeichen\n
    ...

    Am Anfang der Zeilen steht '>', und am Ende der Zeile steht '\n'. Ich will alle Zeichen des Char Array zwischen '>' und '\n' für alle diese Zeilen des Arrays in einen eigenen Char Array kopieren, um die Zeilen voneinander zu separieren.

    Bisher versuche ich per for-Schleife über den Array zu gehen, das klappt auch. Ich mache aber schon eine Weile daran rum, den String effektiv zu extrahieren. Das will einfach nicht klappen...

    Hat jemand eine Idee? Danke!!!



  • Was spricht eigentlich dagegen, die Datei von vornherein zeilenweise einzulesen und zu verarbeiten? (Stichwort: getline())
    Ansonsten könnte dir auch std::find() helfen.



  • Ich persönlich hätte es so geregelt:
    Statt in einzelne char-arrays zu kopieren, würde ich allerdings einen std::vector empfehlen.

    #include <vector>
    #include <string>
    #include <cstring>
    
    void Lese(const char* cArray, std::vector<std::string>& strings)
    {
    	if(!strings.empty())
    		strings.clear();
    	if(cArray == NULL) return;
    	const char *first = cArray, *last;
    	for(;;++first)
    	{
    		first = std::strchr(first, '>');
    		if(first == NULL) return;
    		last = std::strchr(first+1, '\n');
    		if(last == NULL) return;
    		strings.push_back(std::string(first+1, last));
    	}
    }
    

    std::strchr sucht zunachst nach dem buchstaben, danach kann man den string kopieren, wobei die Endlosschleife so lang läuft, bis strchr einmal NULL liefert, also keinen buchstaben mehr findet. Ausgegeben habe ich es so:

    char str[] = {
    	">String1\n"
    	">String2\n"
    	">String3\n"
    	">String4\n"
    	">String5\n"
    	">String6\n"
    };
    
    int main()
    {
    	std::vector<std::string> vec;
    	Lese(str, vec);
    	for(std::vector<std::string>::iterator it=vec.begin();it!=vec.end();++it)
    		cout << '-' << *it << endl;
    }
    

    Ich würde aber zum auslesen der datei auch empfehlen,in einen String zu lesen, statt in ein char-array. Lese() sähe dabei auch kaum anders aus:

    void Lese(const std::string& str, std::vector<std::string>& strings)
    {
    	if(!strings.empty())
    		strings.clear();
    	if(str.empty()) return;
    	std::size_t first = 0, last;
    	for(;;)
    	{
    		first = str.find('>', first);
    		if(first==std::string::npos) return;
    		last = str.find('\n', first);
    		if(last==std::string::npos) return;
    		++first;
    		strings.push_back(str.substr(first, last-first));
    	}
    }
    

    Oder man kann wie schon erwähnt zeilenweise lesen und einfach den ersten buchstaben abschneiden.


Log in to reply