überlegungsfehler // vektor string manipulieren // oder doch schon beim einlesen code verfeinern?



  • Hallo werte Damen und Herren,

    Ich setze mich seit 3 Monaten mit C++ auseinander und wage nun erste Programme zu schreiben.

    Als erstes kam mir ein Gedanke wieso kein Programm was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann. Daraus entwickelte sich schnell eine Hassliebe :=)

    Folgenden Code habe ich bereits geschrieben :

    <iframe src="http://pastebin.com/embed_iframe.php?i=an6YqXA0" style="border:none;width:100%"></iframe>

    Wobei beim Textfile node2.txt jede Zeile folgendermassen aussieht:

    5 5823-8CCC-C561 172.18.112.13 0/1/0/U1 wol-pt 4 3 D3.0 2.3

    die unübliche Schreibweise der Macadresse aus einem Huawei MDU würde ich gerne in die übliche Schreibweise umwandeln 58:23:8C:CC:C5:61

    Ich war der Meinung ich lese die Daten per Zeile in ein vector<string> ein und nehme dann nur die Mac Adresse heraus. und da haperts mit meinen Kenntnissen.

    Hat mir eventuell jemand ein Tipp? Habe etwas über seekg() gelesen eventuell schon beim einlesen sich auf mac konzentrieren.

    Irgendwie habe ich den Faden verloren. Während der tryandtryandtryagain Phase ist mir noch was aufgefallen wie verhalten sich die vector<string> Elemente ?
    die sind ja strings.

    in der Annahme dass es dann easy sein sollte ein String dann zu manipulieren mit folgendem Code ist leider gescheitert:

    zeilenspeicher[i].begin(),Zeilenspeicher[i].end()-20); irgendie danach hab ich den Faden verloren.

    Meine Ziel war es aus einem Simplen Textdatei mit Wörtern und zahlen pro Zeile einen Bestimmte Postision herauszulesen diese dann zu formatieren und dann in eine neue Datei zu schreiben.

    Klar kann jetzt jemand sagen in Exel könnte man das machen aber es geht hier ums lernen und Erfahrungen zu sammeln. Von daher wäre es echt "nice" wenn ich hier mit jemanden über diese Problematik diskutieren könnte.

    Ich bedanke mich jetzt schon für die Bemühungen.



  • Irgendwie habe ich den Faden verloren

    Jau, ich auch. Hast du deinen Text mal selbst gelesen? Es ist überhaupt nicht klar, was du eigentlich willst.

    Als erstes kam mir ein Gedanke wieso kein Programm was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann

    Das kein korrekter Satz.

    Man, wenn du schon was willst, bemüh dich gefälligst auch, verständliches Deutsch mit einer vernünftigen Rechtschreibung und Satzzeichensetzung zu verwenden. Sehr hilfreich ist auch eine konkrete Problembeschreibung.

    <iframe src="http://pastebin.com/embed_iframe.php?i=an6YqXA0" style="border:none;width:100%"></iframe>

    ??

    Ohne dein konkretes Ziel erläutert zu haben, sprichst du plötzlich von einer Textdatei und einer MAC-Adresse. Was denkst du, was wir damit anfangen können?

    Ich war der Meinung ich lese die Daten per Zeile in ein vector<string> ein und nehme dann nur die Mac Adresse heraus. und da haperts mit meinen Kenntnissen.

    Ok, etwas konkreter. Was hast du denn schon gemacht? Wir machen das nicht alles für dich, poste den entsprechenden Code (nicht einen Link zu irgendeinem Projekt, ich wühle mich nicht durch deinen Code), dann kann man dir sagen, was du falsch machst oder was du verbessern kannst.
    seek brauchst du hier nicht.

    tryandtryandtryagain Phase

    ??

    wie verhalten sich die vector<string> Elemente

    Äh, eventuell wie strings?

    Meine Ziel war es aus einem Simplen Textdatei mit Wörtern und zahlen pro Zeile einen Bestimmte Postision herauszulesen diese dann zu formatieren und dann in eine neue Datei zu schreiben.

    Klar kann jetzt jemand sagen in Exel könnte man das machen aber es geht hier ums lernen und Erfahrungen zu sammeln. Von daher wäre es echt "nice" wenn ich hier mit jemanden über diese Problematik diskutieren könnte.

    So, jetzt kommen wir der Problematik etwas näher. Ich formuliere das nochmal neu:
    Du hast eine Textdatei, da stehen zeilenbasiert Informationen drin. Du möchtest ein Teil dieser Informationen auslesen, verarbeiten (umformatieren) und in eine neue Datei schreiben.
    Stichwörter für dich: std::ifstream, std::ofstream, operator>>.

    Parse deine Datei, du kennst ja den Aufbau der Daten. Verwerfe das, was du nicht benötigst und speichere den Rest in einer neuen Datei. In Pseudocode:

    open infile
    open outfile
    while(read data from infile)
        subdata = reformat(data.subdata)
        write subdata to outfile
    endwhile
    close infile
    close outfile
    

    Für deine kommenden Posts wäre es "nice", wenn du Codetags benutzt, klare Sätze schreibst und kurze Beispiele gibst. Dann ist es für uns "easy", dir zu helfen. 😉



  • Definiere Variablen dort, wo sie gebraucht werden. So nah wie möglich, so fern wie nötig - Nicht alles am Funktionsanfang ... das war C89.

    Zu deiner Leseschleife:

    breakiboy schrieb:

    while( !datei.eof() )
    	{
    		getline( datei, zeile );
    		zeilenspeicher.push_back( zeile );
    		counter++;
    	}
    

    ... du machst auf Fehler prüfen, lesen, verarbeiten. Richtig rum ist: lesen versuchen, auf Fehler prüfen, verarbeiten wenn kein Fehler.

    Schau dir mal den Rückgabewert und -typ von std::getline() an. Dann kannst du ...

    while( getline( datei, zeile ) )
    	{
    		zeilenspeicher.push_back( zeile );
    		counter++;
    	}
    

    machen. Nebenbei: Warum mitzählen? Der Vektor weiß doch eh, wie groß er ist?

    Was willst du mit der Adresse denn dann anstellen?



  • Hallo Hyde++, sieht man irgendwo in meinem Post," löst die Aufgabe für mich". Ich wollte eine ernsthafte Diskussion eröffnen um einerseits mehr Erfahrung zu sammeln in Umgang mit C++, anderseits um "nette" Bekanntschaften zu machen. Da Sie aber eher zu den Leuten gehören die eine negative Aura verbreiten, weigere ich mich, mit Ihnen zu kommunizieren.

    Es ist offensichtlich dass Sie mehr Erfahrung in C++ haben aber ein bisschen mehr Sozialkompetenz würde Ihnen auch nicht schaden, gerade für Neulinge hat das eher eine abschreckende Wirkung.

    Trotzdem danke für Ihre Bemühungen.



  • omg ... drama queen? rtfm. 🙄

    egal. Geschmacksmuster:

    #include <cstdlib>
    #include <cctype>
    #include <limits>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <iomanip>
    
    struct mac_t
    {
    	static const char octet_group_delim = '-';
    	static const char octet_delim = ':';
    
    	char unsigned octets[ 6 ];
    };
    
    std::istream & operator>>( std::istream & is, mac_t & mac )
    {
    	mac_t tmp;
    
    	for( unsigned i = 0; i < 3; ++i ) {
    
    		unsigned octet_group;
    		char delim = 0;
    
    		if( !( is >> std::hex >> std::skipws >> octet_group >> std::noskipws >> delim ) ||
    		    delim && !( delim == mac_t::octet_group_delim || std::isspace( delim ) ) )
    		{
    			is.setstate( std::ios::failbit );
    			return is;
    		}
    
    		tmp.octets[ i * 2     ] = octet_group >> 8;
    		tmp.octets[ i * 2 + 1 ] = octet_group  & 0xff;
    	}
    
    	mac = tmp;
    	return is;
    }
    
    std::ostream & operator<<( std::ostream & os, mac_t const & mac )
    {
    	for( unsigned i = 0; i < 5; ++i )
    		os << std::hex << std::setw( 2 ) << std::setfill( '0' )
    		   << static_cast< unsigned >( mac.octets[ i ] )
    		   << mac_t::octet_delim;
    
    	return os << std::hex << std::setw( 2 ) << std::setfill( '0' )
    	          << static_cast< unsigned >( mac.octets[ 5 ] );
    }
    
    std::istream & ignore_line( std::istream &is )
    {
    	is.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    	return is;
    }
    
    int main()
    {
    	char const * input_file_name = "test.txt";
    	std::ifstream input_stream( input_file_name );
    
    	if( !input_stream ) {
    		std::cerr << "Error: Failed to open \"" << input_file_name << "\" for reading.\n\n";
    		return EXIT_FAILURE;
    	}
    
    	int dummy;
    	mac_t mac;	
    	std::vector< mac_t > mac_addresses;
    
    	while( input_stream >> dummy >> mac >> ignore_line )
    		mac_addresses.push_back( mac );
    
    	std::cout << "Read " << mac_addresses.size() << " MAC addresses until "
    	          << ( input_stream.eof() ? "EOF" : "error" ) << ":\n";
    
    	input_stream.close();
    
    	for( auto const & i : mac_addresses )
    		std::cout << i << '\n';
    }
    


  • Danke Swordfish,

    Ich recherchiere die für mich unbekannten Codeteile, damit ich Zusammenhänge besser verstehen kann.

    PS: danke für den Link, musste schmunzeln 🙄



  • Zugegeben, mein Post war eventuell etwas flapsig formuliert. Trotzdem enthält er für dich (in Foren duzt man sich üblicherweise) einige wichtige Informationen:

    Wenn man eine Frage hat, sollte man sich die Mühe machen, diese möglichst genau zu stellen. Je allgemeiner, desto schlechter. Das Problem bei deinem Post war, dass es schwierig war, zu verstehen, was du eigentlich meinst. Am Ende stehen ein paar nützliche Informationen, jemand, der dir helfen möchte, muss diese aber umständlich extrahieren. Korrekt wäre gewesen, zu schreiben: "Hey Leute, ich möchte aus einer Datei, die folgendes Format hat, nur die MAC-Adresse auslesen. Diese möchte ich anschließend gerne umformatieren und in eine weitere, neue Datei schreiben. Hier seht ihr einen Ausschnitt aus der Quelldatei."
    Kurz und verständlich. So sollte es sein.

    Im Internet neigen viele Leute dazu, zu denken, es sei egal, korrekte Sprache, Satzzeichen oder Grammatik zu verwenden. Das ist nicht so. Es ist mühsam, raten zu müssen, was das Gegenüber wohl gemeint hat. Gerade beim Programmieren kommt es auf Syntax genau an, da kann man auch erwarten, vernünftiges Deutsch vorgesetzt zu bekommen. Du erscheints mir auch nicht wie jemand, der nicht des Deutschen mächtig ist.

    Codebeispiele: auch wenn Swordfish das jetzt gemacht hat ( 👍 ): Ich ignoriere meistens Posts, die einen Link auf ihren Code enthalten ("sorry, ist ein großes Projekt, wollte hier nicht 1000 Zeilen posten"). Was man hier tun sollte, ist den Code auf das Nötigste zu reduzieren. Und zwar wirklich nur auf das Allernötigste! Bei vielen Fragen geht es dann wirklich nur um 10 - 50 Zeilen, die man schnell durchlesen kann. Das machen viele gerne. Bei dir müsste ich erst einen Link aufrufen, kapieren, worum es überhaupt geht, die entsprechende Problemstelle finden um dir eine Antwort zu geben. Dazu bin ich nicht bereit. Du willst ja etwas von uns.
    Zusätzlich konnte man deinen Link nicht einfach anklicken. Das ist natürlich eine Kleinigkeit, aber für jemanden, der sich nicht die Mühe macht, seinen Post zu überarbeiten, mache ich mir doch nicht die Mühe, seinen Code zu lesen.

    Der Ton mag für Neulinge manchmal etwas hart sein, ich kann dir aber versichern, dass mein Post noch ziemlich harmlos ist. Keine Sorge, ich verbreite weder eine negative Aura, noch muss ich an meinen Sozialkompetenzen arbeiten. Mir ist auch völlig egal, was du über mich denkst. Ich mache mir nicht die Mühe, diesen Post zu schreiben, um dir irgendwie eins reinzuwürgen oder mit dir eine dämliche Diskussion zu beginnen. Ich möchte auch gar nicht, dass du hierrauf antwortest. Ich hoffe nur aufrichtig, dass ich dich dazu bringen kann, in Zukunft deine Frage einfach und verständlich zu stellen. Ich garantiere dir, dass wir dann bestens miteinander auskämen.
    Ich habe hier auch schon mal was auf den Deckel bekommen, ich denke, das hat ganz gut getan. 😉

    Der Link, den Swordfish gepostet hat, ist nicht nur zum Schmunzeln, da steht einiges wertvolles drin, das einem nicht nur in Programmierform hilft. Das Dokument sollte man definitiv gelesen haben.

    Damit du meine Punkte gut nachvollziehen kannst: hier ein Vorschlag, wie du deinen ursprünglichen Post hättest schreiben können. Vielleicht zeigt dir das ja auch, dass ich dich nicht nur belehren möchte.

    Hallo Leute,

    ich bin neu in C++ und versuche mir einige Aufgaben auf der Arbeit zu vereinfachen.

    Momentan habe ich folgendes Problem: Ich habe eine Textdatei, in der einige Informationen zu einem Netzwerkknoten stehen. Die Datei ist wie folgt aufgebaut:

    5 5823-8CCC-C561 172.18.112.13 0/1/0/U1 wol-pt 4 3 D3.0 2.3
    

    Die erste Zahl steht hierbei für die ID des Knotens, anschließend folgt die MAC-Adresse in eigenartiger Formatierung. Nach dem nächsten Leerzeichen steht die IP-Adresse, danach ...

    Ich möchte gerne die MAC-Adresse auslesen, in das Standardformat (hier also 58:23:8C:CC:C5:61) bringen und in eine neue Datei schreiben.

    Mein momentaner Ansatz sieht so aus:

    ifstream infile ("node2.txt");
    ofstream outfile ("node2_mac.txt");
    
    while(infile)
    {
        string line;
        infile.getline(line);
        
        string mac = parse_mac(line);
        string mac_reformatted = reformat_mac(mac);
        outfile << mac_reformatted << endl;
    }
    infile.close();
    outfile.close();
    

    Ich muss noch parse_mac und reformat_mac schreiben, ich habe so angefangen, aber hier ist mir nicht ganz klar, wie ich ...



  • Hyde++ schrieb:

    Als erstes kam mir ein Gedanke wieso kein Programm was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann

    Das kein korrekter Satz.

    Du machst SO einen Aufstand wegen fehlendem :"..."?


  • Mod

    otze schrieb:

    Hyde++ schrieb:

    Als erstes kam mir ein Gedanke wieso kein Programm was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann

    Das kein korrekter Satz.

    Du machst SO einen Aufstand wegen fehlendem :"..."?

    Das ist schon ein Fall, in dem man aufgrund der fehlenden Zeichensetzung den Satz mindestens 2x lesen muss. Und dann geht's im Rest des Texts so weiter. Das sollte nicht sein.



  • Sollte kein Aufstand sein. Ich verstehe den Satz ehrlich nicht.
    "Als erstes kam mir der Gedanke, wieso kein Programm, was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann, (hier wort einsetzen)".
    Nutzbar ist? Existiert?
    Ich weiß ehrlich nicht, was gemeint ist.

    EDIT: Ah, jetzt sehe ich, was gemeint ist. Ich dachte, das "was" bezieht sich auf das Programm:
    "Als erstes kam mir der Gedanke, wieso kein Programm, welches ..."

    Naja, soll er/sie halt wenigstens "kein program mir etwas Arbeit im Büro abnehmen kann" schreiben.

    EDIT 2: Ne, doch nicht. "Etwas" taucht ja schon auf. Ich kapiers nicht.



  • Da kam mir der Gedanke: Wieso kein Programm, was mir bei der Arbeit im Büro etwas Arbeit abnehmen kann?



  • Ahja, vielen Dank. Man sieht: Satzzeichen bewirken Wunder. 🙂



  • Ich kanns Hide nicht verübeln. Ich musst den Post auch dreimal lesen, bis ich genug hineininterpretiert hatte, um mir ziemlich sicher zu sein, was breakiboy meinte. Und das muss halt einfach nicht sein.


Anmelden zum Antworten