C++ 从/到文件的读写双精度
我试图将双数组写入文件并再次读取它们。下面是我的代码,但我缺少一些东西。这听起来很傻,但我无法理解C++ 从/到文件的读写双精度,c++,c,C++,C,我试图将双数组写入文件并再次读取它们。下面是我的代码,但我缺少一些东西。这听起来很傻,但我无法理解 #include <stdio.h> #include <stdlib.h> int main(){ int i,j,k; int N = 10; double* readIn = new double[N]; double* ref = new double[N]; FILE* ptr1, *ptr2; ptr1 = fopen("outp
#include <stdio.h>
#include <stdlib.h>
int main(){
int i,j,k;
int N = 10;
double* readIn = new double[N];
double* ref = new double[N];
FILE* ptr1, *ptr2;
ptr1 = fopen("output.txt","w");
//write out
for (i = 0; i < N;i++){
ref[i] = (double)i;
fprintf(ptr1,"%g\n",(double)i);
}
fclose(ptr1);
//read file
ptr2 = fopen("output.txt","r+");
//read in
for(i = 0;i < N;i++)
fscanf(ptr2, "%g", &readIn[i]);
fclose(ptr2);
for(i = 0;i<N;i++)
if(ref[i] != readIn[i]){
printf("Error: %g %g\n",ref[i], readIn[i]);
}
return 0;
}
#包括
#包括
int main(){
int i,j,k;
int N=10;
双精度*readIn=新双精度[N];
double*ref=新的double[N];
文件*ptr1,*ptr2;
ptr1=fopen(“output.txt”,“w”);
//写出
对于(i=0;i 对于(i=0;i您的fscanf
使用了错误的格式字符串(如果启用了足够的警告,GCC将告诉您)
因此,您的double
中填充了float
值,这当然会导致相当“随机”的错误
如果将“%g”
更改为“%lg”
,它应该可以正常工作(至少在我的Linux机器上是这样)
当然,如果你使用C++流,例如
#include <fstream>
std::ofstream file1;
std::ifstream file2;
file1.open("output.txt");
for (i = 0; i < N;i++){
ref[i] = (double)i;
file1 << (double)i << std::endl;
}
#包括
std::of流文件1;
std::ifstream文件2;
file1.open(“output.txt”);
对于(i=0;i
整个问题本来是可以避免的——如果您将readIn
变量编辑为float
,只要值对该变量有效,就可以在不改变任何其他内容的情况下读取这些值[当然,假设输出也使用cout
而不是printf].您得到了什么输出?问题出在哪里?您希望什么结果不会发生?只是垃圾数据:错误:0 6.95314e-310错误:1 5.26354e-315错误:2 5.30499e-315错误:3 1.19364e-312错误:4 5.34643e-315错误:5.3568e-315错误:6 5.36716e-315错误:7 5.37752e-315错误:8 6.9532e-310错误:9 5.39306e-315你说得对!太棒了!我一直认为%g
对于双精度来说已经足够了。对于printf
所有浮点值都转换为double
,但是对于scanf
,因为它是一个指针,代码需要知道double
和float
之间的区别,并且嘿,选择将float
设为默认值,并将l
作为double
的前缀。别问我为什么…@Mats-Peterson是的,最好知道为什么l
a是double的前缀。此外,我建议使用流操作符,而不是scanf/printf和friends。它们太容易出错,所以我发誓由于这类问题,我经常会花费数小时(如果不是数天的话)来追踪“bug”,这些bug实际上只是调试语句中printf在其他完美工作代码中的误用。是的,我试图弄明白“为什么我的结果会很奇怪”的次数太多了,但却发现我打印的格式错误(例如,试图将过去是浮点的内容打印为int,或以其他方式打印)。至少gcc会警告您。。。
file2.open("output.txt");
for(i = 0;i < N;i++)
file2 >> readIn[i];