C语言读取通达信数据
因为无法事先知道数据的行数,只能通过计算得到,所以数组创建只能通过动态分配内存。
如果只想读取最后1000行,那么数组就可以直接定义大小为1000,然后把文件指针定位到倒数1000行。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
struct Stock {
int32_t date;
int32_t open;
int32_t high;
int32_t low;
int32_t close;
float amount;
int32_t volume;
int32_t pdc;
};
int main() {
FILE *fp = fopen("sz000001.day", "rb");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fseek(fp, 0, SEEK_END); // 定位文件末尾
size_t file_size = ftell(fp); // 获取文件大小
size_t line_count = file_size / 32; // 计算行数(假设每行32字节)
fseek(fp, 0, SEEK_SET); // 回到文件开头
// 动态分配内存
struct Stock *tdx_day = malloc(line_count * sizeof(struct Stock));
if (tdx_day == NULL) {
perror("Error allocating memory");
return -1;
}
// 读取数据
fread(tdx_day, sizeof(struct Stock), line_count, fp);
// 打印读取到的数据
for (size_t i = 0; i < line_count; i++) {
printf("Date: %d\n", tdx_day[i].date);
printf("Open: %d\n", tdx_day[i].open);
printf("High: %d\n", tdx_day[i].high);
printf("Low: %d\n", tdx_day[i].low);
printf("Close: %d\n", tdx_day[i].close);
printf("Amount: %f\n", tdx_day[i].amount);
printf("Volume: %d\n", tdx_day[i].volume);
printf("Previous Day Close: %d\n", tdx_day[i].pdc);
printf("\n");
}
free(tdx_day);
fclose(fp);
return 0;
}
在应用前还要对数据进行处理,开、高、低、收、上日收盘,都要除以100才是最终的数据。
因为要修改数据,所以干脆分行读取
#include <stdio.h>
#include <stdlib.h>
struct Stock {
int date;
float open;
float high;
float low;
float close;
float amount;
int volume;
int reserved;
};
int main() {
FILE *fp = fopen("sz000001.day", "rb");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fseek(fp, 0, SEEK_END); // 定位文件末尾
long file_size = ftell(fp); // 获取文件大小
int line_count = file_size / 32; // 计算行数(假设每行32字节)
fseek(fp, 0, SEEK_SET); // 回到文件开头
// 动态分配内存
struct Stock *stockArr = malloc(line_count * sizeof(struct Stock));
if (stockArr == NULL) {
perror("Error allocating memory");
return -1;
}
int date, open, high, low, close, volume, reserved;
float amount;
int i = 0;
for (int i = 0; i < line_count; i++) {
// 读取数据
fread(&date, 4, 1, fp);
fread(&open, 4, 1, fp);
fread(&high, 4, 1, fp);
fread(&low, 4, 1, fp);
fread(&close, 4, 1, fp);
fread(&amount, 4, 1, fp);
fread(&volume, 4, 1, fp);
fread(&reserved, 4, 1, fp);
// printf("Date: %d, Open: %d, High: %d, Low: %d, Close: %d, Amount: %f, Volume: %d, Reserved: %d\n", date, open, high, low, close, amount,
// volume, reserved);
stockArr[i].date = date;
stockArr[i].open = open / 100.0;
stockArr[i].high = high / 100.0;
stockArr[i].low = low / 100.0;
stockArr[i].close = close / 100.0;
stockArr[i].amount = amount / 10000.0;
stockArr[i].volume = volume;
stockArr[i].reserved = reserved;
// printf("Date: %d, Open: %.2f, High: %.2f, Low: %.2f, Close: %.2f, Amount: %.2f, Volume: %d, Reserved: %d\n", stockArr[i].date,
// stockArr[i].open, stockArr[i].high, stockArr[i].low, stockArr[i].close, stockArr[i].amount, stockArr[i].volume, stockArr[i].reserved);
}
printf("%d", stockArr[line_count-1].date);
free(stockArr); // 释放动态分配的内存
fclose(fp); // 释放文件
return 0;
}
当然一次性读取到内存后再修改,速度会快上不少,根据需求自己决定。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
struct Tdx_day {
int32_t date;
int32_t open;
int32_t high;
int32_t low;
int32_t close;
float amount;
int32_t volume;
int32_t reserved;
};
struct Stock_day {
int32_t date;
float open;
float high;
float low;
float close;
float amount;
float volume;
int32_t reserved;
};
int main() {
FILE *fp = fopen("sz000001.day", "rb");
if (fp == NULL) {
perror("Error opening file");
fclose(fp);
return -1;
}
fseek(fp, 0, SEEK_END); // 定位文件末尾
size_t file_size = ftell(fp); // 获取文件大小
size_t line_count = file_size / 32; // 计算行数(假设每行32字节)
fseek(fp, 0, SEEK_SET); // 回到文件开头
// 动态分配内存
struct Tdx_day *tdx_day = malloc(file_size);
if (tdx_day == NULL) {
perror("Error allocating memory");
return -1;
}
struct Stock_day *stock_day = malloc(file_size);
if (stock_day == NULL) {
perror("Error allocating memory");
return -1;
}
// 读取数据
fread(tdx_day, sizeof(struct Tdx_day), line_count, fp);
// 打印读取到的数据
for (size_t i = 0; i < line_count; i++) {
stock_day[i].date = tdx_day[i].date;
stock_day[i].open = tdx_day[i].open / 100.0;
stock_day[i].high = tdx_day[i].high / 100.0;
stock_day[i].low = tdx_day[i].low / 100.0;
stock_day[i].close = tdx_day[i].close / 100.0;
stock_day[i].amount = tdx_day[i].amount / 10000.0; // 单位为万
stock_day[i].volume = tdx_day[i].volume / 100.0; // 单位为手
stock_day[i].reserved = tdx_day[i].reserved;
// printf("Date: %d\n", stock_day[i].date);
// printf("Open: %.2f\n", stock_day[i].open);
// printf("High: %.2f\n", stock_day[i].high);
// printf("Low: %.2f\n", stock_day[i].low);
// printf("Close: %.2f\n", stock_day[i].close);
// printf("Amount: %.2f\n", stock_day[i].amount);
// printf("Volume: %.2f\n", stock_day[i].volume);
// printf("Reserved: %d\n", stock_day[i].reserved);
// printf("\n");
}
struct Stock_day last = stock_day[line_count - 1];
printf("Date: %d\n", last.date);
printf("Open: %.2f\n", last.open);
printf("High: %.2f\n", last.high);
printf("Low: %.2f\n", last.low);
printf("Close: %.2f\n", last.close);
printf("Amount: %.2f\n", last.amount);
printf("Volume: %.2f\n", last.volume);
printf("Reserved: %d\n", last.reserved);
fclose(fp);
free(tdx_day);
free(stock_day);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步