Felder löschen - brauche hilfe!



  • Hallo,

    weiß nicht wo dieser Thread hin soll. Ich versuchs mal einfach hier, wenns falsch ist, bitte einfach verschieben.

    Also ich lerne gerade C++ und habe ein kleines Problem, der mir aber viel Zeit einnimmt und mich tierisch nervt. Ich lerne die Sprache mit einem Ebook. Das Problem ist, dass im Buch Codes aufgelistet werden, die mit Zeilen versehen sind. Logischerweise gibt mein Compiler die Zahlen als Fehler auf.

    So siehts z.b. aus:
    1: #include <iostream>
    2:
    3: using namespace std:
    4:
    5: int main()

    und so weiter...

    Dies stellt bei Codes mit 100 Zeilen ein problem dar, da ich jede einzelne Zahl von Hand löschen muss, um den dann in meinem Compiler zu debuggen. Ich kann den Code nicht seperat kopieren, sodass ich nur den Code ohne die Zahlenreihe entnehme.

    Gibt es eine Möglichkeit, wie man das ganze umgehen kann? Kann vielleicht jemand schnell mal so ein kleines Programm schreiben, der bei jeder Zeile die ersten 4 Felder löscht und sie ohne die Zahlen wieder hergibt?

    Das wäre echt toll und würde mir einiges an Arbeit ersparen.



  • abtippen, ist sowieso die sinnvollste lernmethode am anfang 🙂



  • Da haste wohl recht ja.
    Aber ich füge es erst in meinem Compiler ein, danach gehe ich immer Schritt für Schritt, break für break das Programm durch und versuche dann zu verstehen wie das ganze funktioniert.



  • Quick and Dirty:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    	std::cout << "Eingabedatei: ";
    
    	std::string inFilename;
    	std::cin >> inFilename;
    
    	std::ifstream inFile(inFilename.c_str());
    
    	if (!inFile.good())
    	{
    		std::cerr << "Fehler beim Oeffnen der Datei " << inFilename << std::endl;
    
    		return 1;
    	}
    
    	std::string outFilename = "_" + inFilename;
    	std::ofstream outFile(outFilename.c_str(), std::ios::trunc);
    
    	if (!outFile.good())
    	{
    		std::cerr << "Fehler beim Oeffnen der Datei " << outFilename << std::endl;
    
    		return 2;
    	}
    
    	std::cout << "Ausgabedatei: " << outFilename << "\n" << std::endl;
    
    	while (!inFile.eof())
    	{
    		std::string line;
    		std::getline(inFile, line);
    
    		size_t pos;
    
    		if ((pos = line.find(":")) != std::string::npos)
    		{
    			line = line.substr(pos + 1, line.length());
    
    			if (line.length() > 0 && line[0] == ' ')
    			{
    				line.erase(0, 1);
    			}
    		}
    
    		line += "\n";
    
    		outFile << line;
    		std::cout << line;
    	}
    
    	inFile.close();
    	outFile.close();
    
    	return 0;
    }
    


  • WOW danke für die Mühe! 🙂
    kannst du vielleicht kurz erläutern wie es funktioniert?



  • KompiPauer schrieb:

    WOW danke für die Mühe! 🙂
    kannst du vielleicht kurz erläutern wie es funktioniert?

    Wie man das Programm benutzt oder was der Quellcode macht?

    Zum Benutzen solltest du es zunächst kompilieren und in den Ordner verschieben, wo deine Dateien liegen. Anschließend startest du es und gibst den Namen der Datei ein, die noch die Zeilenangaben enthält. Dann wird eine neue Datei generiert, die _NameDerDatei heißt. Das ist dann die Datei ohne Zeilenangaben.

    Erklärung des Codes:

    #include <iostream> // std::cout
    #include <fstream> // std::ifstream, std::ofstream
    #include <string> // std::string
    
    int main()
    {
        std::cout << "Eingabedatei: ";
    
        std::string inFilename;
        std::cin >> inFilename;
    
        std::ifstream inFile(inFilename.c_str()); // Datei zum Lesen öffnen
    
        if (!inFile.good()) // Datei geöffnet?
        {
            std::cerr << "Fehler beim Oeffnen der Datei " << inFilename << std::endl;
    
            return 1;
        }
    
        std::string outFilename = "_" + inFilename;
        std::ofstream outFile(outFilename.c_str(), std::ios::trunc); // Datei zum Schreiben öffnen
    
        if (!outFile.good()) // Datei geöffnet?
        {
            std::cerr << "Fehler beim Oeffnen der Datei " << outFilename << std::endl;
    
            return 2;
        }
    
        std::cout << "Ausgabedatei: " << outFilename << "\n" << std::endl;
    
        while (!inFile.eof()) // Solange Dateiende nicht erreicht
        {
            std::string line;
            std::getline(inFile, line); // Neue Zeile aus Datei einlesen
    
            size_t pos;
    
            if ((pos = line.find(":")) != std::string::npos) // Position von : finden, falls : vorhanden
            {
                line = line.substr(pos + 1, line.length()); // Das was hinter dem : steht ausschneiden
    
                if (line.length() > 0 && line[0] == ' ') // Ist noch ein Leerzeichen übrig und handelt es sich um keine leere Zeile
                {
                    line.erase(0, 1); // Zeichen entfernen
                }
            }
    
            line += "\n"; // std::getline entfernt \n, also muss es wieder angefügt werden. Sonst wäre nacher alles in einer Zeile.
    
            outFile << line; // In Datei schreiben
            std::cout << line; // Ach auf der Konsole ausgeben
        }
    
        inFile.close(); // Datei wieder schließen
        outFile.close(); // ...
    
        return 0;
    }
    

    Sollten da noch Unklarheiten sein, dann benutzt einfach Google und such nach dem entsprechendem Befehl - du findest dann genug weitere Informationen.



  • OMG das ist sau genial 😃
    danke !! 😃



  • Hmmm,
    ich mach das einfach so...

    sed -i 's/^[0-9][0-9]*://g' filename... 🙂

    folgende software: sed --version
    GNU sed-Version 4.2.1

    reguläre Ausdrücke kannst im netz nachlesen 😉
    ^ =Zeilenanfang
    [0-9] gefolgt von einer Ziffer
    [0-9]* gefolgt von einer Ziffer oder keiner...(* = 0-undendlich viele)
    gefolgt von:
    s/ substitute Ausdrucht/ mit /g überall in der datei...
    also // bedeuted ersetzen mit nichts...



  • Und sed gibt es auch für Windows.
    http://unxutils.sourceforge.net/



  • Hier passt der Spruch... "When your hammer is C++, everything begins to look like a thumb" doch ganz gut ^^



  • Die find&replace-Funktionen des MSVC haben die regular expressions auch drin.
    Falls noch ungenutzt, die 'Find Options' des Pop-Ups aufklappen - übersieht man leicht.
    Sowie 'use' (regular expressions) angeklickt wird, werden die Buttons mit den Pfeilen aktiviert, die einem mit vorgefertigten Mustern ein wenig helfen.
    http://www.regular-expressions.info/reference.html
    ist ein zweckmßiger bookmark-link, da man die Dinger wenn's dringend ist immer wieder vergessen hat 😉



  • Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten