apurv625 Ответов: 1

Не удается отправить много изображений на сервер с помощью vector< T> В C++


Я меняю сигнатуру функции, имеющей аргумент по умолчанию char*, на векторную строку в C++. Роль функции с аргументом по умолчанию char* состоит в том, чтобы извлечь имя изображения файла изображения, затем прочитать этот файл изображения и отправить его на сервер. Эта функция способна отправлять только один файл изображения. Итак, я пошел за векторной "строкой", чтобы отправить несколько изображений сразу. Но где-то я упускаю что-то, чего не могу найти. Пожалуйста помочь.

Что я уже пробовал:

Функция с параметром по умолчанию char*:
void fileSend(char *fpath)
{
    // Extract only filename from given path.
    char filename[50];
    int i = strlen(fpath);
    for (; i > 0; i--)
    {
        if (fpath[i - 1] == '\\')
            break;
    }
    for (int j = 0; i <= (int)strlen(fpath); i++)
    {
        filename[j++] = fpath[i];
    }

    ifstream myFile(fpath, ios::in | ios::binary | ios::ate);
    int size = (int)myFile.tellg();
    myFile.close();

    char filesize[10]; itoa(size, filesize, 10);
    send(sock, filename, strlen(filename), 0);
    char rec[32] = ""; 
    recv(sock, rec, 32, 0);

    send(sock, filesize, strlen(filesize), 0);
    recv(sock, rec, 32, 0);

    FILE *fr = fopen(fpath, "rb");

    while (size > 0)
    {
        char buffer[1030];

        if (size >= 1024)
        {
            fread(buffer, 1024, 1, fr);
            send(sock, buffer, 1024, 0);
            recv(sock, rec, 32, 0);
        }
        else
        {
            fread(buffer, size, 1, fr);
            buffer[size] = '\0';
            send(sock, buffer, size, 0);
            recv(sock, rec, 32, 0);
        }
        size -= 1024;
    }
    fclose(fr);
}

Функция с параметром по умолчанию vector & lt;string>:
void fileSend(vector<string> fnames)
    {
        char *filename;
        for (int k = 0; k < fnames.size(); k++)
        {
            int i = fnames[k].length;

            for (; i > 0; i--)
            {
                if (fnames[k][i - 1] == '\\')
                    break;
            }
            for (int j = 0; i <= fnames[k].length(); i++)
            {
                filename[j++] = fnames[k][i];
            }

            ifstream myFile(fnames[k], ios::in | ios::binary | ios::ate);
            int size = (int)myFile.tellg();
            myFile.close();

            char filesize[10]; itoa(size, filesize, 10);
            send(sock, filename, strlen(filename), 0);
            char rec[32] = "";
            recv(sock, rec, 32, 0);

            send(sock, filesize, strlen(filesize), 0);
            recv(sock, rec, 32, 0);

            FILE *fr = fopen(fnames[k], "rb");

            while (size > 0)
            {
                char buffer[1030];

                if (size >= 1024)
                {
                    fread(buffer, 1024, 1, fr);
                    send(sock, buffer, 1024, 0);
                    recv(sock, rec, 32, 0);
                }
                else
                {
                    fread(buffer, size, 1, fr);
                    buffer[size] = '\0';
                    send(sock, buffer, size, 0);
                    recv(sock, rec, 32, 0);
                }
                size -= 1024;
            }
            fclose(fr);
        }
    }

Richard MacCutchan

Я не могу понять, что должен делать ваш код. Каждая строка в векторе должна содержать имя файла, поэтому все, что вам нужно, - это цикл для извлечения каждого имени файла и передачи его функции, которая отправляет его на сервер.

1 Ответов

Рейтинг:
0

CPallini

Самый простой способ сделать это-перегрузить старую функцию (и вызвать ее):

void fileSend(vector<string> fnames)
{
   for (int k = 0; k < fnames.size(); k++)
   {
      fileSend( fnames[k].c_str()); // call the original function
   }
}