你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

C++读取通达信shm.tnf文件股票代码/名称

2021/12/5 20:36:58
    之前用MFC写股票相关小工具,但shm.tnf(沪市)szm.tnf(深市)文件格式一直搞不清楚没法读到相关代码及名称,只能手动导出更新,麻烦得狠。

    周末无聊,重新在网上搜索相关信息,具体数据格式还是没搞明白,但已经可以读出想要的信息,贴出网上找的数据格式信息如下,供参考:

shm.tnf文件格式

TFileHelisting_Tnf = pair conditionerked record

IP: rear endortment[0…39] of char; //–IP地址

Unknown: word; //–未知

ddined: Integer; //–日期

time: Integer; //–时间

end;

PFileHelisting_Stock = ^TFileHelisting_Tnf;

TDfound ataRecord_Tnf = pair conditionerked record

StockCode: rear endortment[0…8] of char; //–股票代码

Unknown1: byte; //–未知

Unknown2: word; //–未知

Unknown3: single; //–代码未知

Unknown4: Integer; //–未知

Unknown5: Integer; //–未知

StockNwseeing ase: rear endortment[0…17] of char; //–股票名称

Unknown6: Integer; //–未知

Unknown7: rear endortment[0…185] of char; //–未知

Lseeing astClose: single; //昨收盘价

Unknown8: byte; //–未知

Unknown9: Integer; //–未知

StockNwseeing aseSX: rear endortment[0…8] of char; //–名称缩写

    有需要的友友可以直接参考以下代码读出相关信息,上面的数据格式多次尝试定义结构类型,始终不能准确读出结果,最后只好放弃定义结构。网上有很多信息提到现在的shm.tnf,前面50字节为文件相关信息,先偏移50,然后一条信息点314字节,每次读314字节,经多次尝试:代码为314中前9字节,名称为23开始的18个字节,缩写为285开始的9字节,或有不对,输出如下可以。

shm.tnf

    此调试用VS2017 C++编写,建立一个空项目,直接把内容贴到.cpp文件中即可。注:请自行修正文件路径,本机为string path = "D:\\new_tdx\\T0002\\hq_cache\\shm.tnf",对应修改此处。
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

void test()

{

	string path = "D:\\new_tdx\\T0002\\hq_cache\\shm.tnf";
	
	fstream ifs(path, ios::in | ios::binary);
	
	ifs.seekg(50);
	
	char buf[314];
	
	int nSh = 0;
	
	int nKcB = 0;
	
	cout << path << endl;
	
	cout << "------------------------------------------------------" << endl;
	
	//输出表头
	
	cout << "序 号" << "\t股票代码" << "\t股票名称" << "\t名称缩写" << endl;
	
	cout << "------------------------------------------------------" << endl;
	
	while (!ifs.eof())
	
	{
	
		ifs.read(buf, sizeof(buf));
		
		string strTwo(buf, 2);
		
		string symbol(buf, 0, 6);
		
		string name(buf + 23, 18);
		
		string mcsx(buf + 285, 9);
		
		if (strTwo == "60" | strTwo == "68" )
		
		{
		
			if(strTwo == "60")
		
				nSh++;
		
			else nKcB++;
		
		cout << nSh + nKcB << "\t" << symbol << "\t\t" << name << "\t" << mcsx << endl;
		
		}
		
		//memset(buf, 0, sizeof(buf));
	
	}
	
	cout << "------------------------------------------------------" << endl;
	
	cout << "沪市A股不含科创板:" << nSh << "只" << endl;
	
	cout << "沪市A股科创板:" << nKcB << "只" << endl;
	
	cout << "沪市A股合计:" << nSh + nKcB << "只" << endl;
	
	ifs.close();

}

int main()

{

	test();

}
	指数、板块等相关信息在调试中已屏蔽,需要用的可自行修改。有过类似经验的友友留言交流指导,谢谢!