1

我正在尝试将一个 int 数组写入 fstream,但是当我调用fstream.write.

我可以使用fstream将 int 数组写入文件吗?

int main(int argc, char * argv[])
{
    fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
    const int total_elements_block = 1024;
    const int buffer_size  = total_elements_block;

    const int total_buffer = 10;

    int * buffer = new int [buffer_size];
    //for (int j=0; j<total_buffer; j++){
        for (int i =0; i<total_elements_block; i++){
            buffer[i] = i;
        }
        amostra.write((char *)(&buffer), total_elements_block*4);
    //}

    amostra.close();
    delete []buffer;

    return 0;
}
4

2 回答 2

5

Obvlious 船长在诊断您的问题时是正确的,但是,这里确实有一些可能的修复方法。

你可以按照他的建议和使用(char *)(buffer),但我不同意这种风格。

首先,它使用 C 风格的强制转换,这在 C++ 代码中应该避免。这将使稍有改进的版本 be reinterpret_cast<char *>(buffer)。这将确保您不会做任何愚蠢的事情,例如 remove const

但是,我觉得你可以做得比这稍微好一点。在某些时候,您可能会认为普通数组不适合您。也许您想更改为 C++11std::arraystd::vector. 突然,您的代码将无法正常工作。普通的 C 样式数组是我最常更改的数据类型。出于这个原因,您可能需要考虑看起来更像reinterpret_cast<char *>(& buffer[0]).

另请注意,您的代码不可移植。anint在内存中的布局方式是实现定义的。查看诸如Detecting endianness programmatically in a C++ program之类的答案

于 2012-06-22T16:22:34.793 回答
5

您没有正确地将地址传递给缓冲区。

(char *)(&buffer)

告诉编译器获取地址,buffer而不是使用包含在bufferwhich 中的指针指向用 new 分配的内存。要获取缓冲区本身的地址,请将其更改为以下内容。

(char *)(buffer)
于 2012-06-22T16:04:43.333 回答