// 如果认准一个目标,那么就遇事要忍,出手要狠,善后要稳
//希冀一旦产生,除了实现它,别无他法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <io.h>
#include <direct.h>
const char *to_search="*.day"; //欲查找的文件,支持通配符
union data{
int n;
char ch;
float m;
};
int convertday(char *fname)
{
FILE *fp,*fpw;
char str[400];
char fw[40];
int nLen;
int cType =0 ; // 0 上海或深圳股票,1 上海或深圳基金,2 港股或期货等
union data dNum[8];
// char c[4];
nLen = strlen(fname);
strncpy(fw,fname,nLen-4);
fw[nLen-4]='\0';
// 用strstr函数判断股票基金等类型
// 函数名: strstr
// 功 能: 在串中查找指定字符串的第一次出现
// 用 法: char *strstr(char *str1, char *str2);
// 说明:返回指向第一次出现str2位置的指针,如果没找到则返回NULL。
if(strstr(fw,"sz1")) // 深圳基金
cType = 1 ;
if(strstr(fw,"sh9")) // 上证B股
cType = 1 ;
if(strstr(fw,"sh20")) // 上证债券 ,逆回购 GCxxx
cType = 1 ;
if(strstr(fw,"sh5")) // 上证基金
cType = 1 ;
if(strstr(fw,"#")) // 期货或港股等
cType = 2 ;
// printf("fname = %s\n",fname);
if( (fp=fopen(fname,"rb")) == NULL )
{ //以二进制方式打开
printf("Fail to open file %s!",fname);
exit(0);
}
strcat(fw,".csv\0");
// printf("fw = %s\n",fw);
// fpw = fopen(fw,"wb+");
if( (fpw=fopen(fw,"wb+")) == NULL )
{ //以二进制方式打开
printf("Fail to open file %s!",fw);
exit(0);
}
while(!feof(fp))
{
nLen = fread(dNum, sizeof(union data), 8, fp);
if(nLen<8) break;
// printf("len=%d\n",nLen);
// dnum[0] //日期,整数类型
// dnum[1] //开盘价,对于sh 或sz 是整数型/100,基金、债券/1000, 对于ds 是浮点数
// dnum[2] //最高价,对于sh 或sz 是整数型/100,基金、债券/1000, 对于ds 是浮点数
// dnum[3] //最低价,对于sh 或sz 是整数型/100,基金、债券/1000, 对于ds 是浮点数
// dnum[4] //收盘价,对于sh 或sz 是整数型/100,基金、债券/1000, 对于ds 是浮点数
// dnum[5] //成交金额,浮点数
// dnum[6] //成交量,整数型*100
// dnum[7] //保留
switch (cType)
{
case 0: /* constant-expression */
sprintf(str,"%d,%.2f,%.2f,%.2f,%.2f,%.2f,%d\r\n\0",dNum[0].n,dNum[1].n/100.0,dNum[2].n/100.0,dNum[3].n/100.0,dNum[4].n/100.0,dNum[5].m,dNum[6].n) ;
break;
case 1:
sprintf(str,"%d,%.3f,%.3f,%.3f,%.3f,%.2f,%d\r\n\0",dNum[0].n,dNum[1].n/1000.0,dNum[2].n/1000.0,dNum[3].n/1000.0,dNum[4].n/1000.0,dNum[5].m,dNum[6].n) ;
break;
case 2:
sprintf(str,"%d,%.3f,%.3f,%.3f,%.3f,%.2f,%d\r\n\0",dNum[0].n,dNum[1].m,dNum[2].m,dNum[3].m,dNum[4].m,dNum[5].m,dNum[6].n*100) ;
break;
default:
break;
}
// printf("%s len=%d\n",str,strlen(str));
fwrite(str,sizeof(char),strlen(str),fpw);
}
fclose(fp);
fclose(fpw);
return 0;
}
int main()
{
long handle; //用于查找的句柄
//struct _finddata_t
// {
// unsigned attrib;
// time_t time_create;
// time_t time_access;
// time_t time_write;
// _fsize_t size;
// char name[_MAX_FNAME];
// };
struct _finddata_t fileinfo; //文件信息的结构体
// long _findfirst( char *filespec, struct _finddata_t *fileinfo );
// 返回值:
// 如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
// 参数:
// filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
// fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。
// 函数成功后,函数会把找到的文件的信息放入这个结构体中。
handle=_findfirst(to_search,&fileinfo); //第一次查找
if(handle==-1)
{
return -1;
}
printf("正在处理文件 %s\n",fileinfo.name);
convertday(fileinfo.name);
// int _findnext( long handle, struct _finddata_t *fileinfo );
// 返回值:
// 若成功返回0,否则返回-1。
// 参数:
// handle:即由_findfirst函数返回回来的句柄。
// fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,知道找不到其他的为止
{
printf("正在处理文件 %s\n",fileinfo.name);
convertday(fileinfo.name);
// printf("==0==%s\n",fileinfo.name);
}
_findclose(handle); //别忘了关闭句柄
printf("文件处理结束!");
// system("pause");
return 0;
}
通达信day格式文件转换(含港股和基金等)
4星 · 超过85%的资源 需积分: 45 131 浏览量
2019-06-11
07:44:06
上传
评论 10
收藏 8KB ZIP 举报
二粒米
- 粉丝: 92
- 资源: 4