String-Problem
-
Ausgangslage:
Ich habe eine Textdatei welche pro Zeile jeweils zwei Wörter enthält,
ich benötige jedoch nur das jeweils zweite Wort. Um die Textdatei von
Hand zu editieren bzw. auf jeder Zeile das erste Wort zu löschen bedürfte
es ungefähr ein Jahr. Wie könnte ich mir mit einem C++ Programm aushelfen?Skizze:
- Zeile auslesen (Zwei Wörter, getrennt durch Leerschlag)
- Stelle herausfinden an der das zweite Wort beginnt
- Von dieser Stelle bis zum Zeilenanfang Inhalt löschen
- Übrig bleibt das zweite Wort
Danke für eure Hilfe
-
Wie sieht denn dein Ansatz bisher aus?
-
alberto2000 schrieb:
...Wie könnte ich mir mit einem C++ Programm aushelfen?...
Eins schreiben, kompilieren&linken und dann ausführen.
Ich würde aber nicht "bis zum Zeilenanfang Inhalt löschen", weil das bei dem (in C++ aber nicht nur da) üblichen Verständnis von Dateien gar nicht geht.
Stattdessen einfach eine Input- und eine Outputdatei:Skizze:
- Zeile aus Inputdatei auslesen (Zwei Wörter, getrennt durch Leerschlag)
-
- Wort auslesen, 2. Wort auslesen
-
- Wort mit Zeilenumbruch in Outputdatei schreiben
- zurück zu 1.) bis Inputdatei zuende
Gruß,
Simon2.
-
Du solltest dir vllt nicht einfach someinen fertigen code liefern lassen sondern dich mit C++ auseinandersetzen ich selbst bin auch ein anfänger aber ich kanndir so ca. an ein wenig code zeigen wies aussehen könnte:
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main(int argc, char *argv[]) { //Datei einlesen int a = 0; int b = //Anzahl der Zeilen des Texte //In der Zeile: do { string c = //z.B. erste Zeile int d = c.find(" "); c.erase(0,d); a= a+1; }while( a <= b);//Alle Zeilen durch gehen system("PAUSE"); return EXIT_SUCCESS; }natürlich nur so ca. und auch mit meinen wenigen Kentnissen.
lg
Walter
-
#include <fstream> #include <string> #include <vector> int main() { fstream in, out; in.open("input.txt", ios::in); vector<string> datei; string buffer; while ( !in.eof() ) { getline(in, buffer); datei.push_back(buffer); } int i, stelle; for(i = 0; i < datei.size(); ++i) { stelle = datei[i].find(" "); datei[i].erase(0, stelle); } out("output.txt", ios::out); for(i = 0; i < datei.size(); ++i) out << datei[i] << "\n"; system("PAUSE"); return 0; }nicht perfekt aber ok
(mir war langweilig, aber Walter hat recht, beschäftige dich etwas mit c++ dann ist das eifnach)
-

int i, stelle; for(i = 0; i < datei.size(); ++i) { ... } ... for(i = 0; i < datei.size(); ++i) ...Wer schreibt den noch sowas?!
-
#include <fstream> #include <string> #include <sstream> int main() { std::ifstream in std::ofstream out; in.open("input.txt"); out.open("output.txt"); std::string buffer; while (getline(in, buffer)) { std::istringstream iss(buffer); string wort; if(iss >> wort >> wort) { out << wort << std::endl; } } return 0; }
-
drakon schrieb:

int i, stelle; for(i = 0; i < datei.size(); ++i) { ... } ... for(i = 0; i < datei.size(); ++i) ...Wer schreibt den noch sowas?!
wie kann mans denn noch schreiben?
ok mit iteratoren...
aber wie mit relativ eifnachen mitteln?
-
Skym0sh0 schrieb:
wie kann mans denn noch schreiben?
ok mit iteratoren...
aber wie mit relativ eifnachen mitteln?Man kann jedenfalls sicher beide
for-Schleifen kombinieren. Also Wort lesen und Ausgabe zugleich. Allerdings ist es, wie evilissimo gezeigt hat, sogar mit einer einzigen Schleife möglich. Einlesen, Wort lesen, Ausgabe zugleich.Naja, allerdings wollte drakon glaub ich nicht darauf hinaus, sondern auf die Art, wie du deine
for-Schleifen schreibst. Also dasint i;ausserhalb derfor-Schleife. Das war früher mal so, heute muss man dies nicht mehr machen. Also das sollte so aussehen:
for(int i = 0, size = datei.size(); i < size; ++i)Aber ist sicherlich auch Geschmacksache

Bei Integer nehme ich es auch rein, bei Iteratoren mache ich die Sache ausserhalb.Grüssli
-
Muss es c++ sein?
Also über die Shell geht das viel einfacher z.B. mit"awk '{print $2}' winput.txt > woutput.txt"
Für solche Sachen ist c++ nicht wirklich geeignet.
-
vielen Dank für eure Hilfe!