Запись массива в код файла не работает (C ++) - PullRequest
0 голосов
/ 14 марта 2012

ОБНОВЛЕНИЕ: Если кто-то читает это и сталкивается с подобной проблемой, похоже, что проблема заключалась в том, что я преобразовал 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]. Я смотрел на код снова и снова, и я не могу понять, где я иду не так! Помогите, если сможете ...

1 Ответ

0 голосов
/ 14 марта 2012

Похоже, что вы храните свои данные как double и округляете их при выполнении этого приведения:

int output_buffer=O[m][n];

Создайте исходное объявление массива int и посмотрите, исчезнет ли проблема.

РЕДАКТИРОВАТЬ: Вот еще немного информации по этому вопросу. www.parashift.com

...