小mi粥的米 2024-08-30 17:54 采纳率: 62.5%
浏览 10
已结题

想实现的功能是从txt文件中读取1000个数据到data数组中,用scanf函数VS软件会报安全性不高 建议用sscanf_s,因此猜测23行调用sscanf_s有问题,那么怎么修改来实现这个功能呢?

#define MAX_SIZE 1000
double data[MAX_SIZE];
int count = 1;                    
FILE* fp;
fp = fopen("D:\\Code01\\Project2\\Project2\\data.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件\n");
        //exit(0);
        return 1;
    }
fseek(fp, 0, SEEK_END);  //指向文件尾, 0指后移0个字节
long buffer_size = ftell(fp);
fseek(fp, 0, SEEK_SET); // 必需把文件指针再指到文件头,不然肯定读不出东西了
// 动态分配缓冲区内存
char* buffer = (char*)malloc(buffer_size * sizeof(char));
if (buffer == NULL) {
    printf("缓存分配失败\n");
    fclose(fp);
    return 1;
}
 while (count < MAX_SIZE && !feof(fp)) {  
    if (fgets(buffer, buffer_size, fp) != NULL) {    
        if (sscanf_s(buffer, "%lf", &data[count]) == 1) { 
            count++; 
            for (int i = 0; i < buffer_size; i++) {
                printf("%c", buffer[i]); 
            }
        }
        else {
            printf("读取失败\n");
        }
        // 根据需要调整buffer_size以适应读取的行长度 
        buffer_size = (long)strlen(buffer) + 1;  // 增加1是为了包含换行符,来跳过已读的数据和空格
    }
    else {
        printf("读取失败\n");
    }
                //打印data
    int length_data = sizeof(data) / sizeof(data[0]);  
    for (int i = 0; i < length_data; i++) {
        printf("%lf", data[i]);
    }
// 释放动态分配的内存
free(buffer);
 
if (fp == NULL) {
 
    fclose(fp);
}
  • 写回答

2条回答 默认 最新

  • qzjhjxj 2024-09-02 20:53
    关注

    这样写,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define ARR_SIZE  1800
    #define CH_SIZE   32
    int main()
    {
        double data[ARR_SIZE] = {0};
        int  dig[ARR_SIZE] = { 0 };   //小数位数数组
        int count = 0, n = 0;
        FILE* fp;
        fp = fopen("D:\\data.txt", "r"); //fopen("D:\\Code01\\Project2\\Project2\\data.txt", "r");
        if (!fp) {
            printf("File open fail!\n");
            return 1;
        }
        char* buffer = (char*)malloc(CH_SIZE * sizeof(char));
        memset(buffer, 0, CH_SIZE * sizeof(char));
        while (1) {
            if (fscanf(fp, "%s", buffer) == 1) {
                if (sscanf_s(buffer, "%lf", &data[count], CH_SIZE) == 1) {
                    char* ptr = strchr(buffer, 'e');
                    if (ptr) { // 如果是科学计数法,小数位计算
                        ptr++;
                        sscanf_s(ptr, "%d", &n);
                        if (*ptr == '-')
                            n += 4;
                        else
                            n += 3;
                    }
                    else
                        n = 0;
                    dig[count] = strlen(buffer) - 2 - n;
                    if (dig[count] <= 0)  dig[count] = 1;// 如果是 1 位或 2 位的整数,输出 1 位小数位
                    //printf("%.*f\n", dig[count] , data[count]);
                    count++;
                }
                memset(buffer, 0, CH_SIZE * sizeof(char));
            }
            else 
                break;
        }
        fclose(fp);
        free(buffer);
        for (int i = 0; i < count; i++) 
            printf("%.*f ", dig[i], data[i]);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月11日
  • 已采纳回答 9月3日
  • 修改了问题 8月30日
  • 修改了问题 8月30日
  • 展开全部

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。