Utilisation du fichier i / o pour lire la longueur en octets

J’essaie de trouver la longueur en octets de deux fichiers différents avec le code suivant, mais la longueur en 1, ce qui est évidemment faux. À long terme, j’essaie de comparer les positions de mémoire de chaque fichier et d’imprimer où elles diffèrent, comme vous le verrez. Je n’allais donc nulle part et j’ai fait des déclarations printf pour voir où le problème pouvait se poser. Par conséquent, il semble que ma longueur ne calcule pas correctement.

Note latérale qui peut aider avec mon problème – j’ai trouvé ceci pour memcmp, mais cela signifie-t-il que je ne peux pas utiliser != ?:

Si la valeur renvoyée est <0, cela signifie que str1 est inférieur à str2.

Si la valeur retournée si> 0 alors cela indique que str2 est inférieur à str1

Si la valeur retournée si = 0 alors cela indique que str1 est égal à str2

Aidez-moi, s’il vous plaît!

  void compare_two_binary_files(int f1, int f2) { ssize_t byte_read_f1, byte_read_f2, length, numRead, bob, length2; char buf1[BUF_SIZE], buf2[BUF_SIZE], a[100], b[100], counter[100]; int count = 0, b_pos1, b_pos2; while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && (byte_read_f2 = read(f2, buf2, sizeof buf2) >0)) { length = byte_read_f1; length2 = byte_read_f2; printf("F1 byte length:%o\n", length); printf("F2 byte length:%o\n", length2); ssize_t len = byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2; b_pos1 = memcmp(buf1, buf2, len); printf("Memcmp: %d\n", b_pos1); if (memcmp(buf1, buf2, len) != 0){ // use memcmp for speed ssize_t i; for (i = 0; i<len; i++){ if (buf1[i] != buf2[i]) break; } } 

    > a une priorité plus élevée que = , donc

     if ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && ...) 

    est équivalent à

     if (byte_read_f1 = (read(f1, buf1, sizeof buf1) > 0) && ...) 

    qui atsortingbue 1 à byte_read_f1 si au moins un octet a été lu.

    Ce que tu veux c’est

     if ((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0 && ...) 

    Si votre programme lit à partir de fichiers autres que les fichiers normaux (tels que les entrées standard), vous devez également prendre en compte le cas où read () renvoie moins d’octets que demandé.

    Pour les fichiers normaux, read () renvoie toujours le nombre d’octets demandés, avec la seule exception à la fin du fichier bien sûr. Par conséquent, si la longueur des fichiers est différente, alors à un moment donné, read(f1, ...) renverra un montant différent de read(f2, ...) , ou l’un renverra zéro et l’autre non.

    Je pense qu’il y a une erreur dans la condition while:

     while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && (byte_read_f2 = read(f2, buf2, sizeof buf2) >0)) 

    où vous affectez read(f1, buf1, sizeof buf1) > 0 (le résultat est vrai = 1) à byte_read_f1 et ainsi à byte_read_f2 .

    Est-ce que cela peut vous aider?

    Mettre à jour

    Comment les commentaires suggèrent:

    Le bon formulaire sera:

     while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) && ((byte_read_f2 = read(f2, buf2, sizeof buf2)) >0)) 

    Que diriez-vous de fseek () ‘aller à la fin de chaque fichier et interroger le décalage de position du fichier? L’appel fstat () ou quelque chose du genre pourrait même vous dire directement la taille.