1

实际上,我不喜欢在 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

它是有线的,额外的字节有什么用?我在这里试试运气。

谢谢你的任何建议。

4

1 回答 1

2

我的猜测是因为文件不是以二进制模式打开的,所以每个换行符(即 0x0A 字节)都被转换为回车+换行序列。我敢打赌,你的浮点数组中恰好有 500 个这样的字节。

尝试像这样打开输出流:

ofstream fs(file, ios_base::binary);
于 2012-03-14T04:39:36.113 回答