Text in einem bestimmten Abschnitt eines anderen Textes einfügen. C++
-
Hast du beide Texte in
std::stringgespeichert?
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 vonstring::findist kein Zeiger, sondern - falls das Zeichen gefunden wurde - die Position, sonststd::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 vonstring::findist kein Zeiger, sondern - falls das Zeichen gefunden wurde - die Position, sonststd::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.