更新:誰かがこれを読んで同様の問題を抱えている場合、問題は double を int に変換した場所にあったようです。たとえば、54 は 54.000... として格納されていると思っていたところ、実際には 53.99999... として格納されていました。int に変更すると、53 になりました。だったコード
int output_buffer=O[m][n];
になる
int output_buffer=O[m][n]+0.5;
「O」と呼ばれる double の 2 次元配列があります。どこ
double O[3][3];
この 2 つの関数をこの正確な順序で続けて使用します。
...
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 の本来の姿です。
2 番目の関数は、行列の個々の値を型キャストして、各値が 8 ビット/1 バイトのスペースを占めるファイルに書き込むことになっています。16 進エディタを使用してファイルを見ると、ファイルは次のようになります (16 進数で):
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] にコピーしているようです。コードを何度も見直しましたが、どこが間違っているのかわかりません。できれば助けて...