Datei mit Leerzeichen auslesen



  • 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
    3x4

    Gefiltert <-- so sieht die ausgabe aus
    1 23 4

    So soll die Ausgabe aussehen und auch gespeichert werden:

    1 2
    3 4

    Ich 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.


  • Mod

    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 4

    da 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_if

    werd 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 😃


  • Administrator

    @Tachyon,
    Dein Code ist aber nicht dein Ernst? Schon nur das std::replace_if ... wobei es doch ein std::replace gä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 das std::replace_if ... wobei es doch ein std::replace gä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', ' ');
    }
    

Anmelden zum Antworten