#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);
}
想实现的功能是从txt文件中读取1000个数据到data数组中,用scanf函数VS软件会报安全性不高 建议用sscanf_s,因此猜测23行调用sscanf_s有问题,那么怎么修改来实现这个功能呢?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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无用
悬赏问题
- ¥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如何向数据库中添加自动生成的字段数据。