Mit C oder C++ Umsetzbar?



  • Hallo,

    folgendes möchte Ich umsetzen:

    - Aus 3 unterschiedlichen Hexa Files (.bin Datei), soll eine neue Hexa Datei erstellt werden.
    - Die Größe der zu vergleichen Dateien sind immer gleich groß, d.h. ist Datei_1 4 KB Groß so ist dann auch Datei_2 und Datei_3 4 KB Groß
    - Die Software soll jedoch unterschiedliche Größen bis zu 1 MB vergleichen können.
    - Die Werte bzw. dass Byte von Datei 1 sollen mit den Werten von Datei 2 verglichen werden, sind die Werte unterschiedlich, soll der Wert von Datei 2 in Datei_3_NEU geschrieben werden. Sind die Werte jedoch identisch, also sodass der Byte von Datei 1 und Datei 2 gleich sind, soll der Wert bzw. Byte in der Position von Datei 3 übernommen werden.

    Beispiel:

    in Zeile 1 in Datei_1 steht:
    00 0E 0D A3 38
    in Zeile 1 in Datei_2 steht
    00 0E 0E A2 38
    In Zeile 1 in Datei_3 steht
    01 1A 2B 4b 44

    dann soll in Datei_3 (NEU) folgendes stehen

    01 1A 0E A2 44

    Inwiefern kann folgendes mit C oder C++ umgesetzt werden?



  • sandyy schrieb:

    Inwiefern kann folgendes mit C oder C++ umgesetzt werden?

    Inwiefern? Voll und ganz. 🙄



  • also was ich gern wüssen würde... wäree wie man ungefähr vorgehen müsste und welche Funktionen Ich dazu benötige. Ich mus ja an sich 3 Pdate eingeben für die Vorhandenen Dateien und eine neue erstellen, woraus die gewünschte Datei erstellt wird. hab da aber meine Schwierigkeit den roten Pfaden zu erstellen.

    Btte um etwas hilfee .. 🙂 🙂



  • Da alle drei Dateien gleich groß sind, dürfte die Lösung besonders einfach sein. Du liest alle drei Dateien byteweise, wobei dich ja die Werte von Datei drei nicht interessieren. Das Lesen von Datei 3 dient einfach dazu, dass der Lesepointer "mitwandert" und sobald byte1 != byte2, machst du f3.write(byte2). So, oder so ähnlich.



  • Einfach schrieb:

    Da alle drei Dateien gleich groß sind, dürfte die Lösung besonders einfach sein. Du liest alle drei Dateien byteweise, wobei dich ja die Werte von Datei drei nicht interessieren. Das Lesen von Datei 3 dient einfach dazu, dass der Lesepointer "mitwandert" und sobald byte1 != byte2, machst du f3.write(byte2). So, oder so ähnlich.

    Als Ergänzung: Es soll ja eine neue Datei geschrieben werden und nicht direkt in Datei_3. Deswegen machst du eine Fallunterscheidung:

    if (byte1 != byte2)
        f4.write(byte2)
    else
       f4.write(byte3)
    

    Also muss byte 3 doch eingelesen werden.



  • Sowas kannst du auch in Java und .NET machen, da gehts noch einfacher nun schneller.. oder muss es C/C++ seinß



  • Ich würde das sogar in python empfehlen. Ist noch einfacher. Sprichts nichts dagegen bei sowas simplem. Aber, wenn sie sich C oder C++ verbessern will, ist das auch eine interessante Übung.



  • Hallo,

    ich würde am liebsten c oder Java verwenden weil ich da etwas Kenntnisse habe...

    So grob hab Ich es verstanden, aber wie kann Ich dem Programmcode bewusst machen, dass zur selben Zeit 3 Unterschiedliche Dateien gelesen werden und dann noch zur selben zeit eine neue erstellt wird.

    Das ganze macht mir total zu schaffen... 😕



  • Indem du 4 Filestreams öffnest, 3 zum Lesen und 1 zum Schreiben.
    Dazu nutzt man fopen, byteweises Lesen fgetc und Schreiben mit fputc.
    Zum Schluss noch 4x fclose.



  • Keine Ahnung, ob das kompiliert und richtig funktioniert. Hab das mal eben schnell hinge[k|h]ackt.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
       char byte1, byte2, byte3;
       FILE *f1, *f2, *f3, *f4;
    
       f1 = fopen(file_name,"r"); // read mode
       f2 = fopen(file_name,"r"); // read mode
       f3 = fopen(file_name,"r"); // read mode
       f4 = fopen(file_name,"w"); // write mode
    
       if( f1 == NULL || f2 == NULL || f3 == NULL || f4 == NULL )
       {
          perror("Error while opening the file.\n");
          exit(EXIT_FAILURE);
       }
    
       while( ( byte1 = fgetc(f1) ) != EOF ) {
           byte2 = fgetc(f2)
           byte3 = fgetc(f3)
    
           if (byte1 != byte2)
              fputc(byte2, f4);
           else
              fputc(byte3, f4);
       }
    
       fclose(f1);
       fclose(f2);
       fclose(f3);
       fclose(f4);
    
       return 0;
    }
    


  • Einfach schrieb:

    Keine Ahnung, ob das kompiliert

    file-name ist undefiniert. 😃

    Einfach schrieb:

    und richtig funktioniert.

    Zumindest byte1 sollte ein int sein, sonst klappt das nicht mit dem EOF .
    Bei den anderen schadet es aber auch nicht.

    Und der binary-Mode beim fopen wäre noch ganz sinnvoll.



  • #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    char byte1, byte2, byte3;
    FILE *f1, *f2, *f3, *f4;

    f1 = fopen("E:\test\1.bin","r"); // read mode
    f2 = fopen("E:\test\2.bin","r"); // read mode
    f3 = fopen("E:\test\3.bin","r"); // read mode
    f4 = fopen("E:\test\4.bin","w"); // write mode

    if( f1 == NULL || f2 == NULL || f3 == NULL || f4 == NULL )
    {
    perror("Error while opening the file.\n");
    exit(EXIT_FAILURE);
    }

    while( ( byte1 = fgetc(f1) ) != EOF ) {
    byte2 = fgetc(f2);
    byte3 = fgetc(f3);

    if (byte1 != byte2)
    fputc(byte2, f4);
    else
    fputc(byte3, f4);
    }

    fclose(f1);
    fclose(f2);
    fclose(f3);
    fclose(f4);

    return 0;
    }

    hab die kleinen Fehler beheben könnönen aber es wird keine datei erstellt....



  • @sandyyyyyy:
    1. Hast du mal gedebuggt? Mit "einfach compilieren und ausführen" kommst du sehr sehr schnell an Grenzen!

    2. Hast du DirkBs Beitrag überhaupt gelesen und zu Herzen genommen? Bist du einfach nur an schnellen und fertigen Lösungen interessiert?! Ein "Danke" kam auch nicht von dir, als ob das selbstverständlich wäre, dass jemand eine 95%-Lösung für dich codet...



  • Compiler: Default compiler
    Building Makefile: "C:\Dev-Cpp\Makefile.win"
    Executing  make...
    make.exe -f "C:\Dev-Cpp\Makefile.win" all
    gcc.exe -c "../Dokumente und Einstellungen/user/Desktop/main.c" -o "../Dokumente und Einstellungen/user/Desktop/main.o" -I"C:/Dev-Cpp/include"   
    
    gcc.exe "../Dokumente und Einstellungen/user/Desktop/main.o"  -o "Project1.exe" -L"C:/Dev-Cpp/lib" -mwindows
    

    Execution terminated
    Compilation successful

    So sieht es im DEV C++ Compiler aus:
    http://de.share-your-photo.com/c7ecc53ebd



  • @sandyyyyyy:
    1. Hast du mal gedebuggt? Mit "einfach compilieren und ausführen" kommst du sehr sehr schnell an Grenzen!

    2. Hast du DirkBs Beitrag überhaupt gelesen und zu Herzen genommen?



  • Hab den Code abgeändert, so wie Dirk sagte, sprich byte1 als integer deklariert.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int byte1;
       char byte2, byte3;
       FILE *f1, *f2, *f3, *f4;
    
       f1 = fopen("E:\test\1.bin","r"); // read mode
       f2 = fopen("E:\test\2.bin","r"); // read mode
       f3 = fopen("E:\test\3.bin","r"); // read mode
       f4 = fopen("E:\test\4.bin","w"); // write mode
    
       if( f1 == NULL || f2 == NULL || f3 == NULL || f4 == NULL )
       {
          perror("Error while opening the file.\n");
          exit(EXIT_FAILURE);
       }
    
       while( ( byte1 = fgetc(f1) ) != EOF ) {
           byte2 = fgetc(f2);
           byte3 = fgetc(f3);
    
           if (byte1 != byte2)
              fputc(byte2, f4);
           else
              fputc(byte3, f4);
       }
    
       fclose(f1);
       fclose(f2);
       fclose(f3);
       fclose(f4);
    
       return 0;
    }
    

    Kann jedoch kein Unterschied feststellen, alles funktionier problemlos debuggen, compelieren als auch run. Jedoch ist keine neue Datei in Ordner test namens 4



  • Entweder die backlashes in den Pfaden escapen ('\' -> '\') oder forward slashes verwenden ...



  • so mein Ausführen gabs jetzt Folgender Fehler im MSDOS
    ERROR while opening the file
    :permission denied

    Zugriff auf die Datei wird aus irgendwelchen Grund verweigert?



  • nun klappts mit dem ausführen, danke, das Programm jedoch klappt das Programm nicht wirklich wie gewünscht.

    File 1,2,3 hat die Zeile bis 3F0

    File 4 hat jedoch nur 3 Zeilen.

    Anbei alle 4 Dateien:
    http://workupload.com/file/8wJAVfzm



  • DirkB schrieb:

    [...] Und der binary-Mode beim fopen wäre noch ganz sinnvoll.


Log in to reply