C++
读取股票即时数据比MFC或QT读取即时数据要稍显麻烦,C++没有封装现成的网络通信库,需借助第三方工具。本例使用C
++ libcurl库,这个库的具体安装方法可度娘
开发工具使用的VS2017,用2019不习惯改回来了。新建一个C++控制台的空项目,名称自取,然后复制以下源文件到空项目的.cpp文件,整理好代码,编译即可:
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
#pragma comment(lib, "libcurl.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
using namespace std;
// callback function for curl
static size_t downloadCallback(void *buffer, size_t sz, size_t nmemb, void *writer)
{
string* psResponse = (string*)writer;
size_t size = sz * nmemb;
psResponse->append((char*)buffer, size);
return sz * nmemb;
}
string getCurrnetData(string code)
{
if (code.substr(0, 1) == "6")
code = "sh" + code;
else if (code.substr(0, 1) == "0" || code.substr(0, 1) == "3")
code = "sz" + code;
string strRet;
CURL *curl;
CURLcode res;
curl = curl_easy_init(); //初始化curl指针,返回一个easy_handle(curl*对象)
if (curl)
{
string reply;
string strcode = "http://qt.gtimg.cn/q=";
strcode = strcode.append(code);
//描述: 这个函数最重要了.几乎所有的curl 程序都要频繁地使用它.
//它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.
//(这个函数有些像ioctl函数)参数:
//1 CURL类型的指针
//2 各种CURLoption类型的选项.(都在curl.h库里有定义, man 也可以查看到)
//3 parameter 这个参数 既可以是个函数的指针, 也可以是某个对象的指针,
//也可以是个long型的变量.它用什么这取决于第二个参数.
//CURLoption 这个参数的取值很多.具体的可以查看man手册.
curl_easy_setopt(curl, CURLOPT_URL, strcode.c_str());
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, downloadCallback); // set callback function
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &reply);
//描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用.
//就像字面的意思所说perform就像是个舞台.让我们设置的option 运作起来.
//参数: CURL类型的指针.
res = curl_easy_perform(curl);
//描述: 这个调用用来结束一个会话.与curl_easy_init配合着用.
//参数: CURL类型的指针.
curl_easy_cleanup(curl);
/*描述:这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它将由libcurl库自动调用,
所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,
所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
参数:flags
CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化
*/
curl_global_init(CURL_GLOBAL_ALL);
if (res != CURLE_OK)
cout << "error" << endl;
else strRet = reply;
}
return strRet;
}
//字符分割
std::vector
{
char * strc = new char[strlen(str.c_str()) + 1];
strcpy(strc, str.c_str());
std::vector
char* tmpStr = strtok(strc, pattern.c_str());
while (tmpStr != NULL)
{
resultVec.push_back(std::string(tmpStr));
tmpStr = strtok(NULL, pattern.c_str());
}
delete[] strc;
return resultVec;
}
int main()
{
string codeArray[10] = { "600519", "000858", "300011", "600536", "000423",
"002093", "300255", "000333", "600030", "688981" };
vector
for (int i = 0; i < 10; i++)
{
string result = getCurrnetData(codeArray[i]);
vector
allData.push_back(data);
}
//输出10只个股的即时数据(节选)
cout << "代码\t名称\t\t涨幅\t现价\t开盘价\t成交量" << endl;
for (int i = 0; i < allData.size(); i++)
{
cout << allData[i][2]<< "\t" //代码
<< allData[i][1] << "\t" //名称
<< allData[i][31] << "\t" //涨跌幅
<< allData[i][3] << "\t" //当前价
<< allData[i][5] << "\t" //开盘价
<< allData[i][6] << "\t" << endl; //成交量
}
return 0;
}
代码共几十行,(注释来自于网络便于理解),主要由libcurl库实现网络通讯,然后在腾讯股票接口读取即时数据,(度娘有详细接口介绍文章,本处不述。)数据处理后再显示输出。读取的即时数据项很多,只节选了几个展示,本例是读取了10只个股的数据并显示。
显示结果如下图,为2022年3月4日收盘后数据。
即时数据