Datei mit Leerzeichen auslesen
-
Hier ein Beispiel von www.cplusplus.com (sehr empfehlenswerte Referenz), dass die gefragten Prinzipien demonstriert:
// read a file into memory #include <iostream> #include <fstream> using namespace std; int main () { int length; char * buffer; ifstream is; is.open ("test.txt", ios::binary ); // get length of file: is.seekg (0, ios::end); length = is.tellg(); is.seekg (0, ios::beg); // allocate memory: buffer = new char [length]; // read data as a block: is.read (buffer,length); is.close(); cout.write (buffer,length); delete[] buffer; return 0; }Das Beispiel sollte selbsterklärend sein, wenn nicht, stell einfach Fragen. Ich möchte aber noch anmerken, dass diese Art Dateien einzulesen nicht unbedingt das Optimum an Eleganz darstellt, aber es ist relativ einfach zu verstehen und demonstriert auch schön dynamische Speicherverwaltung.
-
mhhm irgendwie bekomme ich mit der anderen Methode so komische Zeichen mit ausgeben. Fast so wie wenn man bei Assembler den string bei einer Text Ausgabe nicht Null Terminiert ^^ ja ok so schlimm sah es nicht aus^^
naja nvm
Mein Problem ist jetzt hier ich weiss nicht wie ich das x z.b. durch ein A ersetzen kann.
Die Datei sieht so aus:
1x1
2x2So soll die Datei am ende wieder abgespeichert werden
1 1
2 2Also das x soll einfach nur herausgefiltert werden.
Aber wie könnte man das machen ?
zeilen[0] = 1x1;
zeilen[1[ = 2x2;Ich weiss halt bisher nur an welcher Position das x steht aber leider nicht wie ich es ersetzen kann

#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ofstream new_file("test.txt",ios::app); ifstream file; file.open("datei.txt"); string zeilen[200]; size_t found; string zeichen = "x"; for (int i=0;i<5;i++) { file>>zeilen[i]; } file.close(); for (int i=0;i<2;i++) { found = zeilen[i].find(zeichen); cout<< int (found) <<endl; } system("PAUSE"); }
-
const unsigned lines = 3; string slines[lines]; int main ( int argc, char* argv[] ) { slines[0]="EinexDateixaufxdiesexWeisexeinzulesenxistxganzxschonxdoof,\n" "aberxdasxsollxnichtxmeinxProblemxsein."; for ( unsigned i = 0; i<lines; i++ ) { size_t len = slines[i].size(); for ( unsigned j=0; j<len; j++ ) if ( slines[i][j] == 'x' ) slines[i][j] = ' '; cout << slines[i] << endl; } return 0; }
-
Eine C++-Lösung:
#include <iostream> #include <fstream> #include <vector> #include <iterator> #include <algorithm> //... struct IsChar { IsChar(char c) : m_c(c){} bool operator()(char c) { return c == m_c; } char m_c; }; //... std::ifstream reader("some_text.txt"); std::vector<char> buffer; if(reader) { std::istreambuf_iterator<char> iter(reader.rdbuf()); std::istreambuf_iterator<char> end; std::copy(iter, end, std::back_inserter(buffer)); std::replace_if(buffer.begin(), buffer.end(), IsChar('x'), ' '); }Das lädt den Inhalt von
some_text.txtin den Vektorbufferund ersetzt alle'x'durch' '.
-
Den Quelltext von Oh! versteh ich damit kann ich was anfange aber den von dir Tachyon den versteh ich nicht.
Jetzt wird das x zwar immer gut rausgefiltert aber wie soll ich das jetzt richtig abspeichern ?
Ungefiltert:
1x2
3x4Gefiltert <-- so sieht die ausgabe aus
1 23 4So soll die Ausgabe aussehen und auch gespeichert werden:
1 2
3 4Ich hab 0 Ahnung wo ich da ansetzen soll -.-
-
Hier kann man sowas nachlesen:
Das mag zu anfang etwas kompliziert aussehen, aber es lohnt sich, das zu lernen. Zu den meisten Dingen gibt es auf der Seite auch Beispiele.
-
datei schrieb:
Ich hab 0 Ahnung wo ich da ansetzen soll -.-
Ehrlich gesagt, indem du dir die Grundlagen zur Ein-/Ausgabe in C++ mal anschaust. Wenn wir dir jetzt jede Kleinigkeit lösen, ohne dass du verstehst, warum das funktioniert, wirst du auch bei der nächsten Kleinigkeit wieder fragen müssen. Versteh mich nicht falsch, hier werden gerne Probleme gelöst, aber wie man einen Zeilenumbruch in einer Ausgabe erzeugt ist derart grundlegend für ein Programm wie du es willst, dass du dir das vorher unbedingt einmal angucken solltest. Ansonsten wirst du für jede kleine Änderung wieder fragen müssen.
-
datei schrieb:
Gefiltert <-- so sieht die ausgabe aus
1 23 4da sind wohl die \n rausgefiltert worden

wieso musst du die ganze datei auf eimal einlesen?
handelsübliche textdatei for human being readers sind maximal einige wenige kilobyte groß, ein zeilenweise-algorithmus reicht völlig aus.
-
Tachyon schrieb:
Eine C++-Lösung:
Ajja, C++ also.
-
lol ich weiss wie man einen Zeilenumbruch macht xD
C: printf("\n");
c++: <<endl;
Assembler: umbruch db 10,13,"$"
Ich hab vorhin auch in Zeile 43 den Zeilenumbruch gesetzt aber dann gibt er mir das falsch aus weil ich es ohne getline eingeben habe naja wie auch immer jetzt funktioniert es auf jeden fall thx @ all.
Und diese Sachen mit :
vector
ifstream::rdbuf
istreambuf_iterator
back_inserter
copy
replace_ifwerd ich mir mal anschauen.
#include <iostream> #include <fstream> #include <windows> using namespace std; int main(int argc, char* argv[]) { ifstream datei("test.txt"); string zeile[200]; for (int i= 0;i<2000;i++) { getline(datei,zeile[i] ); } unsigned lang; for ( unsigned i = 0; i<20; i++ ) { lang = zeile[i].size(); for ( unsigned j=0; j<lang; j++ ) if ( zeile[i][j] == 'x' ) zeile[i][j] = ' '; cout<< zeile [i]<<endl; } system("PAUSE"); }
-
Ich hab vorhin auch in Zeile 43 den Zeilenumbruch gesetzt aber dann gibt er mir das falsch aus weil ich es ohne getline EINGELESEN ^^ nicht eingeben
-
datei schrieb:
#include <iostream> #include <fstream> #include <windows> using namespace std; int main(int argc, char* argv[]) { ifstream datei("test.txt"); string zeile[200]; for (int i= 0;i<2000;i++) { getline(datei,zeile[i] ); } unsigned lang; for ( unsigned i = 0; i<20; i++ ) { lang = zeile[i].size(); for ( unsigned j=0; j<lang; j++ ) if ( zeile[i][j] == 'x' ) zeile[i][j] = ' '; cout<< zeile [i]<<endl; } system("PAUSE"); }aaaaaalter ey, was für ein horrorcode! und wenn die datei 201 zeilen hat, dann geht dir der ofen aus

-
@Tachyon,
Dein Code ist aber nicht dein Ernst? Schon nur dasstd::replace_if... wobei es doch einstd::replacegäbe ...Also, wenn ich hier mal eine "normale" Lösung präsentieren darf?
#include <string> #include <fstream> #include <iostream> #include <algorithm> int main() { std::string line; std::ifstream reader("text.txt"); while(std::getline(reader, line)) // wir lesen, so lange der Stream gültig ist. { std::replace(line.begin(), line.end(), 'x', ' '); std::cout << line << '\n'; // std::endl ist ein auto-flush, unnötig. } // warten bis der User <enter> drückt, damit die Konsole nicht // sofort geschlossen wird ... std::cin.get(); // std::cout.flush() wird automatisch aufgerufen. return 0; }Sieht das nicht etwas besser aus?

Grüssli
-
Das ding wird aber niemals 200 Zeilen bei mir bekommen ^^
Ich war halt zu faul zum einrücken xD
Bei den paar Zeilen da geht das auch so ^^
-
Dravere schrieb:
@Tachyon,
Dein Code ist aber nicht dein Ernst? Schon nur dasstd::replace_if... wobei es doch einstd::replacegäbe ...Okay, das war Copy&Paste (und etwas Änderungen) aus einem bestehenden Codestück. Hätte es vielleicht noch mehr ändern sollen.

Am schnellsten geht wohl das:#include <iostream> #include <fstream> #include <iterator> #include <algorithm> //... //zum Lesen std::ifstream reader("some_text.txt"); //zum Schreiben std::ofstream writer("some_modified_text.txt"); //wenn beide korrekt geoeffnet wurden... if(reader && writer) { //lese von... (Dateianfang) std::istreambuf_iterator<char> readerBegin(reader.rdbuf()); //...bis (Dateiende) std::istreambuf_iterator<char> readerEnd; //Schreibzeiger std::ostreambuf_iterator<char> writerBegin(writer.rdbuf()); //kopiere den Inhalt von reader(Dateianfang..Dateiende) zeichenweise. Wenn das Zeichen 'x' ist, ersetze es durch ein Leerzeichen. std::replace_copy(readerBegin, readerEnd, writerBegin, 'x', ' '); }