Text in einem bestimmten Abschnitt eines anderen Textes einfügen. C++



  • Hast du beide Texte in std::string gespeichert?
    Dann einfach mit der Memberfunktion insert und find (mit newline).



  • Ich habe jetzt gesucht und gegoogelt und habe dann diesen Code hier gefunden.

    Jetzt muss ich noch mit find() basteln … geht das auch mit einem char array ?.
    (wie gesagt ich bin Anfänger 😃 (Learning by Doing) )

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main (void)
    {
    	char line[25000];
    	ifstream infile ("test.txt", ios::in);
    
    	if(!infile)
        {
    		cout << "Fehler" << endl;
    
    	}
    	while (infile.getline (line, 25000))
    	{
    
    		cout << line << endl;
    	}
    	cout << endl;
    
    return 0;
    }
    


  • #include <fstream>
    #include <iterator>
    #include <string>
    
    int main()
    {
        // Einlesen
        std::istream_iterator<char> end_of_file;
    
        std::ifstream file1("file1.txt");
        std::string text1(std::istream_iterator<char>(file1), end_of_file);
    
        std::ifstream file2("file2.txt");
        std::string text2(std::istream_iterator<char>(file2), end_of_file);
    
        // Stelle finden
        std::size_t insert_at = text1.find("something");
    
        // Einfügen
        text1.insert(insert_at, text2);
    
        return 0;
    }
    


  • Danke schön 🙂

    Nachdem ich dem Code berarbeitet habe , kommt das wenn ich es ausführe… (Linux - Ubuntu 12.04 64Bit) :

    terminate called after throwing an instance of 'std::out_of_range'
      what():  basic_string::insert
    Abgebrochen (Speicherabzug geschrieben
    
    #include <fstream> 
    #include <iterator> 
    #include <string> 
    #include <iostream>
    using namespace std;
    
    int main() 
    { 
        // Einlesen 
        istream_iterator<char> end_of_file; 
    
        ifstream file1("file1.txt"); 
        string text1(istream_iterator<char>(file1), end_of_file); 
    
        ifstream file2("file2.txt"); 
        string text2(istream_iterator<char>(file2), end_of_file); 
    
        // Stelle finden 
        size_t insert_at = text1.find("2"); 
    
        // Einfügen 
        text1.insert(insert_at, text2); 
    
        //ausgeben
        cout << "Ausgabetext>\n" << text1 << endl;
    
        fstream ausgabe;
        ausgabe.open("test-aus.txt", ios::out);
        ausgabe << text1 << endl;
        ausgabe.close();
    
        return 0; 
    }
    


  • Überprüfen mal insert_at auf std::string::npos.
    Das wird gesetzt, wenn das nicht gefunden wird.
    Generell könntest du auch die ifstreams überprüfen.
    Man öffnet Dateien übrigens im Ktor und lässt sie vom Dtor schließen, nutzte nicht manuell .close(), außer du willst die Datei erneut öffnen.



  • Nathan schrieb:

    #include <fstream>
    #include <iterator>
    #include <string>
    
    int main()
    {
        // Einlesen
        std::istream_iterator<char> end_of_file;
    
        std::ifstream file1("file1.txt");
        std::string text1(std::istream_iterator<char>(file1), end_of_file);
    
        std::ifstream file2("file2.txt");
        std::string text2(std::istream_iterator<char>(file2), end_of_file);
    
        // Stelle finden
        std::size_t insert_at = text1.find("something");
    
        // Einfügen
        text1.insert(insert_at, text2);
    
        return 0;
    }
    

    Hier werden die Zeilenumbrüche nicht berücksichtigt.
    Das liegt anscheinend an dem ifstream?!



  • int main()
    {
        // Einlesen
        std::istream_iterator<char> end_of_file;
    
        std::ifstream file1("file1.txt");
    	std::string text1(std::istream_iterator<char>(file1>>std::noskipws), end_of_file);
    
        std::ifstream file2("file2.txt");
        std::string text2(std::istream_iterator<char>(file2>>std::noskipws), end_of_file);
    
        // Stelle finden
        std::size_t insert_at = text1.find("something");
    
        // Einfügen
        text1.insert(insert_at, text2);
    
        return 0;
    }
    


  • Nathan schrieb:

    Überprüfen mal insert_at auf std::string::npos.
    Das wird gesetzt, wenn das nicht gefunden wird.

    Wie schaffe ich das denn ?



  • MarvinH schrieb:

    Nathan schrieb:

    Überprüfen mal insert_at auf std::string::npos.
    Das wird gesetzt, wenn das nicht gefunden wird.

    Wie schaffe ich das denn ?

    insert_at != std::string::npos



  • MarvinH schrieb:

    Nathan schrieb:

    Überprüfen mal insert_at auf std::string::npos.
    Das wird gesetzt, wenn das nicht gefunden wird.

    Wie schaffe ich das denn ?

    Ein Vergleich? 😮 insert_at == std::string::npos .

    Sieh auch die Dokumentation zu std::basic_string<>::find .

    Edit: Bzw. auf Ungleichheit prüfen, je nach dem.



  • … aber npos gibt doch die maximale länge von size_type an.

    Wieso sollte ich das dann mit dem Pointer "insert_at" vergleichen ?



  • MarvinH schrieb:

    … aber npos gibt doch die maximale länge von size_type an.

    Wieso sollte ich das dann mit dem Pointer "insert_at" vergleichen ?

    Lies bitte die Dokumentation. Du machst es schwer uns zu helfen, wenn du nicht auf uns hörst.
    Der Rückgabewert von string::find ist kein Zeiger, sondern - falls das Zeichen gefunden wurde - die Position, sonst std::string::npos .

    Das hätte dir aber eben auch die Referenz verraten.

    Return value: position of the first character of the found substring or npos if no such substring is found.



  • Sone schrieb:

    MarvinH schrieb:

    … aber npos gibt doch die maximale länge von size_type an.

    Wieso sollte ich das dann mit dem Pointer "insert_at" vergleichen ?

    Lies bitte die Dokumentation. Du machst es schwer uns zu helfen, wenn du nicht auf uns hörst.
    Der Rückgabewert von string::find ist kein Zeiger, sondern - falls das Zeichen gefunden wurde - die Position, sonst std::string::npos .

    Das hätte dir aber eben auch die Referenz verraten.

    Return value: position of the first character of the found substring or npos if no such substring is found.

    Ohh danke … ich habe den Fehler gefunden.

    Der Marker … also das was gefunden werden soll , war nicht vorhanden … deswegen gab es diese Fehlermeldung.

    Ich danke für die mühen.


Anmelden zum Antworten