Deine Methode mit dem ProcessBuilder sollte auch unter nahezu jeder unixoiden Shell funktionieren, naürlich mit anderem Kommando:

new ProcessBuilder("sh", "-c", "clear") ...

Allerdings ist das ein absoluter Overkill und auch der Ansatz mit den Escapesequenzen genau genommen totaler Pfusch.

Am besten, du liest dich in die Java-Bindings von ncurses ein. Da gibts diverse Bibliotheken und google wird dir dabei weiter helfen!

Aber für den Anfang, kannst du es ja mit dem ProcessBuilder versuchen. :)

...zur Antwort

Silbentrennung ist Sprachspezifisch und ein Software (z. B. ein Editor oder DTP-Programm) hat für jede Sprache ein Modul, welches bestimmte Grundregeln enthält, und eine Liste von Ausnahmen.

Zum Beispiel wird im Deutschen zwischen zwei gleichen Konsonanten getrennt:

Tit-
ten

Pim-
mel

Meistens ist genau definiert, was eine "Silbe" ist und dazwischen wird auch getrennt.

Aber weil das von Sprache zu Sprache extrem unterschiedlich ist, gibt es - wie gesagt - für jede Sprache ein eigenes Modul. :)

...zur Antwort

Du nimmst eine beliebige Malware-Datei (zum Beispiel irgendeine *.exe oder *.docx aus dem Anhang einer Spammail), zippst diese zum Beispiel als foo.zip und hängst diese an eine *.gif Datei ran.

Alle anderen Bildformate funktionieren auch, aber laut GIF-Spezifikation ist ein Anhängen von Mülldaten sogar legitim.

ZIP-Dateien haben den "Vorteil", dass sie nicht mit Headern, sondern mit Trailern arbeiten, und ebenfalls Mülldaten davor angefügt werden dürfen.

Das heißt, eine Datei die mit einem GIF-Bild anfängt, und mit einer ZIP-Datei endet, ist immernoch sowohl ein gültiges Bild, als auch ein gültiges Archiv.

Da Windows dumm ist, und sich an Dateiendungen orientiert, wird das Bild im Browser, dem Bildbetrachter, oder jeder beliebigen Anwendung einfach so angezeigt, aber ein Antivirenprogramm wird die Datei prüfen und den ZIP-Anhang finden, in dem eine Malware enthalten ist, und dem Benutzer melden, dass die Datei in Quarantäne verschoben und gerade sein Leben gerettet wurde.

Eine andere Möglichkeit besteht darin, in eine beliebige Datei (vorzugsweise eine unformatierte Textdatei) folgenden Inhalt zu schreiben:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Wenn du wissen willst, wie das funktioniert, google mal nach "EICAR".

Das funktioniert aber nur mäßig, weil die meisten Antivirenprogramme so etwas wie "Not a Virus" oder "Testvirus" ausgeben.

Naja, egal ... viel Spaß beim rumblödeln! ;)

...zur Antwort

Ich bin mir sehr sicher, dass du C++ nicht "kannst", sondern höchstens an der Oberfläche gekratzt hast. :)

Also lerne doch einfach C++ richtig ordentlich weiter! Diese Sprache hat sicher noch viele Features, von denen du noch nie gehört hast, welche dir aber verdammt interessante Dinge erlauben, von denen du noch nicht mal geträumt hast.

Meiner Erfahrung nach, können gerade die Leute, die meinen sie "könnten" C++, nicht mal richtig Ausnahmen fangen.

Von daher: Lerne C++ doch lieber erstmal etwas ausführlicher. Ich glaube, da hast du am Ende mehr von. :)

...zur Antwort

Entweder du nimmst dir dafür eine Drittbibliothek, baust dir selber eine schön verpackte Klasse, oder nutzt folgende sehr einfache Implementierung:

#include <filesystem> // path
#include <fstream> // ifstream, ofstream
#include <iostream> // cout
#include <string> // string
#include <tuple> // apply, make_tuple

template <class ... ARGS>
[[nodiscard]] inline auto load(const ::std::filesystem::path & fnam, ARGS && ... args) {
    using namespace ::std;
    static_assert(sizeof...(ARGS), "no args supplied");

    auto result { make_tuple(args ...) };
    
    if (ifstream ifs { fnam }; ifs.good()) {
        ifs.exceptions(ifstream::failbit);
        ifs.setf(ifstream::boolalpha);

        apply([&ifs] (ARGS & ... refs) { (ifs >> ... >> refs); }, result);
    }

    return result;
}

