C ++编写int缓冲区

时间:2012-06-22 15:57:03

标签: c++ buffer

我正在尝试将一个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;
}

2 个答案:

答案 0 :(得分:5)

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

(char *)(&buffer)

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

(char *)(buffer)

答案 1 :(得分:5)

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

你可以像他建议并使用(char *)(buffer)那样做,但我不同意这种风格。

首先,它使用C风格的强制转换,在C ++代码中应该避免使用。这会使稍微改进的版本为reinterpret_cast<char *>(buffer)。这样可以确保您不会执行任何愚蠢的操作,例如删除const

然而,我觉得你可以做得稍微好一些。在某些时候,您可能会认为普通数组不适合您。也许您想要更改为C ++ 11 std::arraystd::vector。突然间你的代码无效了。普通的C风格数组是我最常更改的数据类型。因此,您可能需要考虑更像reinterpret_cast<char *>(& buffer[0])的内容。

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

等答案