ОБНОВЛЕНИЕ: Если кто-то читает это и сталкивается с подобной проблемой, похоже, что проблема заключалась в том, что я преобразовал double в int. Там, где я думал, что, например, 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
Что правильно, это то, чем О должен быть.
Вторая функция затем должна типизировать и записать отдельные значения матрицы в файл, где каждое значение занимает пространство 8 бит / 1 байт. Когда я использую шестнадцатеричный редактор и смотрю на файл, он выглядит так (в шестнадцатеричном формате):
0x31 0x32 0x33 0x33 0x35 0x35 0x03 0x03 0x03
В 8-разрядном целочисленном формате со знаком (то есть, как O отображается с помощью displaymatrixO), это выглядит так:
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]. Я смотрел на код снова и снова, и я не могу понять, где я иду не так! Помогите, если сможете ...