Habe Zeilen weise kopieren möchte Zeichenweise kopieren einer Datei!
-
Hallo alle zusammen,
Ich habe mir gestern ein source geschrieben, der den Inhalt einer Datei in eine andere neu angelegte Datei kopiert. Der Kopiervorgang geht Zeilenweise...
Leider habe ich festgestellt die Formatierung hat nicht so richtig hin mit den Leerzeichen und bei Zeilenweise einlesen ist die Abfrage halt schwieriger... Ich möchte es nun Zeichenweise einlesen damit ich die Abfragen dem entsprechend einfacher Programmieren kann...
Thanks im voraus....
//Erstelle Kopie von asc datei mit dem typ lst std::ifstream read(directory1); std::ofstream write( "kopiemitKeyword.lst" ); std::string line; while (std::getline( read, line ) && line!="*NET*"); write <<"*Kopie*"<<std::endl<<std::endl; write <<"*Test*"<<std::endl<<std::endl; while ( !read.eof() ) { std::getline(read, line); if(line == "*Keyword*"){ // Problem ist auch die If abfrage funktioniert nicht da Zeilenweise eingelesen //wird und der das Wort *Keyword+ nicht findet write <<' \n'; write << line<<std::endl; } else write << line<<std::endl; } write.close(); read.close();
-
Zeichenweise kopieren:
{ std::ifstream read(directory1); std::ofstream write( "kopiemitKeyword.lst" ); for( std::string line; std::getline( read, line ) && line!="*NET*"; ) ; write <<"*Kopie*"<<std::endl<<std::endl; write <<"*Test*"<<std::endl<<std::endl; read >> std::noskipws; // Leerzeichen mitlesen const std::string key = "*Keyword*"; std::string::const_iterator idx = key.begin(); std::string buffer; for( char c; read >> c; ) { if( c == *idx ) { buffer += c; if( ++idx == key.end() ) { // -- Key erkannt write << "\n" << buffer; buffer.clear(); idx = key.begin(); } } else { if( !buffer.empty() ) { write << buffer; buffer.clear(); idx = key.begin(); } write << c; } } write << buffer; // ggf. Rest kopieren }Das 'close' am Ende kannst Du weglassen, packe das Ganze lieber in einen Scope.
Gruß
Werner
-
Hallo Werner,
Vielen Dank ... Also es läuft jetzt so zwar immer noch wie vorher! Aber es macht keine Leerzeile vor dem Keyword ? Oder ist das mit absicht geweseen...
die ausgabe ist immer noch
*Keyword* asdf
wdf23 dfsa
*Keyword* asdf
wdf22 gava2anstatt:
*Keyword* asdf
wdf23 gsdf*Keyword* asdf
wdf22 gava2.........hmmmm
-
Pack doch einfach noch ein "\n" davor...
-
Ich glaube ich bin langsam Blind ...... wo soll ich denn ein \n oder std::endl vor packen ?
-
undercover schrieb:
Also es läuft jetzt so zwar immer noch wie vorher! Aber es macht keine Leerzeile vor dem Keyword ?
Mein Code macht genau einen (!) Zeilenumbruch vor dem Keyword. Wenn Du mehr willst, einfach mehr hinzufügen ..
// -- Key erkannt (Zeile 20 s.o.) write << "\n\n\n" << buffer; // drei mal newline einfügenGruß
Werner
-
undercover schrieb:
Ich glaube ich bin langsam Blind ...... wo soll ich denn ein \n oder std::endl vor packen ?
Da wo der Kommenatr steht (deshalb steht er da!) in Zeile 21

-
sorry, hatte selber einen Tippfehler! Hatte es abgetippt gehabt und dabei was verschrieben! VIELEN DANK!

-
Ihr könntet mir aber noch bei einer Sache helfen dann wäre ich vollkommen glücklich mit euch
und zwar ich möchte bei allen strings die NICHT mit dem keyword beginnen zwischen den Strings genau 6 Weitere Leerzeichen bzw. insgesamt 7 leerzeichen!Hättet ihr da noch ne kleine hilfe für mich

-
Puh - was meinst Du mit 'Strings' - sind das Worte?
Ich verstehe das so, dass aus"Das ist ein Text"ein
" Das ist ein Text"wird - ist das so gemeint?
Wie sieht die Datei denn aus?
-
Achso sorry, hätte ein screen machen sollen... Ich brauche halt diese Leerzeichen wegen der Formatierung....
So siehts jetzt aus
*Keyword* asdf
wdf23 dfsa*Keyword* asdf
wdf22 gava2so sollte es aber dann letztendlich sein:
*Keyword* asdf
wdf23 gsdf*Keyword* asdf
wdf22 gava2Meine idee wars halt bei dem else zwei wo erkannt wird das es nicht mit dem keyword beginnt, das es nach jedem string einfach sieben leerzeichen macht. Hatte aber wirklich 0 schimmer wie ich das hinbekomme!
-
undercover schrieb:
Achso sorry, hätte ein screen machen sollen... Ich brauche halt diese Leerzeichen wegen der Formatierung....
So siehts jetzt aus
*Keyword* asdf wdf23 dfsa *Keyword* asdf wdf22 gava2so sollte es aber dann letztendlich sein:
*Keyword* asdf wdf23 gsdf *Keyword* asdf wdf22 gava2Meine idee wars halt bei dem else zwei wo erkannt wird das es nicht mit dem keyword beginnt, das es nach jedem string einfach sieben leerzeichen macht. Hatte aber wirklich 0 schimmer wie ich das hinbekomme!
Also nicht vor jedem Wort sondern nur vor jedem Wort in einer Zeile ohne Keyword, wenn das Wort selbst nicht am Anfang der Zeile steht - richtig?
-
sorry meinte natürllich
*Keyword* asdf
wdf23 dfsa*Keyword* asdf
wdf22 gava2so sollte es aber dann letztendlich sein:
*Keyword* asdf
wdf23 gsdf*Keyword* asdf
wdf22 gava2
-
Genau so meine ich das!
Ich dachte halt an den else Zwei, dass man da vielleicht was machen kann hatte aber keinen Schimmer wie ich das hinbekomme!
-
Also das ist jetzt nur ein schneller Hack:
{ std::ifstream read(directory1); std::ofstream write( "kopiemitKeyword.lst" ); for( std::string line; std::getline( read, line ) && line!="*NET*"; ) ; write <<"*Kopie*"<<std::endl<<std::endl; write <<"*Test*"<<std::endl<<std::endl; read >> std::noskipws; // Leerzeichen mitlesen const std::string key = "*Keyword*"; std::string::const_iterator idx = key.begin(); std::string buffer; bool key_erkannt = false; bool war_space = false; for( char c; read >> c; ) { if( c == char('\n') ) // LF bzw. newline key_erkannt = false; if( c == *idx ) { buffer += c; if( ++idx == key.end() ) { // -- Key erkannt write << "\n" << buffer; buffer.clear(); idx = key.begin(); key_erkannt = true; } } else { if( war_space && !key_erkannt && c != ' ' ) write << " "; // 6 Leerzeichen einfügen if( !buffer.empty() ) { write << buffer; buffer.clear(); idx = key.begin(); } write << c; } war_space = (c == ' '); } write << buffer; // ggf. Rest kopieren }Das Einfügen funktioniert nicht zu 100%, wenn ein Wort genauso anfängt wie das Keywort, werden keine Leerzeichen eingefügt.
Schön ist der Code auch nicht - vielleicht hat jemand eine bessere Idee - ist wohl auch eher eine boost.regex-Aufgabe.Schönes Wochenende
Werner
-
ja das stimmt, aber ich gucke mal ob ich was gescheites mir dabei einfallen lassen kann! Dennoch danke ich dir für dein SUPER SUPPORT!!! danke danke danke
