C++编写int缓冲区

p.m*_*aes 1 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;
}
Run Code Online (Sandbox Code Playgroud)

Cap*_*ous 5

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

(char *)(&buffer)
Run Code Online (Sandbox Code Playgroud)

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

(char *)(buffer)
Run Code Online (Sandbox Code Playgroud)


Dav*_*one 5

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

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

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

但是,我觉得你可以做得稍好一些.在某些时候,您可能会认为普通数组不适合您.也许你想改成C++ 11 std::array,或者std::vector.突然间你的代码无效了.普通的C风格数组是我最常更改的数据类型.出于这个原因,您可能想要考虑看起来更像的东西reinterpret_cast<char *>(& buffer[0]).

另请注意,您的代码不可移植.int在内存中布局的方式是实现定义的.查看诸如在C++程序中以编程方式检测字节顺序的答案