проблема fstream под 64-битным Cygwin - PullRequest
1 голос
/ 14 марта 2012

Мне не нравится работать под Cygwin.

Проблема в том, что когда я использую 64-битный g ++ для компиляции одного и того же куска кода, я получаю неожиданный другой результат.

Исходный код выглядит следующим образом:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int rows = 200;
    int cols = 200;
    float data[rows*cols];
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            data[i*cols+j] = i*cols+j;
        }
    }
    const char *file = "tmp.txt";
    ofstream fs(file);
    if (fs.is_open())
    {
        fs.write((char*)&rows, sizeof(int));
        cout << fs.tellp() << endl;
        fs.write((char*)&cols, sizeof(int));
        cout << fs.tellp() << endl;
        fs.write((char*)data, sizeof(float)*rows*cols);
        cout << fs.tellp() << endl;
        fs.close();
    }
    return 0;
}

Я пишу два целых числа и блок значений с плавающей запятой в двоичный файл.Он печатает, сколько байтов он написал.

Ожидаемый результат:

4
8
160008

Все действия были выполнены под Cygwin.Когда код был скомпилирован с g ++. Exe, результат правильный.

Но когда я использую x86_64-w64-mingw32-g ++. Exe (только с помощью которого можно генерировать 64-битный двоичный файл), результат передается по проводной схеме.

4
8
160506

Проводной, для чего дополнительные байты?Я пытаюсь здесь.

Спасибо за любой совет.

1 Ответ

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

Я предполагаю, что поскольку файл не открывается в двоичном режиме, каждый символ новой строки (т. Е. Байт 0x0A) преобразуется в последовательность возврата каретки + перевода строки.Держу пари, что в вашем массиве с плавающей точкой всего 500 таких байтов.

Попробуйте открыть поток вывода следующим образом:

ofstream fs(file, ios_base::binary);
...