C语言如何打印文件指针指向的文件内容并以数组形式输出
解决方法
你现有代码中的printf("%f", outfp)是错误用法:
outfp是FILE*类型的文件指针,本质是存储文件内核资源地址的变量,和文件内存储的数值没有直接关系,直接打印指针只会输出内存地址,搭配%f格式符还会触发未定义行为- 你以
"w"模式打开outfp,该模式仅支持写操作,无法直接从该指针读取文件内容
具体实现步骤
有两种实现路径可选:
- 路径1:修改
outfp的打开模式为"w+",支持写入后读取,写入完成后调用rewind(outfp)将文件偏移指针重置到文件开头即可读取 - 路径2:写完
out.dat后先关闭outfp,再重新调用fopen("out.dat", "r")得到可读的文件指针 - 后续读取文件中所有的double值,按数组格式打印即可,需要长期使用数值可以存入动态数组,仅打印的话可以边读边打
修改后的核心代码示例
你只需要替换原有代码中printf("%f", outfp);附近的逻辑即可:
// 原有打开outfp的代码修改为: FILE *outfp= fopen("out.dat", "w+"); // 改w为w+,支持读写 if(outfp == NULL) { printf("Unable to create file\n"); return -1; // 打开失败直接退出,避免后续空指针报错 } // -------------------原有写入outfp的逻辑不变------------------- while(fgets(buffer, bufferLength, fp)) { if (2==sscanf(buffer, "%lf %lf", &a,&b)){ fprintf(outfp, "%0.25f\n", b); } } // -------------------新增读取打印数组逻辑------------------- rewind(outfp); // 把文件指针移到开头 double tmp; int is_first = 1; // 边读边打印,不需要额外存储数据 printf("["); while(fscanf(outfp, "%lf", &tmp) == 1) { if(!is_first) { printf(", "); } is_first = 0; printf("%0.25f", tmp); } printf("]\n"); // -------------------原有后续逻辑不变------------------- printf("File transferred\n"); fclose(outfp); fclose(fp); fclose(fp1); fclose(noisefp); // 其余原有逻辑保留
需要存储数值到数组的版本
如果后续还需要操作这些数值,可以用动态数组存储:
rewind(outfp); int arr_cap = 1024; // 初始数组容量,可按需调整 int arr_len = 0; double* num_arr = (double*)malloc(arr_cap * sizeof(double)); double tmp; // 循环读所有数值存入数组 while(fscanf(outfp, "%lf", &tmp) == 1) { if(arr_len >= arr_cap) { // 数组容量不足时自动扩容 arr_cap *= 2; num_arr = (double*)realloc(num_arr, arr_cap * sizeof(double)); } num_arr[arr_len++] = tmp; } // 打印数组 printf("["); for(int i=0; i<arr_len; i++) { if(i>0) printf(", "); printf("%0.25f", num_arr[i]); } printf("]\n"); // 使用完后释放动态内存 free(num_arr);
内容的提问来源于stack exchange,提问作者Margi
相关产品推荐
相关产品推荐

