LINUX.ORG.RU

ChatGPT

 , ,


0

1

Write a C code that will read one fragment, one megabyte in size for each file, and calculate the checksum of the read fragments. If the checksum is different, then overwrite the fragment in file 2 with the content from file 1.

Напиши код на си, который будет считывать по одному фрагменту, размером один мегабайт у каждого файла и вычислять контрольную сумму считанных фрагментов. Если контрольная сумма отличается, то перезаписывать фрагмент у файла 2 содержимым из файла 1.

Ответ бота: Here is an example C code that reads one megabyte of data from each file, calculates their checksums, and overwrites the data in the second file if the checksums are different:

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

#define FRAGMENT_SIZE 1048576 // 1 MB in bytes
#define BUFFER_SIZE FRAGMENT_SIZE + 1

int main(int argc, char *argv[]) {
    // Check that the required arguments are provided
    if (argc != 3) {
        printf("Usage: %s file1 file2\n", argv[0]);
        return 1;
    }

    // Open the first file for reading
    FILE *file1 = fopen(argv[1], "r");
    if (!file1) {
        printf("Error opening file %s\n", argv[1]);
        return 1;
    }

    // Open the second file for reading and writing
    FILE *file2 = fopen(argv[2], "r+");
    if (!file2) {
        printf("Error opening file %s\n", argv[2]);
        return 1;
    }

    // Allocate memory for the buffer
    char *buffer1 = malloc(BUFFER_SIZE);
    char *buffer2 = malloc(BUFFER_SIZE);

    // Read one fragment from each file and compare their checksums
    while (!feof(file1) && !feof(file2)) {
        // Read one fragment from each file
        size_t bytes_read1 = fread(buffer1, 1, FRAGMENT_SIZE, file1);
        size_t bytes_read2 = fread(buffer2, 1, FRAGMENT_SIZE, file2);

        // Check if the number of bytes read is different
        if (bytes_read1 != bytes_read2) {
            printf("Error: Different number of bytes read from the files\n");
            return 1;
        }

        // Calculate the checksum of each fragment
        unsigned long checksum1 = 0;
        unsigned long checksum2 = 0;
        for (int i = 0; i < bytes_read1; i++) {
            checksum1 = checksum1 * 31 + buffer1[i];
            checksum2 = checksum2 * 31 + buffer2[i];
        }

        // Compare the checksums
        if (checksum1 != checksum2) {
            // Seek back to the start of the fragment in the second file
            if (fseek(file2, -bytes_read2, SEEK_CUR) != 0) {
                printf("Error seeking in file %s\n", argv[2]);
                return 1;
            }

            // Overwrite the fragment in the second file with the data from the first file
            if (fwrite(buffer1, 1, bytes_read1, file2) != bytes_read1) {
                printf("Error writing to file %s\n", argv[2]);
                return 1;
            }
        }
    }

    // Free the memory used for the buffers
    free(buffer1);
    free(buffer2);

    // Close the files
    fclose(file1);
    fclose(file2);


return 0;

}
This code uses a simple checksum calculation (based on the `djb2` algorithm) to compare the contents of the two files. If the checksums of two consecutive 1 MB fragments are different, the code overwrites the fragment in the second file with the contents from the first file. The code continues to read and compare fragments until the end of both files is reached.

Note: This code is just a simple example and may not be suitable for use in production, as it does not handle errors such as I/O errors or memory allocation failures.


И как вам? Я в программировании полено, по этому скилл оценить не могу, но по моему круто - прога работает и делает ровно то, что я просил.


Это не интеллект, вот если бы он спросил зачем тебе нужен хеш начала файла, и зачем перезаписывать начало файла, что ты курил и не макдак ли ты, плюс еще бы высказался по поводу выбора ЯП, ОС и заподозрил тебя, что ты не хочешь лабы делать, вот это был бы интеллект)

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от rupert

Т.е. настоящий интеллект на вопрос «напиши-ка мне программу» ответит «а не пошёл бы ты на три буквы».

Ну правильно, как натуральные люди на лорчике)

goingUp ★★★★★
()

djb2

Удачи, генерить ключи для хештаблички подёт. Как хеш сумму сравнения, нет (хотя на мегабайте… хз, да неее).

Код обычный, запрос на генерацию плохой, не проси у нейронок сложный код, проси простой и максимально тупой, тебе достаточно было попросить просто сравнить два куска данных и если они не равны перенести данные, тогда бы я уверен сетка сгенерировала надёжный код который тупо сравнивает байтики и всё. Для твоей задачи большего и не надо. Ну или просил бы явно какой то MD5 например если тебе надо проверить некие бинарные данные на коллизии именно поэтому алгоритму.

В одном я уверен студенты лабы теперь затягивать не будут хехехе.

LINUX-ORG-RU ★★★★★
()