我正在尝试将一个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;
}
答案 0 :(得分:5)
您没有正确地将地址传递给缓冲区。
(char *)(&buffer)
告诉编译器取buffer
的地址,而不是使用buffer
中包含的指针指向分配了new的内存。要获取缓冲区本身的地址,请将其更改为以下内容。
(char *)(buffer)
答案 1 :(得分:5)
Obvlious船长在诊断您的问题时是正确的,但是,这里确实有一些可能的修复。
你可以像他建议并使用(char *)(buffer)
那样做,但我不同意这种风格。
首先,它使用C风格的强制转换,在C ++代码中应该避免使用。这会使稍微改进的版本为reinterpret_cast<char *>(buffer)
。这样可以确保您不会执行任何愚蠢的操作,例如删除const
。
然而,我觉得你可以做得稍微好一些。在某些时候,您可能会认为普通数组不适合您。也许您想要更改为C ++ 11 std::array
或std::vector
。突然间你的代码无效了。普通的C风格数组是我最常更改的数据类型。因此,您可能需要考虑更像reinterpret_cast<char *>(& buffer[0])
的内容。
另请注意,您的代码不可移植。 int
在内存中的布局方式是实现定义的。查看Detecting endianness programmatically in a C++ program