【问题标题】:Writing array to file code does not work (C++)将数组写入文件代码不起作用(C++)
【发布时间】:2012-03-13 20:02:46
【问题描述】:

更新:如果有人正在阅读本文并遇到类似问题,那么问题似乎在于我将双精度转换为整数。例如,我认为 54 存储为 54.000...,它实际上存储为 53.99999...,当更改为 int 时,它变成了 53。 我发现解决这个问题的方法是简单地添加 0.5 和代码

int output_buffer=O[m][n];

变成

int output_buffer=O[m][n]+0.5;

我有一个名为“O”的二维双精度数组。在哪里

double O[3][3];

我以这个确切的顺序依次使用这两个函数;

...
displaymatrixO();
writedecrypted();
...

在哪里

int displaymatrixO() 
{   cout << "O is:" << "\n";
    for (int n=0;n<3;n++)
    for (int m=0;m<3;m++)
    {
      cout << O[m][n];
      if (m == 2) cout << "\n";
      else cout << " ";
    }

}

还有

int writedecrypted()
{   for (int n=0;n<3;n++)
    for (int m=0;m<3;m++)
    {
        int output_buffer=O[m][n];
        fputc (output_buffer,opFile);
    }
}

在哪里

FILE *opFile;
opFile=fopen ("decrypted.txt","wb");
...

程序运行时,第一个函数(displaymatrixO)以这种方式将矩阵O输出到屏幕:

O is:
49 50 51
52 53 54
3 3 3

这是正确的,这就是 O 应该是的。

然后,第二个函数应该对矩阵的各个值进行类型转换并将其写入一个文件,其中每个值占用 8 位/ 1 个字节的空间。当我使用十六进制编辑器查看文件时,文件是这样的(十六进制):

0x31 0x32 0x33 0x33 0x35 0x35 0x03 0x03 0x03

在 8 位有符号整数格式中(即如何使用 displaymatrixO 显示 O),如下所示:

49 50 51 51 53 53 3 3 3 

49 50 51
51 53 53
3 3 3 

似乎将 O[2][0] 复制到 O[0][1] 并将 O[1][1] 复制到 O[2][1]。我一遍又一遍地查看代码,我似乎无法弄清楚我哪里出错了!如果可以,请提供帮助...

【问题讨论】:

  • 你可以尝试初始化 int output_buffer=O[m][n];首先使用 int output_buffer = 0?这是我在您的代码中临时看到的唯一可能是内存被重用的地方。
  • 欢迎来到 StackOverflow!您发布的代码没有任何问题(如this program 所示)。问题一定出在您没有发布的代码中。请发布尽可能短的完整程序来演示您所看到的错误。 (有关此调试技术的更多信息,请参阅sscce.org)。
  • 而且,仅供参考:Rob 所描述的内容称为“测试用例”。
  • 其实整个代码还有一个问题,好像写了两次同一个矩阵,但是我还是把代码贴出来,用一个缩短的形式(并删除不存在于最短形式的函数主要的)。它不编译(上传站点),因为我假设该站点没有 MATLAB。无论如何,这里是:ideone.com/jtkK7
  • 这里是输入和输出文件(加密和解密的.txt); ideone.com/xy1mL

标签: c++ arrays file casting writing


【解决方案1】:

看起来您将数据存储为 double,并在执行此转换时向下舍入:

int output_buffer=O[m][n];

使您的原始数组声明 int 并查看问题是否消失。

编辑:以下是有关该主题的更多信息。 www.parashift.com

【讨论】:

  • 是的,实际上这就是创造大量工作的原因。我一直在使用 int ,直到我意识到 int 最多可以存储 256。我对信息所做的计算可以并且确实输出超过 256,因此我需要数组是双精度数。但由于我知道最终输出将是
  • 如果我有完全由整数组成的“双”数据(在数学意义上)并将它们转换为“int”类型,您是说数据会受到任何影响吗?
  • 看来这就是问题的根源所在。我认为 54 存储为 54.000...,它实际上存储为 53.999...,当更改为 int 时,它变成了 53。谢谢
  • 对不起,是的。这正是我想说的。
猜你喜欢
  • 2013-12-20
  • 2017-04-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多