Pergunta

Na verdade, não gosto de trabalhar com o Cygwin.

O problema é que quando uso g++ de 64 bits para compilar o mesmo trecho de código, obtenho resultados diferentes inesperados.

O código fonte é assim:

#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;
}

Estou escrevendo dois números inteiros e um bloco de valores flutuantes em um arquivo binário.Ele imprime quantos bytes foram gravados.

O resultado esperado é:

4
8
160008

Todas as ações foram realizadas no Cygwin.Quando o código foi compilado com g++.exe, o resultado está correto.

Mas quando eu uso x86_64-w64-mingw32-g++.exe (somente pelo qual posso gerar binário de 64 bits), o resultado é conectado.

4
8
160506

Está conectado, para que servem os bytes extras?Estou tentando a minha sorte aqui.

Obrigado por qualquer conselho.

Foi útil?

Solução

Meu palpite é que, como o arquivo não é aberto no modo binário, cada caractere de nova linha (ou seja, byte 0x0A) está sendo convertido em uma sequência de retorno de carro + nova linha.E aposto que existem 500 desses bytes em sua matriz de carros alegóricos.

Tente abrir seu fluxo de saída assim:

ofstream fs(file, ios_base::binary);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top