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;
}

 

posted @   C羽言  阅读(207)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示