将站点的源代码保存到vector <string> </string>

时间:2012-05-27 09:42:34

标签: c++ string curl vector

我正在尝试将网站的源代码保存到vector,其中每行源代码都是一个新的vector元素,因为我只需要在程序中使用一个特定的行(编号47)。知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

从URL加载数据。 使用cURL:

std::vector<char> LoadFromUrl(const std::string& url)
{
    struct Content
    {
        std::vector<char> data;

        static size_t Write(char * data, size_t size, size_t nmemb, void * p)
        {
            return static_cast<Content*>(p)->WriteImpl(data, size, nmemb);
        }

        size_t WriteImpl(char* ptr, size_t size, size_t nmemb)
        {
            data.insert(end(data), ptr, ptr + size * nmemb);
            return size * nmemb;
        }
    };

    Content content;

    CURL* curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Content::Write);
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_perform(curl);

    content.data.push_back('\0');

    return content.data;
}

使用strtok或boost tokenizer或您自己的实现对数据进行标记:

std::vector<std::string> LoadLines(const std::string& url)
{
    std::vector<char> content = LoadFromUrl(url);

    std::vector<std::string> lines;
    for(char* token = strtok(&content.front(), "\n");
        token; token = strtok(0, "\n"))
    {
        lines.push_back(std::string(token));
    }
    return lines;
}

int main()
{
    std::vector<std::string> lines = LoadLines(
        "http://stackoverflow.com/questions/10773009/save-sites-source-code-to-vectorstring");

    std::copy(begin(lines), end(lines), std::ostream_iterator<std::string>(std::cout, "\n"));
}