Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从/到文件的读写双精度_C++_C - Fatal编程技术网

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