template <class ... ARGS>
inline void store(const ::std::filesystem::path & fnam, ARGS && ... args) {
    using namespace ::std;
    static_assert(sizeof...(ARGS), "no args supplied");
    
    ofstream ofs { fnam };
    ofs.exceptions(ifstream::failbit | ifstream::badbit);
    ofs.setf(ofstream::boolalpha);

    auto printer { [&ofs] (const auto & ref) {
        ofs << ref << endl;
    } };

    (printer(args), ...);
}

int main() {
    using namespace ::std;
    cout.setf(ios_base::boolalpha);

    const string cfg_file { "./config.txt" };

    auto [my_int, my_float, my_bool, my_char] {
        load(cfg_file, 123, 456.789f, true, 'A')
    };

    cout << "[LOADED]" << endl;
    cout << my_int << endl;
    cout << my_float << endl;
    cout << my_bool << endl;
    cout << my_char << endl;
    cout << endl;

    my_int *= 2;
    my_float += 123.456f;
    my_bool = !my_bool;
    my_char = my_char == 'A' ? 'Z' : 'A';

    store(cfg_file, my_int, my_float, my_bool, my_char);

    cout << "[STORED]" << endl;
    cout << my_int << endl;
    cout << my_float << endl;
    cout << my_bool << endl;
    cout << my_char << endl;
    cout << endl;
}

Guck dir in der main()-Funktion an, wie es genutzt wird.

Der Typ wird automatisch von den Initialwerten genutzt, die an load() übergeben werden, sodass man ihn bei den einzelnen Variablen nicht angeben muss.

Beachte bitte, dass du einen C++17-fähigen Compiler nutzen musst, weil der obige Code exzessiv moderne Sprachfeatrues nutzt!

Alles in allem kannst du deine Werte dann beim Programmstart mit ...

auto [a, b] { load("datei.txt", 23, 42.42) };

... laden, und am Ende mit ...

store("datei.txt", a, b);

... speichern. Existiert am Anfang noch keine Datei (oder kann diese nicht geöffnet werden), werden die Variablen stillschweigend mit den angegebenen Werten initialisiert. Ansonsten wird bei Schreib- und Lesefehlern eine Ausnahme geworfen.

Das ist zwar nicht so sicher, wie eine hübsch gekapselte Klasse, weil evtl. Werte vertauscht werden könnten, aber es erfordert dafür nur ein paar Zeilen Code. :)

...zur Antwort

Egal, was man von Bill Gates halten mag, aber er ist sicher mehr Menschenfreund, als es Impfgegner jemals sein werden.

Und ich sage das als reiner Linuxnutzer! :)

...zur Antwort

Die des Ziels.

...zur Antwort

De sauberste Lösung ab C++17 sähe so aus:

constexpr auto len { 5ul };
int arr[len] {};

Die zweitsauberste Lösung, die man oft verwendet, wenn man mit Templates hantiert, geht so:

#include <type_traits> // extent

// ...

int arr[5] {};

using namespace ::std;
cout << extent<decltype(arr)>() << endl;

Die uralte C-Lösung, die heute auch noch oft verwendet wird, sieht so aus:

int arr[5] {};
cout << (sizeof(arr) / sizeof(*arr)) << endl;

Das ist natürlich völlig OK, wenn du in C programmierst, aber fehleranfällig, weshalb du bei C++ ::std::extent nehmen solltest. Das hat den Vorteil, dass du eine schöne Fehlermeldung bekommst, falls der Typ nicht stimmt.

Alles in allem solltest du bei C++ grundsätzlich auf - oft einfacher wirkende - Herangehensweisen aus C verzichten, weil C an einfach zu vielen Stellen quasi keine Typsicherheit kennt. (void-Zeiger, Format-Strings, Varargs, Preprozessor-Magie, uvm.)

Von daher: Gewöhne dir die Nutzung von extent an ... und nebenbei auch allen anderen Dingen, die du im <type_traits> Header findest. (Da dich das momentan aber alles noch überfordern würde, lerne erst mal die Grundlagen fertig und guck dir das genanannte in einem halben Jahr ruhig mal an!)

Viel Spaß! :)

...zur Antwort

Hab früher mal nem Kollegen ...

#define true false

... in den <vector>-Header geschrieben.

Das war lustig anzusehen. :)

PS: Verstehen vermutlich nur ITler, aber egal ...

...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.