Некорректная запись в файл

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2023

У меня программа передающая файл по сети, эта часть отвечает за принятие пакетов и их запись в новосозданный файл. Проблема в том, что вот этот кучок кода работает так, как и нужно (файл создаётся целый), но мне нужно, чтобы запись происходила уже после прихода всех пакетов (этот код упрощённый, в оригинале есть проверка на получение всех пакетов).

        int const buffer_size = 1024;
        char buffer[buffer_size];
        char filename[buffer_size];
        FILE* file;
        file = fopen(filename, "wb");
        int received_size = 0;
    
        while (true) {
            received_size = recvfrom(client_socket, buffer, (buffer_size), 0, (SOCKADDR*)&server, &server_sizeof);
            fwrite(buffer, sizeof(char), received_size, file);
            TCP_sock->send_ok();
        }

Я пробовал такой вариант кода, но по какой-то совершенно непонятной для меня причине, оно не работает и файл создаётся повреждённым.

int const buffer_size = 1024;
char buffer[buffer_size];
char filename[buffer_size];
int received_size = 0;
std::vector<int> size_vec;
std::vector<std::string> string_vec;

while (true) {
    received_size = recvfrom(client_socket, buffer, (buffer_size), 0, (SOCKADDR*)&server, &server_sizeof);
    size_vec.push_back(received_size);
    string_vec.push_back(buffer);
    TCP_sock->send_ok();
}
FILE* file;
file = fopen(filename, "wb");
for (int a = 0; a < string_vec.size(); ++a) {
    std::string temp_str = string_vec[a];
    strcpy(buffer, temp_str.c_str());
    fwrite(buffer, sizeof(char), size_vec[a], file);
}

fwrite со string не работает и с использованием (char*)str.c_str() файл записывается некорректно, но при этом следующий кусок кода работает как надо и файл снова создаётся целым.

int const buffer_size = 1024;
char buffer[buffer_size];
char filename[buffer_size];
FILE* file;
file = fopen(filename, "wb");

int received_size = 0;
std::string full_file;

while (true) {
    received_size = recvfrom(client_socket, buffer, (buffer_size), 0, (SOCKADDR*)&server, &server_sizeof);
    full_file = buffer;
    strcpy(buffer, full_file.c_str());
    fwrite(buffer, sizeof(char), received_size, file);
    TCP_sock->send_ok();
}

При использовании ofstream вообще не работает.

Кто-нибудь подскажет, как поправить код так, чтобы файл создавался целым и уже после приёма всех пакетов?

Ответы

▲ 0

Данный кусок кода работает ровно так, как я и хотел. Спасибо @user7860670 за решение вопроса.

int const buffer_size = 1024;
char buffer[buffer_size];
char filename[buffer_size];
int received_size = 0;
std::vector<char> buffer_vec;
while (true) {
        received_size = recvfrom(client_socket, buffer, (buffer_size), 0, (SOCKADDR*)&server, &server_sizeof);
        for (int a = 0; a < received_size; ++a) {
            buffer_vec.push_back(buffer[a]);
        }
        TCP_sock->send_ok();
}
FILE* file;
file = fopen(filename, "wb");
fwrite(buffer_vec.data(), sizeof(char), buffer_vec.size(), file);
fclose(file);